possible deadlock in mmu_shrink_scan

Status: upstream: reported on 2026/07/26 14:15
Reported-by: syzbot+72ecb22c0ef68b3074f8@syzkaller.appspotmail.com
First crash: 30d, last: 24d

Sample crash report:
======================================================
WARNING: possible circular locking dependency detected
syzkaller #0 Not tainted
------------------------------------------------------
kswapd1/255 is trying to acquire lock:
ffffffff8c10ffc8 (kvm_lock){+.+.}-{3:3}, at: mmu_shrink_scan+0xa8/0x820 arch/x86/kvm/mmu/mmu.c:5998

but task is already holding lock:
ffffffff8c3ded00 (fs_reclaim){+.+.}-{0:0}, at: 0x1

which lock already depends on the new lock.


the existing dependency chain (in reverse order) is:

-> #2 (fs_reclaim){+.+.}-{0:0}:
       __fs_reclaim_acquire mm/page_alloc.c:4580 [inline]
       fs_reclaim_acquire+0x6d/0x100 mm/page_alloc.c:4594
       might_alloc include/linux/sched/mm.h:206 [inline]
       slab_pre_alloc_hook+0x20/0xc0 mm/slab.h:492
       slab_alloc_node mm/slub.c:3139 [inline]
       slab_alloc mm/slub.c:3233 [inline]
       __kmalloc+0x6b/0x340 mm/slub.c:4408
       kmalloc include/linux/slab.h:612 [inline]
       kvm_io_bus_register_dev+0xe3/0x4c0 virt/kvm/kvm_main.c:5147
       kvm_pic_init+0x1a9/0x2f0 arch/x86/kvm/i8259.c:607
       kvm_arch_vm_ioctl+0x1101/0x1530 arch/x86/kvm/x86.c:6125
       kvm_vm_ioctl+0x78d/0xb00 virt/kvm/kvm_main.c:4649
       vfs_ioctl fs/ioctl.c:51 [inline]
       __do_sys_ioctl fs/ioctl.c:874 [inline]
       __se_sys_ioctl+0xfa/0x170 fs/ioctl.c:860
       do_syscall_x64 arch/x86/entry/common.c:50 [inline]
       do_syscall_64+0x4c/0xa0 arch/x86/entry/common.c:80
       entry_SYSCALL_64_after_hwframe+0x66/0xd0

-> #1 (&kvm->slots_lock){+.+.}-{3:3}:
       __mutex_lock_common+0x1e5/0x2400 kernel/locking/mutex.c:596
       __mutex_lock kernel/locking/mutex.c:729 [inline]
       mutex_lock_nested+0x17/0x20 kernel/locking/mutex.c:743
       set_nx_huge_pages+0x16f/0x2f0 arch/x86/kvm/mmu/mmu.c:6102
       param_attr_store+0x20a/0x300 kernel/params.c:585
       module_attr_store+0x5b/0x80 kernel/params.c:905
       kernfs_fop_write_iter+0x3a8/0x500 fs/kernfs/file.c:296
       call_write_iter include/linux/fs.h:2173 [inline]
       new_sync_write fs/read_write.c:507 [inline]
       vfs_write+0x748/0xd70 fs/read_write.c:594
       ksys_write+0x153/0x260 fs/read_write.c:647
       do_syscall_x64 arch/x86/entry/common.c:50 [inline]
       do_syscall_64+0x4c/0xa0 arch/x86/entry/common.c:80
       entry_SYSCALL_64_after_hwframe+0x66/0xd0

