BUG: KASAN: stack-out-of-bounds in unwind_next_frame+0x1df5/0x2650

From: Ivan Babrou
Date: Thu Jan 28 2021 - 22:36:20 EST


Hello,

We've noticed the following regression in Linux 5.10 branch:

[ 128.367231][ C0]
==================================================================
[ 128.368523][ C0] BUG: KASAN: stack-out-of-bounds in
unwind_next_frame (arch/x86/kernel/unwind_orc.c:371
arch/x86/kernel/unwind_orc.c:544)
[ 128.369744][ C0] Read of size 8 at addr ffff88802fceede0 by task
kworker/u2:2/591
[ 128.370916][ C0]
[ 128.371269][ C0] CPU: 0 PID: 591 Comm: kworker/u2:2 Not tainted
5.10.11-cloudflare-kasan-2021.1.15 #1
[ 128.372626][ C0] Hardware name: QEMU Standard PC (i440FX + PIIX,
1996), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014
[ 128.374346][ C0] Workqueue: writeback wb_workfn (flush-254:0)
[ 128.375275][ C0] Call Trace:
[ 128.375763][ C0] <IRQ>
[ 128.376221][ C0] dump_stack+0x7d/0xa3
[ 128.376843][ C0] print_address_description.constprop.0+0x1c/0x210
[ 128.377827][ C0] ? _raw_spin_lock_irqsave
(arch/x86/include/asm/atomic.h:202
include/asm-generic/atomic-instrumented.h:707
include/asm-generic/qspinlock.h:82 include/linux/spinlock.h:195
include/linux/spinlock_api_smp.h:119 kernel/locking/spinlock.c:159)
[ 128.378624][ C0] ? _raw_write_unlock_bh (kernel/locking/spinlock.c:158)
[ 128.379389][ C0] ? unwind_next_frame (arch/x86/kernel/unwind_orc.c:444)
[ 128.380177][ C0] ? unwind_next_frame
(arch/x86/kernel/unwind_orc.c:371 arch/x86/kernel/unwind_orc.c:544)
[ 128.380954][ C0] ? unwind_next_frame
(arch/x86/kernel/unwind_orc.c:371 arch/x86/kernel/unwind_orc.c:544)
[ 128.381736][ C0] kasan_report.cold+0x1f/0x37
[ 128.382438][ C0] ? unwind_next_frame
(arch/x86/kernel/unwind_orc.c:371 arch/x86/kernel/unwind_orc.c:544)
[ 128.383192][ C0] unwind_next_frame+0x1df5/0x2650
[ 128.383954][ C0] ? asm_common_interrupt
(arch/x86/include/asm/idtentry.h:622)
[ 128.384726][ C0] ? get_stack_info_noinstr
(arch/x86/kernel/dumpstack_64.c:157)
[ 128.385530][ C0] ? glue_xts_req_128bit+0x110/0x6f0 glue_helper
[ 128.386509][ C0] ? deref_stack_reg (arch/x86/kernel/unwind_orc.c:418)
[ 128.387267][ C0] ? is_module_text_address (kernel/module.c:4566
kernel/module.c:4550)
[ 128.388077][ C0] ? glue_xts_req_128bit+0x110/0x6f0 glue_helper
[ 128.389048][ C0] ? kernel_text_address.part.0 (kernel/extable.c:145)
[ 128.389901][ C0] ? glue_xts_req_128bit+0x110/0x6f0 glue_helper
[ 128.390865][ C0] ? stack_trace_save (kernel/stacktrace.c:82)
[ 128.391550][ C0] arch_stack_walk+0x8d/0xf0
[ 128.392216][ C0] ? kfree (mm/slub.c:3142 mm/slub.c:4124)
[ 128.392807][ C0] stack_trace_save+0x96/0xd0
[ 128.393535][ C0] ? create_prof_cpu_mask (kernel/stacktrace.c:113)
[ 128.394320][ C0] ? blk_update_request (block/blk-core.c:264
block/blk-core.c:1468)
[ 128.395113][ C0] ? asm_call_irq_on_stack (arch/x86/entry/entry_64.S:796)
[ 128.395887][ C0] ? do_softirq_own_stack
(arch/x86/include/asm/irq_stack.h:27
arch/x86/include/asm/irq_stack.h:77 arch/x86/kernel/irq_64.c:77)
[ 128.396678][ C0] ? irq_exit_rcu (kernel/softirq.c:393
kernel/softirq.c:423 kernel/softirq.c:435)
[ 128.397349][ C0] ? common_interrupt (arch/x86/kernel/irq.c:239)
[ 128.398086][ C0] ? asm_common_interrupt
(arch/x86/include/asm/idtentry.h:622)
[ 128.398886][ C0] ? get_page_from_freelist (mm/page_alloc.c:3480
mm/page_alloc.c:3904)
[ 128.399759][ C0] kasan_save_stack+0x20/0x50
[ 128.400453][ C0] ? kasan_save_stack (mm/kasan/common.c:48)
[ 128.401175][ C0] ? kasan_set_track (mm/kasan/common.c:56)
[ 128.401881][ C0] ? kasan_set_free_info (mm/kasan/generic.c:360)
[ 128.402646][ C0] ? __kasan_slab_free (mm/kasan/common.c:283
mm/kasan/common.c:424)
[ 128.403375][ C0] ? slab_free_freelist_hook (mm/slub.c:1577)
[ 128.404199][ C0] ? kfree (mm/slub.c:3142 mm/slub.c:4124)
[ 128.404835][ C0] ? nvme_pci_complete_rq+0x105/0x350 nvme
[ 128.405765][ C0] ? blk_done_softirq (include/linux/list.h:282
block/blk-mq.c:581)
[ 128.406552][ C0] ? __do_softirq
(arch/x86/include/asm/jump_label.h:25 include/linux/jump_label.h:200
include/trace/events/irq.h:142 kernel/softirq.c:299)
[ 128.407272][ C0] ? asm_call_irq_on_stack (arch/x86/entry/entry_64.S:796)
[ 128.408087][ C0] ? do_softirq_own_stack
(arch/x86/include/asm/irq_stack.h:27
arch/x86/include/asm/irq_stack.h:77 arch/x86/kernel/irq_64.c:77)
[ 128.408878][ C0] ? irq_exit_rcu (kernel/softirq.c:393
kernel/softirq.c:423 kernel/softirq.c:435)
[ 128.409602][ C0] ? common_interrupt (arch/x86/kernel/irq.c:239)
[ 128.410366][ C0] ? asm_common_interrupt
(arch/x86/include/asm/idtentry.h:622)
[ 128.411184][ C0] ? skcipher_walk_next (crypto/skcipher.c:322
crypto/skcipher.c:384)
[ 128.412009][ C0] ? skcipher_walk_virt (crypto/skcipher.c:487)
[ 128.412811][ C0] ? glue_xts_req_128bit+0x110/0x6f0 glue_helper
[ 128.413792][ C0] ? asm_common_interrupt
(arch/x86/include/asm/idtentry.h:622)
[ 128.414562][ C0] ? kcryptd_crypt_write_convert+0x3a2/0xa10 dm_crypt
[ 128.415591][ C0] ? crypt_map+0x5c1/0xc70 dm_crypt
[ 128.416389][ C0] ? __map_bio.isra.0+0x109/0x450 dm_mod
[ 128.417275][ C0] ? __split_and_process_non_flush+0x728/0xd10 dm_mod
[ 128.418293][ C0] ? dm_submit_bio+0x4f1/0xec0 dm_mod
[ 128.419068][ C0] ? submit_bio_noacct (block/blk-core.c:934
block/blk-core.c:982 block/blk-core.c:1061)
[ 128.419806][ C0] ? submit_bio (block/blk-core.c:1079)
[ 128.420458][ C0] ? _raw_spin_lock_irqsave
(arch/x86/include/asm/atomic.h:202
include/asm-generic/atomic-instrumented.h:707
include/asm-generic/qspinlock.h:82 include/linux/spinlock.h:195
include/linux/spinlock_api_smp.h:119 kernel/locking/spinlock.c:159)
[ 128.421244][ C0] ? _raw_write_unlock_bh (kernel/locking/spinlock.c:158)
[ 128.422015][ C0] ? ret_from_fork (arch/x86/entry/entry_64.S:302)
[ 128.422696][ C0] ? kmem_cache_free (mm/slub.c:3142 mm/slub.c:3158)
[ 128.423427][ C0] ? memset (mm/kasan/common.c:84)
[ 128.424000][ C0] ? dma_pool_free (mm/dmapool.c:405)
[ 128.424698][ C0] ? slab_free_freelist_hook (mm/slub.c:1577)
[ 128.425518][ C0] ? dma_pool_create (mm/dmapool.c:405)
[ 128.426234][ C0] ? kmem_cache_free (mm/slub.c:3142 mm/slub.c:3158)
[ 128.426923][ C0] ? raise_softirq_irqoff
(arch/x86/include/asm/preempt.h:26 kernel/softirq.c:469)
[ 128.427691][ C0] kasan_set_track+0x1c/0x30
[ 128.428366][ C0] kasan_set_free_info+0x1b/0x30
[ 128.429113][ C0] __kasan_slab_free+0x110/0x150
[ 128.429838][ C0] slab_free_freelist_hook+0x66/0x120
[ 128.430628][ C0] kfree+0xbf/0x4d0
[ 128.431192][ C0] ? nvme_pci_complete_rq+0x105/0x350 nvme
[ 128.432107][ C0] ? nvme_unmap_data+0x349/0x440 nvme
[ 128.432882][ C0] nvme_pci_complete_rq+0x105/0x350 nvme
[ 128.433750][ C0] blk_done_softirq+0x2ff/0x590
[ 128.434441][ C0] ? blk_mq_stop_hw_queue (block/blk-mq.c:573)
[ 128.435161][ C0] ? _raw_spin_lock_bh (kernel/locking/spinlock.c:150)
[ 128.435894][ C0] ? _raw_spin_lock_bh (kernel/locking/spinlock.c:150)
[ 128.436582][ C0] __do_softirq+0x1a0/0x667
[ 128.437218][ C0] asm_call_irq_on_stack+0x12/0x20
[ 128.437975][ C0] </IRQ>
[ 128.438397][ C0] do_softirq_own_stack+0x37/0x40
[ 128.439120][ C0] irq_exit_rcu+0x110/0x1b0
[ 128.439807][ C0] common_interrupt+0x74/0x120
[ 128.440545][ C0] asm_common_interrupt+0x1e/0x40
[ 128.441287][ C0] RIP: 0010:skcipher_walk_next
(crypto/skcipher.c:322 crypto/skcipher.c:384)
[ 128.442126][ C0] Code: 85 dd 10 00 00 49 8d 7c 24 08 49 89 14 24
48 b9 00 00 00 00 00 fc ff df 41 81 e5 ff 0f 00 00 48 89 fe 48 c1 ee
03 80 3c 0e 00 <0f> 85 80 10 00 00 48 89 c6 4d 89 6c 24 08 48 bc
All code
========
0: 85 dd test %ebx,%ebp
2: 10 00 adc %al,(%rax)
4: 00 49 8d add %cl,-0x73(%rcx)
7: 7c 24 jl 0x2d
9: 08 49 89 or %cl,-0x77(%rcx)
c: 14 24 adc $0x24,%al
e: 48 b9 00 00 00 00 00 movabs $0xdffffc0000000000,%rcx
15: fc ff df
18: 41 81 e5 ff 0f 00 00 and $0xfff,%r13d
1f: 48 89 fe mov %rdi,%rsi
22: 48 c1 ee 03 shr $0x3,%rsi
26: 80 3c 0e 00 cmpb $0x0,(%rsi,%rcx,1)
2a:* 0f 85 80 10 00 00 jne 0x10b0 <-- trapping instruction
30: 48 89 c6 mov %rax,%rsi
33: 4d 89 6c 24 08 mov %r13,0x8(%r12)
38: 48 rex.W
39: bc .byte 0xbc

