From: Sean Christopherson <seanjc@google.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: Harry Yoo <harry@kernel.org>, Hillf Danton <hdanton@sina.com>,
Boqun Feng <boqun@kernel.org>,
syzbot <syzbot+f11512d1e5878ba5e60e@syzkaller.appspotmail.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>,
syzkaller-bugs@googlegroups.com,
Vlastimil Babka <vbabka@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Hao Li <hao.li@linux.dev>, Christoph Lameter <cl@gentwo.org>,
David Rientjes <rientjes@google.com>,
Roman Gushchin <roman.gushchin@linux.dev>,
linux-mm@kvack.org,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
Clark Williams <clrkwllms@kernel.org>,
linux-rt-devel@lists.linux.dev,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [syzbot] [kvm?] WARNING: locking bug in __refill_objects_node
Date: Mon, 2 Nov 2026 09:43:35 -0800 [thread overview]
Message-ID: <aujLx1FOc12E72rF@google.com> (raw)
In-Reply-To: <20261027163929.2bb28d5b@gandalf.local.home>
+Paolo
On Tue, Oct 27, 2026, Steven Rostedt wrote:
> On Tue, 27 Oct 2026 18:48:28 +0000
> Harry Yoo <harry@kernel.org> wrote:
>
> > [+Cc RT folks]
> >
> > On Tue, Oct 27, 2026 at 07:00:16AM -0700, Sean Christopherson wrote:
> > > +slub folks
> > >
> > > On Tue, Oct 27, 2026, Hillf Danton wrote:
> > > > Ask the locking people to shed light on the warning.
> > >
> > > get_partial_node_bulk() is waiting on a non-raw spinlock while in hard IRQ context,
> > > and it looks like __refill_objects_node() would do the same later on. On PREEMPT_RT,
> > > those spinlocks become sleepable locks, which is what triggers the splat.
> > >
> > > The alloction coming from KVM-as-a-guest code is GFP_ATOMIC, so I think that wonky
> > > code is fine.
> >
> > But memory allocation w/ GFP_ATOMIC is fine only on non-RT?
>
> Correct. GFP_ATOMIC is meaningless on RT. It still cannot be called with
> preemption disabled. Most places that disable preemption in the non-RT case
> do not disable it in the RT case. For example, spin_lock() disables
> preemption on non-RT but does not in RT. Same for interrupt handlers, as in
> RT interrupt handlers are run in task context.
>
> That is, in RT only "special" places disable preemption for real.
...
> > > > > =============================
> > > > > [ BUG: Invalid wait context ]
> > > > > syzkaller #0 Tainted: G S
> > > > > -----------------------------
> > > > > syz-executor177/6041 is trying to lock:
> > > > > ffff88801d040618 (&n->list_lock){-.-.}-{3:3}, at: get_partial_node_bulk mm/slub.c:3831 [inline]
> > > > > ffff88801d040618 (&n->list_lock){-.-.}-{3:3}, at: __refill_objects_node+0x104/0xab0 mm/slub.c:7279
> > > > > other info that might help us debug this:
> > > > > context-{2:2}
> > > > > locks held by syz-executor177/6041: 1, last CPU#1:
> > > > > #0: ffffffff9090b438 (tomoyo_ss){.+.+}-{0:0}, at: srcu_lock_acquire include/linux/srcu.h:198 [inline]
> > > > > #0: ffffffff9090b438 (tomoyo_ss){.+.+}-{0:0}, at: srcu_read_lock include/linux/srcu.h:305 [inline]
> > > > > #0: ffffffff9090b438 (tomoyo_ss){.+.+}-{0:0}, at: tomoyo_read_lock security/tomoyo/common.h:1112 [inline]
> > > > > #0: ffffffff9090b438 (tomoyo_ss){.+.+}-{0:0}, at: tomoyo_check_open_permission+0x169/0x3c0 security/tomoyo/file.c:772
> > > > > stack backtrace:
> > > > > CPU: 1 UID: 0 PID: 6041 Comm: syz-executor177 Tainted: G S syzkaller #0 PREEMPT(full)
> > > > > Tainted: [S]=CPU_OUT_OF_SPEC
> > > > > Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
> > > > > Call Trace:
> > > > > <IRQ>
> > > > > __dump_stack lib/dump_stack.c:94 [inline]
> > > > > dump_stack_lvl+0x100/0x190 lib/dump_stack.c:120
> > > > > print_lock_invalid_wait_context kernel/locking/lockdep.c:4874 [inline]
> > > > > check_wait_context kernel/locking/lockdep.c:4946 [inline]
> > > > > __lock_acquire+0xfcc/0x1f40 kernel/locking/lockdep.c:5238
> > > > > lock_acquire kernel/locking/lockdep.c:5942 [inline]
> > > > > lock_acquire+0x1d1/0x380 kernel/locking/lockdep.c:5899
> > > > > __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:155 [inline]
> > > > > _raw_spin_lock_irqsave+0x3a/0x60 kernel/locking/spinlock.c:181
> > > > > get_partial_node_bulk mm/slub.c:3831 [inline]
> > > > > __refill_objects_node+0x104/0xab0 mm/slub.c:7279
> > > > > refill_objects+0x58/0x410 mm/slub.c:7405
> > > > > refill_sheaf mm/slub.c:2885 [inline]
> > > > > __pcs_replace_empty_main+0x35e/0x650 mm/slub.c:4774
> > > > > alloc_from_pcs mm/slub.c:4850 [inline]
> > > > > slab_alloc_node mm/slub.c:4984 [inline]
> > > > > __kmalloc_cache_noprof+0x4f4/0x6d0 mm/slub.c:5559
> > > > > _kmalloc_noprof include/linux/slab.h:991 [inline]
> > > > > _kzalloc_noprof include/linux/slab.h:1312 [inline]
> > > > > kvm_async_pf_task_wake arch/x86/kernel/kvm.c:224 [inline]
>
> Hmm, this part is OK:
>
> if (!dummy) {
> raw_spin_unlock(&b->lock);
> dummy = kzalloc_obj(*dummy, GFP_ATOMIC);
>
> As it releases the raw_spin_lock() before calling kzalloc_obj().
>
> So something else must have disabled preemption/interrupts.
Heh, yeah, the IRQ that kicked all of this off.
> > > > > __sysvec_kvm_asyncpf_interrupt+0x334/0x610 arch/x86/kernel/kvm.c:338
>
> DEFINE_IDTENTRY_SYSVEC(sysvec_kvm_asyncpf_interrupt)
> {
> struct pt_regs *old_regs = set_irq_regs(regs);
> u32 token;
>
> apic_eoi();
>
> inc_irq_stat(HYPERVISOR_CALLBACK);
>
> if (__this_cpu_read(async_pf_enabled)) {
> token = __this_cpu_read(apf_reason.token);
> kvm_async_pf_task_wake(token);
> __this_cpu_write(apf_reason.token, 0);
> wrmsrq(MSR_KVM_ASYNC_PF_ACK, 1);
> }
>
> set_irq_regs(old_regs);
> }
>
>
> Is that run in hard interrupt context?
Yep.
> If so, we need to make that a thread for RT kernels if you want to call
> kzalloc_obj().
Eww. I can't imagine there's a sane usecase for memory overcommitting a real-time
guest. I'd rather just disable PV async #PF support, e.g.
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index 6b0a5861ccb8..b14b03720525 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -51,7 +51,7 @@
DEFINE_STATIC_KEY_FALSE_RO(kvm_async_pf_enabled);
-static int kvmapf = 1;
+static int kvmapf = !IS_ENABLED(CONFIG_PREEMPT_RT);
static int __init parse_no_kvmapf(char *arg)
{
next prev parent reply other threads:[~2026-11-02 17:43 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-26 10:19 [syzbot] [kvm?] WARNING: locking bug in __refill_objects_node syzbot
2026-10-26 22:43 ` Hillf Danton
2026-10-27 14:00 ` Sean Christopherson
2026-10-27 18:48 ` Harry Yoo
2026-10-27 20:39 ` Steven Rostedt
2026-11-02 17:43 ` Sean Christopherson [this message]
2026-11-03 11:18 ` Paolo Bonzini
2026-11-03 15:17 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aujLx1FOc12E72rF@google.com \
--to=seanjc@google.com \
--cc=akpm@linux-foundation.org \
--cc=bigeasy@linutronix.de \
--cc=boqun@kernel.org \
--cc=cl@gentwo.org \
--cc=clrkwllms@kernel.org \
--cc=hao.li@linux.dev \
--cc=harry@kernel.org \
--cc=hdanton@sina.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-rt-devel@lists.linux.dev \
--cc=pbonzini@redhat.com \
--cc=penguin-kernel@i-love.sakura.ne.jp \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=rostedt@goodmis.org \
--cc=syzbot+f11512d1e5878ba5e60e@syzkaller.appspotmail.com \
--cc=syzkaller-bugs@googlegroups.com \
--cc=vbabka@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.