• Oliver Upton's avatar
    KVM: arm64: Don't initialize idreg debugfs w/ preemption disabled · 5c1ebe9a
    Oliver Upton authored
    Testing KVM with DEBUG_ATOMIC_SLEEP enabled doesn't get far before hitting the
    first splat:
    
      BUG: sleeping function called from invalid context at kernel/locking/rwsem.c:1578
      in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 13062, name: vgic_lpi_stress
      preempt_count: 1, expected: 0
      2 locks held by vgic_lpi_stress/13062:
       #0: ffff080084553240 (&vcpu->mutex){+.+.}-{3:3}, at: kvm_vcpu_ioctl+0xc0/0x13f0
       #1: ffff800080485f08 (&kvm->arch.config_lock){+.+.}-{3:3}, at: kvm_arch_vcpu_ioctl+0xd60/0x1788
      CPU: 19 PID: 13062 Comm: vgic_lpi_stress Tainted: G        W  O       6.8.0-dbg-DEV #1
      Call trace:
       dump_backtrace+0xf8/0x148
       show_stack+0x20/0x38
       dump_stack_lvl+0xb4/0xf8
       dump_stack+0x18/0x40
       __might_resched+0x248/0x2a0
       __might_sleep+0x50/0x88
       down_write+0x30/0x150
       start_creating+0x90/0x1a0
       __debugfs_create_file+0x5c/0x1b0
       debugfs_create_file+0x34/0x48
       kvm_reset_sys_regs+0x120/0x1e8
       kvm_reset_vcpu+0x148/0x270
       kvm_arch_vcpu_ioctl+0xddc/0x1788
       kvm_vcpu_ioctl+0xb6c/0x13f0
       __arm64_sys_ioctl+0x98/0xd8
       invoke_syscall+0x48/0x108
       el0_svc_common+0xb4/0xf0
       do_el0_svc+0x24/0x38
       el0_svc+0x54/0x128
       el0t_64_sync_handler+0x68/0xc0
       el0t_64_sync+0x1a8/0x1b0
    
    kvm_reset_vcpu() disables preemption as it needs to unload vCPU state
    from the CPU to twiddle with it, which subsequently explodes when
    taking the parent inode's rwsem while creating the idreg debugfs file.
    
    Fix it by moving the initialization to kvm_arch_create_vm_debugfs().
    
    Fixes: 89176658 ("KVM: arm64: Add debugfs file for guest's ID registers")
    Reviewed-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20240227094115.1723330-3-oliver.upton@linux.devSigned-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
    5c1ebe9a
kvm_host.h 41.1 KB