Skip to content

Commit 7ef5268

Browse files
urezkiakpm00
authored andcommitted
mm/vmalloc: move resched point into alloc_vmap_area()
Currently vm_area_alloc_pages() contains two cond_resched() points. However, the page allocator already has its own in slow path so an extra resched is not optimal because it delays the loops. The place where CPU time can be consumed is in the VA-space search in alloc_vmap_area(), especially if the space is really fragmented using synthetic stress tests, after a fast path falls back to a slow one. Move a single cond_resched() there, after dropping free_vmap_area_lock in a slow path. This keeps fairness where it matters while removing redundant yields from the page-allocation path. [akpm@linux-foundation.org: tweak comment grammar] Link: https://lkml.kernel.org/r/20250917185906.1595454-1-urezki@gmail.com Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com> Cc: Baoquan He <bhe@redhat.com> Cc: Michal Hocko <mhocko@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 1b00ab4 commit 7ef5268

1 file changed

Lines changed: 6 additions & 2 deletions

File tree

mm/vmalloc.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2057,6 +2057,12 @@ static struct vmap_area *alloc_vmap_area(unsigned long size,
20572057
addr = __alloc_vmap_area(&free_vmap_area_root, &free_vmap_area_list,
20582058
size, align, vstart, vend);
20592059
spin_unlock(&free_vmap_area_lock);
2060+
2061+
/*
2062+
* This is not a fast path. Check if yielding is needed. This
2063+
* is the only reschedule point in the vmalloc() path.
2064+
*/
2065+
cond_resched();
20602066
}
20612067

20622068
trace_alloc_vmap_area(addr, size, align, vstart, vend, IS_ERR_VALUE(addr));
@@ -3622,7 +3628,6 @@ vm_area_alloc_pages(gfp_t gfp, int nid,
36223628
pages + nr_allocated);
36233629

36243630
nr_allocated += nr;
3625-
cond_resched();
36263631

36273632
/*
36283633
* If zero or pages were obtained partly,
@@ -3664,7 +3669,6 @@ vm_area_alloc_pages(gfp_t gfp, int nid,
36643669
for (i = 0; i < (1U << order); i++)
36653670
pages[nr_allocated + i] = page + i;
36663671

3667-
cond_resched();
36683672
nr_allocated += 1U << order;
36693673
}
36703674

0 commit comments

Comments
 (0)