]> www.infradead.org Git - users/hch/misc.git/commitdiff
mm: don't spin in add_stack_record when gfp flags don't allow
authorAlexei Starovoitov <ast@kernel.org>
Fri, 10 Oct 2025 00:15:13 +0000 (17:15 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 15 Oct 2025 20:24:33 +0000 (13:24 -0700)
syzbot was able to find the following path:
  add_stack_record_to_list mm/page_owner.c:182 [inline]
  inc_stack_record_count mm/page_owner.c:214 [inline]
  __set_page_owner+0x2c3/0x4a0 mm/page_owner.c:333
  set_page_owner include/linux/page_owner.h:32 [inline]
  post_alloc_hook+0x240/0x2a0 mm/page_alloc.c:1851
  prep_new_page mm/page_alloc.c:1859 [inline]
  get_page_from_freelist+0x21e4/0x22c0 mm/page_alloc.c:3858
  alloc_pages_nolock_noprof+0x94/0x120 mm/page_alloc.c:7554

Don't spin in add_stack_record_to_list() when it is called
from *_nolock() context.

Link: https://lkml.kernel.org/r/CAADnVQK_8bNYEA7TJYgwTYR57=TTFagsvRxp62pFzS_z129eTg@mail.gmail.com
Fixes: 97769a53f117 ("mm, bpf: Introduce try_alloc_pages() for opportunistic page allocation")
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Reported-by: syzbot+8259e1d0e3ae8ed0c490@syzkaller.appspotmail.com
Reported-by: syzbot+665739f456b28f32b23d@syzkaller.appspotmail.com
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-by: Oscar Salvador <osalvador@suse.de>
Cc: Brendan Jackman <jackmanb@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/page_owner.c

index c3ca21132c2c18e77cd4b6b3edb586fc1ac3cba7..589ec37c94aab99f2944fe47d7dfbcfa78127177 100644 (file)
@@ -168,6 +168,9 @@ static void add_stack_record_to_list(struct stack_record *stack_record,
        unsigned long flags;
        struct stack *stack;
 
+       if (!gfpflags_allow_spinning(gfp_mask))
+               return;
+
        set_current_in_page_owner();
        stack = kmalloc(sizeof(*stack), gfp_nested_mask(gfp_mask));
        if (!stack) {