]> www.infradead.org Git - users/willy/linux.git/commitdiff
kernel/sched/fair: Use maple tree iterators instead of linked list
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Mon, 4 Jan 2021 19:54:07 +0000 (14:54 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Wed, 20 Oct 2021 20:00:34 +0000 (16:00 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
kernel/sched/fair.c

index ff69f245b939595ab914c70c1f7fa01c1843778a..46769907c3634e9437e1c51db4803fbea5bc2ca2 100644 (file)
@@ -2720,6 +2720,7 @@ static void task_numa_work(struct callback_head *work)
        unsigned long start, end;
        unsigned long nr_pte_updates = 0;
        long pages, virtpages;
+       MA_STATE(mas, &mm->mm_mt, 0, 0);
 
        SCHED_WARN_ON(p != container_of(work, struct task_struct, numa_work));
 
@@ -2772,13 +2773,17 @@ static void task_numa_work(struct callback_head *work)
 
        if (!mmap_read_trylock(mm))
                return;
-       vma = find_vma(mm, start);
+
+       rcu_read_lock();
+       mas_set(&mas, start);
+       vma = mas_find(&mas, ULONG_MAX);
        if (!vma) {
                reset_ptenuma_scan(p);
                start = 0;
-               vma = mm->mmap;
+               mas_set(&mas, start);
        }
-       for (; vma; vma = vma->vm_next) {
+
+       mas_for_each(&mas, vma, ULONG_MAX) {
                if (!vma_migratable(vma) || !vma_policy_mof(vma) ||
                        is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_MIXEDMAP)) {
                        continue;
@@ -2823,7 +2828,9 @@ static void task_numa_work(struct callback_head *work)
                        if (pages <= 0 || virtpages <= 0)
                                goto out;
 
+                       rcu_read_unlock();
                        cond_resched();
+                       rcu_read_lock();
                } while (end != vma->vm_end);
        }
 
@@ -2838,6 +2845,7 @@ out:
                mm->numa_scan_offset = start;
        else
                reset_ptenuma_scan(p);
+       rcu_read_unlock();
        mmap_read_unlock(mm);
 
        /*