Code starting with the faulting instruction
===========================================
0: 0f 85 80 10 00 00 jne 0x1086
6: 48 89 c6 mov %rax,%rsi
9: 4d 89 6c 24 08 mov %r13,0x8(%r12)
e: 48 rex.W
f: bc .byte 0xbc
[ 128.445089][ C0] RSP: 0018:ffff88802fceebf0 EFLAGS: 00000246
[ 128.445969][ C0] RAX: ffff888003b571b8 RBX: 0000000000000000
RCX: dffffc0000000000
[ 128.447124][ C0] RDX: ffffea00017cd580 RSI: 1ffff11005f9dda8
RDI: ffff88802fceed40
[ 128.448281][ C0] RBP: ffff88802fceec70 R08: ffff88802fceedc4
R09: 00000000ffffffee
[ 128.449457][ C0] R10: 0000000000000000 R11: 1ffff11005f9ddaf
R12: ffff88802fceed38
[ 128.450641][ C0] R13: 0000000000000000 R14: ffff888003b57138
R15: ffff88802fceedc8
[ 128.451827][ C0] ? arch_stack_walk (arch/x86/kernel/stacktrace.c:24)
[ 128.452482][ C0] skcipher_walk_virt+0x4be/0x7e0
[ 128.453242][ C0] glue_xts_req_128bit+0x110/0x6f0 glue_helper
[ 128.454175][ C0] ? aesni_set_key+0x1e0/0x1e0 aesni_intel
[ 128.455042][ C0] ? irq_exit_rcu (kernel/softirq.c:406
kernel/softirq.c:425 kernel/softirq.c:435)
[ 128.455719][ C0] ? glue_xts_crypt_128bit_one+0x280/0x280 glue_helper
[ 128.456753][ C0] asm_common_interrupt+0x1e/0x40
[ 128.457530][ C0] RIP: b8fa2500:0xdffffc0000000000
[ 128.458305][ C0] Code: Unable to access opcode bytes at RIP
0xdffffbffffffffd6.

