]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ksm rcu fix
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 16 Mar 2021 19:59:44 +0000 (15:59 -0400)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 16 Mar 2021 19:59:44 +0000 (15:59 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
mm/ksm.c

index 673c7a0835d823a5aa645772a233381695afdb66..847378558b8517e17e7b94ea39891ff73af21ada 100644 (file)
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -980,6 +980,7 @@ static int unmerge_and_remove_all_rmap_items(void)
 
                mm = mm_slot->mm;
                mmap_read_lock(mm);
+               rcu_read_lock();
                mas_for_each(&mas, vma, ULONG_MAX) {
                        if (ksm_test_exit(mm))
                                break;
@@ -992,6 +993,7 @@ static int unmerge_and_remove_all_rmap_items(void)
                }
 
                remove_trailing_rmap_items(mm_slot, &mm_slot->rmap_list);
+               rcu_read_unlock();
                mmap_read_unlock(mm);
 
                spin_lock(&ksm_mmlist_lock);
@@ -1015,6 +1017,7 @@ static int unmerge_and_remove_all_rmap_items(void)
        return 0;
 
 error:
+       rcu_read_unlock();
        mmap_read_unlock(mm);
        spin_lock(&ksm_mmlist_lock);
        ksm_scan.mm_slot = &ksm_mm_head;
@@ -2292,6 +2295,7 @@ next_mm:
        mas.tree = &mm->mm_mt;
 
        mmap_read_lock(mm);
+       rcu_read_lock();
        if (ksm_test_exit(mm))
                goto no_vmas;
 
@@ -2324,6 +2328,7 @@ next_mm:
                                        ksm_scan.address += PAGE_SIZE;
                                } else
                                        put_page(*page);
+                               rcu_read_unlock();
                                mmap_read_unlock(mm);
                                return rmap_item;
                        }
@@ -2363,9 +2368,11 @@ no_vmas:
 
                free_mm_slot(slot);
                clear_bit(MMF_VM_MERGEABLE, &mm->flags);
+               rcu_read_unlock();
                mmap_read_unlock(mm);
                mmdrop(mm);
        } else {
+               rcu_read_unlock();
                mmap_read_unlock(mm);
                /*
                 * mmap_read_unlock(mm) first because after