linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mm/vmalloc: Use batched page requests in bulk-allocator
@ 2021-07-05 14:55 Uladzislau Rezki (Sony)
  2021-07-05 15:32 ` Matthew Wilcox
  0 siblings, 1 reply; 3+ messages in thread
From: Uladzislau Rezki (Sony) @ 2021-07-05 14:55 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-mm, LKML, Mel Gorman, Christoph Hellwig, Matthew Wilcox,
	Nicholas Piggin, Uladzislau Rezki, Hillf Danton, Michal Hocko,
	Oleksiy Avramchenko, Steven Rostedt

In case of simultaneous vmalloc allocations, for example it is 1GB and
12 CPUs my system is able to hit "BUG: soft lockup" for !CONFIG_PREEMPT
kernel.

<snip>
[   62.512621] RIP: 0010:__alloc_pages_bulk+0xa9f/0xbb0
[   62.512628] Code: ff 8b 44 24 48 44 29 f8 83 f8 01 0f 84 ea fe ff ff e9 07 f6 ff ff 48 8b 44 24 60 48 89 28 e9 00 f9 ff ff fb 66 0f 1f 44 00 00 <e9> e8 fd ff ff 65 48 01 51 10 e9 3e fe ff ff 48 8b 44 24 78 4d 89
[   62.512629] RSP: 0018:ffffa7bfc29ffd20 EFLAGS: 00000206
[   62.512631] RAX: 0000000000000200 RBX: ffffcd5405421888 RCX: ffff8c36ffdeb928
[   62.512632] RDX: 0000000000040000 RSI: ffffa896f06b2ff8 RDI: ffffcd5405421880
[   62.512633] RBP: ffffcd5405421880 R08: 000000000000007d R09: ffffffffffffffff
[   62.512634] R10: ffffffff9d63c084 R11: 00000000ffffffff R12: ffff8c373ffaeb80
[   62.512635] R13: ffff8c36ffdf65f8 R14: ffff8c373ffaeb80 R15: 0000000000040000
[   62.512637] FS:  0000000000000000(0000) GS:ffff8c36ffdc0000(0000) knlGS:0000000000000000
[   62.512638] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[   62.512639] CR2: 000055c8e2fe8610 CR3: 0000000c13e10000 CR4: 00000000000006e0
[   62.512641] Call Trace:
[   62.512646]  __vmalloc_node_range+0x11c/0x2d0
[   62.512649]  ? full_fit_alloc_test+0x140/0x140 [test_vmalloc]
[   62.512654]  __vmalloc_node+0x4b/0x70
[   62.512656]  ? fix_size_alloc_test+0x44/0x60 [test_vmalloc]
[   62.512659]  fix_size_alloc_test+0x44/0x60 [test_vmalloc]
[   62.512662]  test_func+0xe7/0x1f0 [test_vmalloc]
[   62.512666]  ? fix_align_alloc_test+0x50/0x50 [test_vmalloc]
[   62.512668]  kthread+0x11a/0x140
[   62.512671]  ? set_kthread_struct+0x40/0x40
[   62.512672]  ret_from_fork+0x22/0x30
<snip>

To address this issue invoke a bulk-allocator many times until all pages
are obtained, i.e. do batched page requests adding cond_resched() meanwhile
to reschedule. Batched value is hard-coded and is 100 pages per call.

Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
---
 mm/vmalloc.c | 32 ++++++++++++++++++++++++++++----
 1 file changed, 28 insertions(+), 4 deletions(-)

diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index aaad569e8963..01ad46f97365 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -2785,10 +2785,34 @@ vm_area_alloc_pages(gfp_t gfp, int nid,
 	 * to fails, fallback to a single page allocator that is
 	 * more permissive.
 	 */
-	if (!order)
-		nr_allocated = alloc_pages_bulk_array_node(
-			gfp, nid, nr_pages, pages);
-	else
+	if (!order) {
+		while (nr_allocated < nr_pages) {
+			int nr, nr_pages_request;
+
+			/*
+			 * A maximum allowed request is hard-coded and is 100
+			 * pages per call. That is done in order to prevent a
+			 * long preemption off scenario in the bulk-allocator
+			 * so the range is [1:100].
+			 */
+			nr_pages_request = min(100, (int)(nr_pages - nr_allocated));
+
+			nr = alloc_pages_bulk_array_node(gfp, nid,
+				nr_pages_request, pages + nr_allocated);
+
+			nr_allocated += nr;
+
+			if (gfpflags_allow_blocking(gfp))
+				cond_resched();
+
+			/*
+			 * If zero or pages were obtained partly,
+			 * fallback to a single page allocator.
+			 */
+			if (nr != nr_pages_request)
+				break;
+		}
+	} else
 		/*
 		 * Compound pages required for remap_vmalloc_page if
 		 * high-order pages.
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] mm/vmalloc: Use batched page requests in bulk-allocator
  2021-07-05 14:55 [PATCH] mm/vmalloc: Use batched page requests in bulk-allocator Uladzislau Rezki (Sony)
@ 2021-07-05 15:32 ` Matthew Wilcox
  2021-07-05 15:43   ` Uladzislau Rezki
  0 siblings, 1 reply; 3+ messages in thread
From: Matthew Wilcox @ 2021-07-05 15:32 UTC (permalink / raw)
  To: Uladzislau Rezki (Sony)
  Cc: Andrew Morton, linux-mm, LKML, Mel Gorman, Christoph Hellwig,
	Nicholas Piggin, Hillf Danton, Michal Hocko, Oleksiy Avramchenko,
	Steven Rostedt

On Mon, Jul 05, 2021 at 04:55:47PM +0200, Uladzislau Rezki (Sony) wrote:
> +			if (gfpflags_allow_blocking(gfp))
> +				cond_resched();

How does one call vmalloc() with gfp flags that _don't_ allow blocking?
They have to allow a GFP_KERNEL allocation of the page tables.
So I think this should be an unconditional cond_resched().

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] mm/vmalloc: Use batched page requests in bulk-allocator
  2021-07-05 15:32 ` Matthew Wilcox
@ 2021-07-05 15:43   ` Uladzislau Rezki
  0 siblings, 0 replies; 3+ messages in thread
From: Uladzislau Rezki @ 2021-07-05 15:43 UTC (permalink / raw)
  To: Matthew Wilcox
  Cc: Uladzislau Rezki (Sony),
	Andrew Morton, linux-mm, LKML, Mel Gorman, Christoph Hellwig,
	Nicholas Piggin, Hillf Danton, Michal Hocko, Oleksiy Avramchenko,
	Steven Rostedt

> On Mon, Jul 05, 2021 at 04:55:47PM +0200, Uladzislau Rezki (Sony) wrote:
> > +			if (gfpflags_allow_blocking(gfp))
> > +				cond_resched();
> 
> How does one call vmalloc() with gfp flags that _don't_ allow blocking?
> They have to allow a GFP_KERNEL allocation of the page tables.
> So I think this should be an unconditional cond_resched().
Historically it is there. I decided to align with below code. But i agree
vmalloc is sleepable anyway, so blocking is supposed.

OK, i will respin and send out two patches. 

--
Vlad Rezki

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-07-05 15:43 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-05 14:55 [PATCH] mm/vmalloc: Use batched page requests in bulk-allocator Uladzislau Rezki (Sony)
2021-07-05 15:32 ` Matthew Wilcox
2021-07-05 15:43   ` Uladzislau Rezki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).