The vm_area_alloc_pages() function uses cond_resched() to yield the
CPU during potentially long-running loops. However, these loops are
not considered long-running under normal conditions. In non-blocking
contexts, calling cond_resched() is inappropriate also.
Remove these calls to ensure correctness for blocking/non-blocking
contexts. This also simplifies the code path. In fact, a slow path
of page allocator already includes reschedule points to mitigate
latency.
This patch was tested for !CONFIG_PREEMPT kernel and with large
allocation chunks(~1GB), without triggering any "BUG: soft lockup"
warnings.
Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
---
mm/vmalloc.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 81b6d3bde719..b0255e0c74b3 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -3633,7 +3633,6 @@ vm_area_alloc_pages(gfp_t gfp, int nid,
pages + nr_allocated);
nr_allocated += nr;
- cond_resched();
/*
* If zero or pages were obtained partly,
@@ -3675,7 +3674,6 @@ vm_area_alloc_pages(gfp_t gfp, int nid,
for (i = 0; i < (1U << order); i++)
pages[nr_allocated + i] = page + i;
- cond_resched();
nr_allocated += 1U << order;
}
--
2.39.5
On 08/07/25 at 09:58am, Uladzislau Rezki (Sony) wrote: > The vm_area_alloc_pages() function uses cond_resched() to yield the > CPU during potentially long-running loops. However, these loops are > not considered long-running under normal conditions. In non-blocking > contexts, calling cond_resched() is inappropriate also. > > Remove these calls to ensure correctness for blocking/non-blocking > contexts. This also simplifies the code path. In fact, a slow path > of page allocator already includes reschedule points to mitigate > latency. > > This patch was tested for !CONFIG_PREEMPT kernel and with large > allocation chunks(~1GB), without triggering any "BUG: soft lockup" > warnings. > > Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com> > --- > mm/vmalloc.c | 2 -- > 1 file changed, 2 deletions(-) Reviewed-by: Baoquan He <bhe@redhat.com> > > diff --git a/mm/vmalloc.c b/mm/vmalloc.c > index 81b6d3bde719..b0255e0c74b3 100644 > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -3633,7 +3633,6 @@ vm_area_alloc_pages(gfp_t gfp, int nid, > pages + nr_allocated); > > nr_allocated += nr; > - cond_resched(); > > /* > * If zero or pages were obtained partly, > @@ -3675,7 +3674,6 @@ vm_area_alloc_pages(gfp_t gfp, int nid, > for (i = 0; i < (1U << order); i++) > pages[nr_allocated + i] = page + i; > > - cond_resched(); > nr_allocated += 1U << order; > } > > -- > 2.39.5 >
On Thu 07-08-25 09:58:06, Uladzislau Rezki wrote: > The vm_area_alloc_pages() function uses cond_resched() to yield the > CPU during potentially long-running loops. However, these loops are > not considered long-running under normal conditions. To be more precise they can take long if they dive into the page allocator but that already involves cond_rescheds where appropriate so these are not needed in fact. > In non-blocking > contexts, calling cond_resched() is inappropriate also. > > Remove these calls to ensure correctness for blocking/non-blocking > contexts. This also simplifies the code path. In fact, a slow path > of page allocator already includes reschedule points to mitigate > latency. > > This patch was tested for !CONFIG_PREEMPT kernel and with large > allocation chunks(~1GB), without triggering any "BUG: soft lockup" > warnings. > > Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com> Acked-by: Michal Hocko <mhocko@suse.com> Thanks! > --- > mm/vmalloc.c | 2 -- > 1 file changed, 2 deletions(-) > > diff --git a/mm/vmalloc.c b/mm/vmalloc.c > index 81b6d3bde719..b0255e0c74b3 100644 > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -3633,7 +3633,6 @@ vm_area_alloc_pages(gfp_t gfp, int nid, > pages + nr_allocated); > > nr_allocated += nr; > - cond_resched(); > > /* > * If zero or pages were obtained partly, > @@ -3675,7 +3674,6 @@ vm_area_alloc_pages(gfp_t gfp, int nid, > for (i = 0; i < (1U << order); i++) > pages[nr_allocated + i] = page + i; > > - cond_resched(); > nr_allocated += 1U << order; > } > > -- > 2.39.5 > -- Michal Hocko SUSE Labs
On Thu, Aug 07, 2025 at 01:22:36PM +0200, Michal Hocko wrote: > On Thu 07-08-25 09:58:06, Uladzislau Rezki wrote: > > The vm_area_alloc_pages() function uses cond_resched() to yield the > > CPU during potentially long-running loops. However, these loops are > > not considered long-running under normal conditions. > > To be more precise they can take long if they dive into the page > allocator but that already involves cond_rescheds where appropriate so > these are not needed in fact. > > > In non-blocking > > contexts, calling cond_resched() is inappropriate also. > > > > Remove these calls to ensure correctness for blocking/non-blocking > > contexts. This also simplifies the code path. In fact, a slow path > > of page allocator already includes reschedule points to mitigate > > latency. > > > > This patch was tested for !CONFIG_PREEMPT kernel and with large > > allocation chunks(~1GB), without triggering any "BUG: soft lockup" > > warnings. > > > > Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com> > > Acked-by: Michal Hocko <mhocko@suse.com> > > Thanks! > Updated the commit message. Right, it can take long time. Thank you! -- Uladzislau Rezki
© 2016 - 2025 Red Hat, Inc.