All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V2] mm: add GFP_ATOMIC flag after local_lock_irqsave
@ 2021-07-06  9:24 Wang Qing
  2021-07-06  9:56 ` Mel Gorman
  0 siblings, 1 reply; 2+ messages in thread
From: Wang Qing @ 2021-07-06  9:24 UTC (permalink / raw)
  To: Andrew Morton, open list:MEMORY MANAGEMENT, open list
  Cc: mgorman, Qiang.Zhang, Wang Qing

prep_new_page() will allocate memory in some scenarios. 

Call Trace:
__dump_stack lib/dump_stack.c:79 [inline]
dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:96
___might_sleep.cold+0x1f1/0x237 kernel/sched/core.c:9153
prepare_alloc_pages+0x3da/0x580 mm/page_alloc.c:5179
__alloc_pages+0x12f/0x500 mm/page_alloc.c:5375
alloc_pages+0x18c/0x2a0 mm/mempolicy.c:2272
stack_depot_save+0x39d/0x4e0 lib/stackdepot.c:303
save_stack+0x15e/0x1e0 mm/page_owner.c:120
__set_page_owner+0x50/0x290 mm/page_owner.c:181
prep_new_page mm/page_alloc.c:2445 [inline]
__alloc_pages_bulk+0x8b9/0x1870 mm/page_alloc.c:5313

So we add GFP_ATOMIC and remove GFP_KERNEL flag.

Reported-and-tested-by: syzbot+b07d8440edb5f8988eea@syzkaller.appspotmail.com
Signed-off-by: Wang Qing <wangqing@vivo.com>
---
 mm/page_alloc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index d6e94cc..3016ba5
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5309,7 +5309,7 @@ unsigned long __alloc_pages_bulk(gfp_t gfp, int preferred_nid,
 		}
 		nr_account++;
 
-		prep_new_page(page, 0, gfp, 0);
+		prep_new_page(page, 0, gfp | GFP_ATOMIC & ~GFP_KERNEL, 0);
 		if (page_list)
 			list_add(&page->lru, page_list);
 		else
-- 
2.7.4


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

* Re: [PATCH V2] mm: add GFP_ATOMIC flag after local_lock_irqsave
  2021-07-06  9:24 [PATCH V2] mm: add GFP_ATOMIC flag after local_lock_irqsave Wang Qing
@ 2021-07-06  9:56 ` Mel Gorman
  0 siblings, 0 replies; 2+ messages in thread
From: Mel Gorman @ 2021-07-06  9:56 UTC (permalink / raw)
  To: Wang Qing
  Cc: Andrew Morton, open list:MEMORY MANAGEMENT, open list, Qiang.Zhang

On Tue, Jul 06, 2021 at 05:24:31PM +0800, Wang Qing wrote:
> prep_new_page() will allocate memory in some scenarios. 
> 
> Call Trace:
> __dump_stack lib/dump_stack.c:79 [inline]
> dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:96
> ___might_sleep.cold+0x1f1/0x237 kernel/sched/core.c:9153
> prepare_alloc_pages+0x3da/0x580 mm/page_alloc.c:5179
> __alloc_pages+0x12f/0x500 mm/page_alloc.c:5375
> alloc_pages+0x18c/0x2a0 mm/mempolicy.c:2272
> stack_depot_save+0x39d/0x4e0 lib/stackdepot.c:303
> save_stack+0x15e/0x1e0 mm/page_owner.c:120
> __set_page_owner+0x50/0x290 mm/page_owner.c:181
> prep_new_page mm/page_alloc.c:2445 [inline]
> __alloc_pages_bulk+0x8b9/0x1870 mm/page_alloc.c:5313
> 
> So we add GFP_ATOMIC and remove GFP_KERNEL flag.
> 
> Reported-and-tested-by: syzbot+b07d8440edb5f8988eea@syzkaller.appspotmail.com
> Signed-off-by: Wang Qing <wangqing@vivo.com>

This will pass in the wrong flags to kasan potentially and the wrong GFP
mask will be stored in page_owner->gfp_mask. If you think this is the
best approach, the flags should be set to GFP_ATOMIC at the places page
owner allocates memory (stack_depot_save?). The caveat there is that
page owner tracking may be impaired if the atomic allocations fail. That
brings us back to either disabling the bulk allocator if page owner
tracking is enabled or doing the enabling/disabling only when page owner
tracking is enabled and goto the point where pagesets.lock is taken and
PCP looked up with a comment stating that it incurs a performance
penalty that is acceptable when page owner tracking is on.

-- 
Mel Gorman
SUSE Labs

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

end of thread, other threads:[~2021-07-06  9:56 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-06  9:24 [PATCH V2] mm: add GFP_ATOMIC flag after local_lock_irqsave Wang Qing
2021-07-06  9:56 ` Mel Gorman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.