On 12/1/21 15:30, Liam Howlett wrote: > From: "Liam R. Howlett" <Liam.Howlett@xxxxxxxxxx> > > The linked list is slower than walking the VMAs using the maple tree. > We can't use the VMA iterator here because it doesn't support > moving to an earlier position. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> > Signed-off-by: Liam R. Howlett <Liam.Howlett@xxxxxxxxxx> Acked-by: Vlastimil Babka <vbabka@xxxxxxx> > --- > kernel/sched/fair.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index 6e476f6d9435..39bb4a6c8507 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -2672,6 +2672,7 @@ static void task_numa_work(struct callback_head *work) > struct task_struct *p = current; > struct mm_struct *mm = p->mm; > u64 runtime = p->se.sum_exec_runtime; > + MA_STATE(mas, &mm->mm_mt, 0, 0); > struct vm_area_struct *vma; > unsigned long start, end; > unsigned long nr_pte_updates = 0; > @@ -2728,13 +2729,16 @@ static void task_numa_work(struct callback_head *work) > > if (!mmap_read_trylock(mm)) > return; > - vma = find_vma(mm, start); > + 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); > + vma = mas_find(&mas, ULONG_MAX); > } > - for (; vma; vma = vma->vm_next) { > + > + for (; vma; vma = mas_find(&mas, ULONG_MAX)) { > if (!vma_migratable(vma) || !vma_policy_mof(vma) || > is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_MIXEDMAP)) { > continue;