On Wed, May 14, 2025 at 04:41:41PM -0700, Ackerley Tng wrote: > +static enum shareability kvm_gmem_shareability_get(struct inode *inode, > + pgoff_t index) > +{ > + struct maple_tree *mt; > + void *entry; > + > + mt = &kvm_gmem_private(inode)->shareability; > + entry = mtree_load(mt, index); > + WARN(!entry, > + "Shareability should always be defined for all indices in inode."); > + > + return xa_to_value(entry); > +} > + Hi Ackerley, Not sure if it's a known issue. Just want to let you know in case you're unaware. During a test to repeatedly launching/destroying TDs, I encountered a warning from kvm_gmem_shareability_get() (see the attached log at the bottom). The reproducing rate is 1 in every 20-100 times of launching TD. After some analysis, I found that the warning was produced by kvm_gmem_shareability_get() when it's called from kvm_gmem_is_private(), which is not protected by any locks. I can get rid of the warning by either fix 1 or fix 2 below. (I prefer fix 1 though :)) fix 1: diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index e78fbebf4f53..136d46c5b2ab 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -2024,7 +2024,7 @@ static struct inode *kvm_gmem_inode_make_secure_inode(const char *name, #ifdef CONFIG_KVM_GMEM_SHARED_MEM if (flags & GUEST_MEMFD_FLAG_SUPPORT_SHARED) { - mt_init(&private->shareability); + mt_init_flags(&private->shareability, MT_FLAGS_USE_RCU); err = kvm_gmem_shareability_setup(private, size, flags); if (err) fix 2: diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index e78fbebf4f53..9a4518104d56 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -171,7 +171,9 @@ static enum shareability kvm_gmem_shareability_get(struct inode *inode, void *entry; mt = &kvm_gmem_private(inode)->shareability; + mtree_lock(mt); entry = mtree_load(mt, index); + mtree_unlock(mt); WARN(!entry, "Shareability should always be defined for all indices in inode."); Thanks Yan [ 845.253021] ------------[ cut here ]------------ [ 845.259236] Shareability should always be defined for all indices in inode. [ 845.259273] WARNING: CPU: 148 PID: 3775 at arch/x86/kvm/../../../virt/kvm/guest_memfd.c:175 kvm_gmem_shareability_get.isra.0+0x39/0x50 [kvm] [ 845.283330] Modules linked in: kvm_intel i2c_i801 idxd i2c_smbus i2c_ismt kvm irqbypass nls_iso8859_1 nls_cp437 squashfs ghash_clmulni_intel hid_generic aesni_intel [ 845.300914] CPU: 148 UID: 0 PID: 3775 Comm: qemu-system-x86 Tainted: G S 6.16.0-rc6-upstream+ #520 PREEMPT(voluntary) 49e4d0c13b52dd8fe7006bbbb80b018c4576ab2d [ 845.319631] Tainted: [S]=CPU_OUT_OF_SPEC [ 845.324956] Hardware name: Intel Corporation ArcherCity/ArcherCity, BIOS EGSDCRB1.SYS.0101.D29.2303301937 03/30/2023 [ 845.337749] RIP: 0010:kvm_gmem_shareability_get.isra.0+0x39/0x50 [kvm] [ 845.346085] Code: bf 48 02 00 00 e8 a7 d4 08 d1 48 85 c0 74 09 c9 48 d1 e8 c3 cc cc cc cc 48 89 45 f8 90 48 c7 c7 a0 56 5c c0 e8 68 3c b5 cf 90 <0f> 0b 90 90 48 8b 45 f8 c9 48 d1 e8 c3 cc cc cc cc 66 0f 1f 44 00 [ 845.368227] RSP: 0018:ff29e9c2e336baa0 EFLAGS: 00010282 [ 845.375038] RAX: 0000000000000000 RBX: 00000000001825d4 RCX: 0000000000000000 [ 845.384020] RDX: 0000000000000002 RSI: 0000000000000001 RDI: 00000000ffffffff [ 845.392966] RBP: ff29e9c2e336baa8 R08: 0000000000000000 R09: 0000000000000000 [ 845.401912] R10: 0000000000000001 R11: 0000000000000000 R12: ff1236f76e067a80 [ 845.410878] R13: ff1236f76e0ecc00 R14: 0000000000000000 R15: ff1236f783af8000 [ 845.419850] FS: 00007f8b863fc6c0(0000) GS:ff12370458883000(0000) knlGS:0000000000000000 [ 845.429915] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 845.437304] CR2: 0000000000000000 CR3: 00000003e9989005 CR4: 0000000000773ef0 [ 845.446265] PKRU: 55555554 [ 845.450224] Call Trace: [ 845.453887] <TASK> [ 845.457161] kvm_gmem_is_private+0x4b/0x70 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.467348] kvm_mmu_faultin_pfn+0x14a/0x360 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.477740] kvm_tdp_page_fault+0x97/0xf0 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.487843] kvm_mmu_do_page_fault+0x23d/0x290 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.505524] ? __this_cpu_preempt_check+0x13/0x20 [ 845.515349] kvm_mmu_page_fault+0x8c/0x3d0 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.529136] tdx_handle_ept_violation+0x16a/0x310 [kvm_intel 1efe846cc4054cc289d319f1912cf040ec0ca0e6] [ 845.547760] tdx_handle_exit+0x44f/0x540 [kvm_intel 1efe846cc4054cc289d319f1912cf040ec0ca0e6] [ 845.565647] ? lock_acquire+0x52/0x70 [ 845.574284] ? vcpu_enter_guest+0x452/0x11d0 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.591886] vt_handle_exit+0x25/0x30 [kvm_intel 1efe846cc4054cc289d319f1912cf040ec0ca0e6] [ 845.609407] vcpu_enter_guest+0x4b1/0x11d0 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.623253] ? kvm_apic_local_deliver+0x8a/0xe0 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.641247] vcpu_run+0x4d/0x280 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.654096] ? vcpu_run+0x4d/0x280 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.667165] kvm_arch_vcpu_ioctl_run+0x544/0x890 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.685231] kvm_vcpu_ioctl+0x143/0x7c0 [kvm 6f655eadf3c2ae71b90b04a3d4ef5b799600c3f8] [ 845.698810] ? __fget_files+0xc2/0x1b0 [ 845.707633] ? __this_cpu_preempt_check+0x13/0x20 [ 845.717555] ? __fget_files+0xcc/0x1b0 [ 845.726405] __x64_sys_ioctl+0x9a/0xf0 [ 845.735241] ? __this_cpu_preempt_check+0x13/0x20 [ 845.745163] x64_sys_call+0x1054/0x20c0 [ 845.754043] do_syscall_64+0xc3/0x470 [ 845.762701] entry_SYSCALL_64_after_hwframe+0x77/0x7f [ 845.772906] RIP: 0033:0x7f8d9c124ded [ 845.781398] Code: 04 25 28 00 00 00 48 89 45 c8 31 c0 48 8d 45 10 c7 45 b0 10 00 00 00 48 89 45 b8 48 8d 45 d0 48 89 45 c0 b8 10 00 00 00 0f 05 <89> c2 3d 00 f0 ff ff 77 1a 48 8b 45 c8 64 48 2b 04 25 28 00 00 00 [ 845.814651] RSP: 002b:00007f8b863f7cd0 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 [ 845.827882] RAX: ffffffffffffffda RBX: 00007f8b863fccdc RCX: 00007f8d9c124ded [ 845.840591] RDX: 0000000000000000 RSI: 000000000000ae80 RDI: 000000000000001e [ 845.853201] RBP: 00007f8b863f7d20 R08: 0000000000000000 R09: 0000000000000000 [ 845.865776] R10: 0000000000000000 R11: 0000000000000246 R12: 00007f8b863fc6c0 [ 845.878246] R13: ffffffffffffdbf0 R14: 0000000000000007 R15: 00007ffedb593c00 [ 845.890732] </TASK> [ 845.897565] irq event stamp: 859157 [ 845.905815] hardirqs last enabled at (859171): [<ffffffff902447d3>] __up_console_sem+0x63/0x90 [ 845.923321] hardirqs last disabled at (859184): [<ffffffff902447b8>] __up_console_sem+0x48/0x90 [ 845.940892] softirqs last enabled at (859126): [<ffffffff90194ef8>] handle_softirqs+0x358/0x4b0 [ 845.958654] softirqs last disabled at (859207): [<ffffffff901951cf>] __irq_exit_rcu+0xef/0x170 [ 845.976232] ---[ end trace 0000000000000000 ]---