Code starting with the faulting instruction
===========================================
[ 128.459443][ C0] RSP: 974be3f3:ffff88809c437290 EFLAGS: 00000004
ORIG_RAX: 0000001000000010
[ 128.460755][ C0] RAX: 0000000000000000 RBX: ffff888003b571b8
RCX: 0000000000000000
[ 128.461967][ C0] RDX: ffff888003b57240 RSI: ffff888003b57240
RDI: ffffffe000000010
[ 128.463152][ C0] RBP: dffffc0000000200 R08: 0000000000000801
R09: ffffea0001123480
[ 128.464345][ C0] R10: ffffed1000000200 R11: ffffffff00000000
R12: ffff888000000000
[ 128.465522][ C0] R13: ffff888003b57138 R14: ffff88809c437290
R15: ffffea00002c5b08
[ 128.466710][ C0] ? get_page_from_freelist (mm/page_alloc.c:3913)
[ 128.467560][ C0] ? worker_thread (include/linux/list.h:282
kernel/workqueue.c:2419)
[ 128.468279][ C0] ? kthread (kernel/kthread.c:292)
[ 128.468919][ C0] ? ret_from_fork (arch/x86/entry/entry_64.S:302)
[ 128.469607][ C0] ? __writeback_inodes_wb (fs/fs-writeback.c:1793)
[ 128.470418][ C0] ? wb_writeback (fs/fs-writeback.c:1898)
[ 128.471145][ C0] ? process_one_work
(arch/x86/include/asm/jump_label.h:25 include/linux/jump_label.h:200
include/trace/events/workqueue.h:108 kernel/workqueue.c:2277)
[ 128.471930][ C0] ? worker_thread (include/linux/list.h:282
kernel/workqueue.c:2419)
[ 128.472668][ C0] ? ret_from_fork (arch/x86/entry/entry_64.S:302)
[ 128.473329][ C0] ? __zone_watermark_ok (mm/page_alloc.c:3793)
[ 128.474065][ C0] ? __kasan_kmalloc.constprop.0
(mm/kasan/common.c:56 mm/kasan/common.c:461)
[ 128.474914][ C0] ? crypt_convert+0x27e5/0x4530 dm_crypt
[ 128.475796][ C0] ? mempool_alloc (mm/mempool.c:392)
[ 128.476493][ C0] ? crypt_iv_tcw_ctr+0x4a0/0x4a0 dm_crypt
[ 128.477433][ C0] ? bio_add_page (block/bio.c:943)
[ 128.478129][ C0] ? __bio_try_merge_page (block/bio.c:935)
[ 128.478923][ C0] ? bio_associate_blkg (block/blk-cgroup.c:1869)
[ 128.479693][ C0] ? kcryptd_crypt_write_convert+0x581/0xa10 dm_crypt
[ 128.480721][ C0] ? crypt_map+0x5c1/0xc70 dm_crypt
[ 128.481527][ C0] ? bio_clone_blkg_association (block/blk-cgroup.c:1883)
[ 128.482426][ C0] ? __map_bio.isra.0+0x109/0x450 dm_mod
[ 128.483310][ C0] ? __split_and_process_non_flush+0x728/0xd10 dm_mod
[ 128.484354][ C0] ? __send_empty_flush+0x4b0/0x4b0 dm_mod
[ 128.485223][ C0] ? __part_start_io_acct (block/blk-core.c:1336)
[ 128.486009][ C0] ? dm_submit_bio+0x4f1/0xec0 dm_mod
[ 128.486829][ C0] ? __split_and_process_non_flush+0xd10/0xd10 dm_mod
[ 128.487915][ C0] ? submit_bio_noacct (block/blk-core.c:934
block/blk-core.c:982 block/blk-core.c:1061)
[ 128.488686][ C0] ? _cond_resched (kernel/sched/core.c:6124)
[ 128.489388][ C0] ? blk_queue_enter (block/blk-core.c:1044)
[ 128.490300][ C0] ? iomap_readahead (fs/iomap/buffered-io.c:1438)
[ 128.491041][ C0] ? write_one_page (mm/page-writeback.c:2171)
[ 128.491759][ C0] ? submit_bio (block/blk-core.c:1079)
[ 128.492432][ C0] ? submit_bio_noacct (block/blk-core.c:1079)
[ 128.493248][ C0] ? _raw_spin_lock
(arch/x86/include/asm/atomic.h:202
include/asm-generic/atomic-instrumented.h:707
include/asm-generic/qspinlock.h:82 include/linux/spinlock.h:183
include/linux/spinlock_api_smp.h:143 kernel/locking/spinlock.c:151)
[ 128.493975][ C0] ? iomap_submit_ioend (fs/iomap/buffered-io.c:1215)
[ 128.494761][ C0] ? xfs_vm_writepages (fs/xfs/xfs_aops.c:578)
[ 128.495529][ C0] ? xfs_dax_writepages (fs/xfs/xfs_aops.c:578)
[ 128.496278][ C0] ? __blk_mq_do_dispatch_sched
(block/blk-mq-sched.c:135 (discriminator 1))
[ 128.497120][ C0] ? do_writepages (mm/page-writeback.c:2355)
[ 128.497831][ C0] ? page_writeback_cpu_online (mm/page-writeback.c:2345)
[ 128.498681][ C0] ? _raw_spin_lock
(arch/x86/include/asm/atomic.h:202
include/asm-generic/atomic-instrumented.h:707
include/asm-generic/qspinlock.h:82 include/linux/spinlock.h:183
include/linux/spinlock_api_smp.h:143 kernel/locking/spinlock.c:151)
[ 128.499405][ C0] ? wake_up_bit (kernel/sched/wait_bit.c:15
kernel/sched/wait_bit.c:149)
[ 128.500072][ C0] ? __writeback_single_inode (fs/fs-writeback.c:1470)
[ 128.500908][ C0] ? writeback_sb_inodes (fs/fs-writeback.c:1725)
[ 128.501703][ C0] ? __writeback_single_inode (fs/fs-writeback.c:1634)
[ 128.502571][ C0] ? finish_writeback_work.constprop.0
(fs/fs-writeback.c:1242)
[ 128.503525][ C0] ? __writeback_inodes_wb (fs/fs-writeback.c:1793)
[ 128.504336][ C0] ? wb_writeback (fs/fs-writeback.c:1898)
[ 128.505031][ C0] ? __writeback_inodes_wb (fs/fs-writeback.c:1846)
[ 128.505902][ C0] ? cpumask_next (lib/cpumask.c:24)
[ 128.506570][ C0] ? get_nr_dirty_inodes (fs/inode.c:94 fs/inode.c:102)
[ 128.507348][ C0] ? wb_workfn (fs/fs-writeback.c:2054
fs/fs-writeback.c:2082)
[ 128.508014][ C0] ? dequeue_entity (kernel/sched/fair.c:4347)
[ 128.508744][ C0] ? inode_wait_for_writeback (fs/fs-writeback.c:2065)
[ 128.509586][ C0] ? put_prev_entity (kernel/sched/fair.c:4501)
[ 128.510300][ C0] ? __switch_to
(arch/x86/include/asm/bitops.h:55
include/asm-generic/bitops/instrumented-atomic.h:29
include/linux/thread_info.h:55 arch/x86/include/asm/fpu/internal.h:572
arch/x86/kernel/process_64.c:598)
[ 128.510990][ C0] ? __switch_to_asm (arch/x86/entry/entry_64.S:255)
[ 128.511695][ C0] ? __schedule (kernel/sched/core.c:3782
kernel/sched/core.c:4528)
[ 128.512373][ C0] ? process_one_work
(arch/x86/include/asm/jump_label.h:25 include/linux/jump_label.h:200
include/trace/events/workqueue.h:108 kernel/workqueue.c:2277)
[ 128.513133][ C0] ? worker_thread (include/linux/list.h:282
kernel/workqueue.c:2419)
[ 128.513850][ C0] ? rescuer_thread (kernel/workqueue.c:2361)
[ 128.514566][ C0] ? kthread (kernel/kthread.c:292)
[ 128.515200][ C0] ? __kthread_bind_mask (kernel/kthread.c:245)
[ 128.515960][ C0] ? ret_from_fork (arch/x86/entry/entry_64.S:302)
[ 128.516641][ C0]
[ 128.516983][ C0] The buggy address belongs to the page:
[ 128.517838][ C0] page:000000007a390a2b refcount:0 mapcount:0
mapping:0000000000000000 index:0x0 pfn:0x2fcee
[ 128.519428][ C0] flags: 0x1ffff800000000()
[ 128.520102][ C0] raw: 001ffff800000000 ffffea0000bf3b88
ffffea0000bf3b88 0000000000000000
[ 128.521396][ C0] raw: 0000000000000000 0000000000000000
00000000ffffffff 0000000000000000
[ 128.522673][ C0] page dumped because: kasan: bad access detected
[ 128.523642][ C0]
[ 128.523984][ C0] addr ffff88802fceede0 is located in stack of
task kworker/u2:2/591 at offset 216 in frame:
[ 128.525503][ C0] glue_xts_req_128bit+0x0/0x6f0 glue_helper
[ 128.526390][ C0]
[ 128.526745][ C0] this frame has 5 objects:
[ 128.527405][ C0] [48, 200) 'walk'
[ 128.527407][ C0] [272, 304) 'b'
[ 128.527969][ C0] [336, 400) 's'
[ 128.528509][ C0] [432, 496) 'd'
[ 128.529047][ C0] [528, 608) 'subreq'
[ 128.529607][ C0]
[ 128.530568][ C0] Memory state around the buggy address:
[ 128.531443][ C0] ffff88802fceec80: 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00
[ 128.532708][ C0] ffff88802fceed00: 00 f1 f1 f1 f1 f1 f1 00 00
00 00 00 00 00 00 00
[ 128.533911][ C0] >ffff88802fceed80: 00 00 00 00 00 00 00 00 00
00 f2 f2 f2 f2 f2 f2
[ 128.535106][ C0] ^
[ 128.536197][ C0] ffff88802fceee00: f2 f2 f2 00 00 00 00 f2 f2
f2 f2 00 00 00 00 00
[ 128.537404][ C0] ffff88802fceee80: 00 00 00 f2 f2 f2 f2 00 00
00 00 00 00 00 00 f2