-> #0 (kvm_lock){+.+.}-{3:3}:
       check_prev_add kernel/locking/lockdep.c:3053 [inline]
       check_prevs_add kernel/locking/lockdep.c:3172 [inline]
       validate_chain kernel/locking/lockdep.c:3788 [inline]
       __lock_acquire+0x2c66/0x7b50 kernel/locking/lockdep.c:5012
       lock_acquire+0x19e/0x400 kernel/locking/lockdep.c:5623
       __mutex_lock_common+0x1e5/0x2400 kernel/locking/mutex.c:596
       __mutex_lock kernel/locking/mutex.c:729 [inline]
       mutex_lock_nested+0x17/0x20 kernel/locking/mutex.c:743
       mmu_shrink_scan+0xa8/0x820 arch/x86/kvm/mmu/mmu.c:5998
       do_shrink_slab+0x51f/0xd40 mm/vmscan.c:765
       shrink_slab+0x1c5/0x7a0 mm/vmscan.c:925
       shrink_node_memcgs mm/vmscan.c:2958 [inline]
       shrink_node+0x11f5/0x2790 mm/vmscan.c:3079
       kswapd_shrink_node mm/vmscan.c:3821 [inline]
       balance_pgdat+0xdf3/0x1a10 mm/vmscan.c:4012
       kswapd+0x7db/0xde0 mm/vmscan.c:4271
       kthread+0x42e/0x520 kernel/kthread.c:334
       ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:287

other info that might help us debug this:

Chain exists of:
  kvm_lock --> &kvm->slots_lock --> fs_reclaim

 Possible unsafe locking scenario:

       CPU0                    CPU1
       ----                    ----
  lock(fs_reclaim);
                               lock(&kvm->slots_lock);
                               lock(fs_reclaim);
  lock(kvm_lock);

 *** DEADLOCK ***

2 locks held by kswapd1/255:
 #0: ffffffff8c3ded00 (fs_reclaim){+.+.}-{0:0}, at: 0x1
 #1: ffffffff8c3bc310 (shrinker_rwsem){++++}-{3:3}, at: shrink_slab+0x11c/0x7a0 mm/vmscan.c:915

stack backtrace:
CPU: 0 PID: 255 Comm: kswapd1 Not tainted syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 07/24/2026
Call Trace:
 <TASK>
 dump_stack_lvl+0x188/0x250 lib/dump_stack.c:106
 check_noncircular+0x296/0x330 kernel/locking/lockdep.c:2133
 check_prev_add kernel/locking/lockdep.c:3053 [inline]
 check_prevs_add kernel/locking/lockdep.c:3172 [inline]
 validate_chain kernel/locking/lockdep.c:3788 [inline]
 __lock_acquire+0x2c66/0x7b50 kernel/locking/lockdep.c:5012
 lock_acquire+0x19e/0x400 kernel/locking/lockdep.c:5623
 __mutex_lock_common+0x1e5/0x2400 kernel/locking/mutex.c:596
 __mutex_lock kernel/locking/mutex.c:729 [inline]
 mutex_lock_nested+0x17/0x20 kernel/locking/mutex.c:743
 mmu_shrink_scan+0xa8/0x820 arch/x86/kvm/mmu/mmu.c:5998
 do_shrink_slab+0x51f/0xd40 mm/vmscan.c:765
 shrink_slab+0x1c5/0x7a0 mm/vmscan.c:925
 shrink_node_memcgs mm/vmscan.c:2958 [inline]
 shrink_node+0x11f5/0x2790 mm/vmscan.c:3079
 kswapd_shrink_node mm/vmscan.c:3821 [inline]
 balance_pgdat+0xdf3/0x1a10 mm/vmscan.c:4012
 kswapd+0x7db/0xde0 mm/vmscan.c:4271
 kthread+0x42e/0x520 kernel/kthread.c:334
 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:287
 </TASK>

Crashes (2):
Time Kernel Commit Syzkaller Config Log Report Syz repro C repro VM info Assets (help?) Manager Title
2026/08/01 08:33 linux-5.15.y 6e2fd6534337 e611ffe1 .config console log report info [disk image] [vmlinux] [kernel image] ci2-linux-5-15-kasan possible deadlock in mmu_shrink_scan
2026/07/26 14:14 linux-5.15.y 674f684f7c61 492bab15 .config console log report info [disk image] [vmlinux] [kernel image] ci2-linux-5-15-kasan possible deadlock in mmu_shrink_scan
* Struck through repros no longer work on HEAD.