There are other stacks that end in the same place without dm-crypt
involvement, but they are much harder for us to reproduce, so let's
stick with this one.

After some bisecting from myself and Ignat, we were able to find the
commit that fixes the issue, which is:

* https://github.com/torvalds/linux/commit/ce8f86ee94fabcc98537ddccd7e82cfd360a4dc5?w=1

mm/page_alloc: add a missing mm_page_alloc_zone_locked() tracepoint

The trace point *trace_mm_page_alloc_zone_locked()* in __rmqueue() does
not currently cover all branches. Add the missing tracepoint and check
the page before do that.

We don't have CONFIG_CMA enabled, so it can be distilled to:

$ git diff HEAD^..HEAD
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 14b9e83ff9da..b5961d530929 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2871,7 +2871,8 @@ __rmqueue(struct zone *zone, unsigned int order,
int migratetype,
goto retry;
}

- trace_mm_page_alloc_zone_locked(page, order, migratetype);
+ if (page)
+ trace_mm_page_alloc_zone_locked(page, order, migratetype);
return page;
}

If I apply this patch on top of 5.10.11, the issue disappears.

I can't say I understand the connection here.

It's worth mentioning that the issue doesn't reproduce with
UNWINDER_FRAME_POINTER rather than UNWINDER_ORC. This fact makes me
think that ORC is to blame here somehow, but it's beyond my
understanding.

Here's how I replicate the issue in qemu running Debian Buster:

# /tmp is tmpfs in our case
$ qemu-img create -f qcow2 /tmp/nvme-$USER.img 10G

$ sudo qemu-system-x86_64 -smp 1 -m 3G -enable-kvm -cpu host -kernel
~/vmlinuz -initrd ~/initrd.img -nographic -device e1000 -device
nvme,drive=nvme0,serial=deadbeaf1,num_queues=8 -drive
file=/tmp/nvme-$USER.img,if=none,id=nvme0 -append 'console=ttyS0
kasan_multi_shot'

Inside of the VM:

root@localhost:~# echo -e '[Match]\nName=enp*\n[Network]\nDHCP=yes' >
/etc/systemd/network/00-dhcp.network
root@localhost:~# systemctl restart systemd-networkd
root@localhost:~# apt-get update
root@localhost:~# apt-get install -y --no-install-recommends cryptsetup
root@localhost:~# echo potato > keyfile
root@localhost:~# chmod 0400 keyfile
root@localhost:~# cryptsetup -q luksFormat /dev/nvme0n1 keyfile
root@localhost:~# cryptsetup open --type luks --key-file keyfile
--disable-keyring /dev/nvme0n1 luks-nvme0n1
root@localhost:~# dmsetup table /dev/mapper/luks-nvme0n1 | sed 's/$/ 2
no_read_workqueue no_write_workqueue/' | dmsetup reload
/dev/mapper/luks-nvme0n1
root@localhost:~# dmsetup suspend /dev/mapper/luks-nvme0n1 && dmsetup
resume /dev/mapper/luks-nvme0n1
root@localhost:~# mkfs.xfs -f /dev/mapper/luks-nvme0n1
root@localhost:~# mount /dev/mapper/luks-nvme0n1 /mnt

The workload that triggers the KASAN complaint is the following:

root@localhost:~# while true; do rm -f /mnt/random.data.target && dd
if=/dev/zero of=/mnt/random.data bs=10M count=400 status=progress &&
mv /mnt/random.data /mnt/random.data.target; sleep 1; done

It might take a few iterations to trigger.

Note that dmcrypt setup in our case depends on Ignat's patches, which
are included in 5.10.11 and 5.11-rc5, so during bisection between
5.11-rc3 and 5.11-rc4 they needed to be reapplied.

I'm going to ask for a backport of the "fix" to stable, but it feels
like there's a bigger issue here.