On Thu, 16 Oct 2025 17:32:20 -0700 Sean Christopherson <[email protected]> wrote:
> Rename the "async" ioctl API to "unlocked" so that upcoming usage in x86's > TDX code doesn't result in a massive misnomer. To avoid having to retry > SEAMCALLs, TDX needs to acquire kvm->lock *and* all vcpu->mutex locks, and > acquiring all of those locks after/inside the current vCPU's mutex is a > non-starter. However, TDX also needs to acquire the vCPU's mutex and load > the vCPU, i.e. the handling is very much not async to the vCPU. > > No functional change intended. > > Signed-off-by: Sean Christopherson <[email protected]> Acked-by: Claudio Imbrenda <[email protected]> > --- > arch/arm64/kvm/arm.c | 4 ++-- > arch/loongarch/kvm/vcpu.c | 4 ++-- > arch/mips/kvm/mips.c | 4 ++-- > arch/powerpc/kvm/powerpc.c | 4 ++-- > arch/riscv/kvm/vcpu.c | 4 ++-- > arch/s390/kvm/kvm-s390.c | 4 ++-- > arch/x86/kvm/x86.c | 4 ++-- > include/linux/kvm_host.h | 4 ++-- > virt/kvm/kvm_main.c | 6 +++--- > 9 files changed, 19 insertions(+), 19 deletions(-) > > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c > index 785aaaee6a5d..e8d654024608 100644 > --- a/arch/arm64/kvm/arm.c > +++ b/arch/arm64/kvm/arm.c > @@ -1828,8 +1828,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp, > return r; > } > > -long kvm_arch_vcpu_async_ioctl(struct file *filp, unsigned int ioctl, > - unsigned long arg) > +long kvm_arch_vcpu_unlocked_ioctl(struct file *filp, unsigned int ioctl, > + unsigned long arg) > { > return -ENOIOCTLCMD; > } > diff --git a/arch/loongarch/kvm/vcpu.c b/arch/loongarch/kvm/vcpu.c > index 30e3b089a596..9a5844e85fd3 100644 > --- a/arch/loongarch/kvm/vcpu.c > +++ b/arch/loongarch/kvm/vcpu.c > @@ -1471,8 +1471,8 @@ int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, > struct kvm_interrupt *irq) > return 0; > } > > -long kvm_arch_vcpu_async_ioctl(struct file *filp, > - unsigned int ioctl, unsigned long arg) > +long kvm_arch_vcpu_unlocked_ioctl(struct file *filp, unsigned int ioctl, > + unsigned long arg) > { > void __user *argp = (void __user *)arg; > struct kvm_vcpu *vcpu = filp->private_data; > diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c > index a75587018f44..b0fb92fda4d4 100644 > --- a/arch/mips/kvm/mips.c > +++ b/arch/mips/kvm/mips.c > @@ -895,8 +895,8 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu > *vcpu, > return r; > } > > -long kvm_arch_vcpu_async_ioctl(struct file *filp, unsigned int ioctl, > - unsigned long arg) > +long kvm_arch_vcpu_unlocked_ioctl(struct file *filp, unsigned int ioctl, > + unsigned long arg) > { > struct kvm_vcpu *vcpu = filp->private_data; > void __user *argp = (void __user *)arg; > diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c > index 2ba057171ebe..9a89a6d98f97 100644 > --- a/arch/powerpc/kvm/powerpc.c > +++ b/arch/powerpc/kvm/powerpc.c > @@ -2028,8 +2028,8 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu > *vcpu, > return -EINVAL; > } > > -long kvm_arch_vcpu_async_ioctl(struct file *filp, > - unsigned int ioctl, unsigned long arg) > +long kvm_arch_vcpu_unlocked_ioctl(struct file *filp, unsigned int ioctl, > + unsigned long arg) > { > struct kvm_vcpu *vcpu = filp->private_data; > void __user *argp = (void __user *)arg; > diff --git a/arch/riscv/kvm/vcpu.c b/arch/riscv/kvm/vcpu.c > index bccb919ca615..a4bd6077eecc 100644 > --- a/arch/riscv/kvm/vcpu.c > +++ b/arch/riscv/kvm/vcpu.c > @@ -238,8 +238,8 @@ vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, > struct vm_fault *vmf) > return VM_FAULT_SIGBUS; > } > > -long kvm_arch_vcpu_async_ioctl(struct file *filp, > - unsigned int ioctl, unsigned long arg) > +long kvm_arch_vcpu_unlocked_ioctl(struct file *filp, unsigned int ioctl, > + unsigned long arg) > { > struct kvm_vcpu *vcpu = filp->private_data; > void __user *argp = (void __user *)arg; > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index 16ba04062854..8c4caa5f2fcd 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -5730,8 +5730,8 @@ static long kvm_s390_vcpu_memsida_op(struct kvm_vcpu > *vcpu, > return r; > } > > -long kvm_arch_vcpu_async_ioctl(struct file *filp, > - unsigned int ioctl, unsigned long arg) > +long kvm_arch_vcpu_unlocked_ioctl(struct file *filp, unsigned int ioctl, > + unsigned long arg) > { > struct kvm_vcpu *vcpu = filp->private_data; > void __user *argp = (void __user *)arg; > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index ca5ba2caf314..b85cb213a336 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -7240,8 +7240,8 @@ static int kvm_vm_ioctl_set_clock(struct kvm *kvm, void > __user *argp) > return 0; > } > > -long kvm_arch_vcpu_async_ioctl(struct file *filp, unsigned int ioctl, > - unsigned long arg) > +long kvm_arch_vcpu_unlocked_ioctl(struct file *filp, unsigned int ioctl, > + unsigned long arg) > { > return -ENOIOCTLCMD; > } > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index 7186b2ae4b57..d93f75b05ae2 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -1557,6 +1557,8 @@ long kvm_arch_dev_ioctl(struct file *filp, > unsigned int ioctl, unsigned long arg); > long kvm_arch_vcpu_ioctl(struct file *filp, > unsigned int ioctl, unsigned long arg); > +long kvm_arch_vcpu_unlocked_ioctl(struct file *filp, > + unsigned int ioctl, unsigned long arg); > vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf); > > int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext); > @@ -2437,8 +2439,6 @@ static inline bool kvm_arch_no_poll(struct kvm_vcpu > *vcpu) > } > #endif /* CONFIG_HAVE_KVM_NO_POLL */ > > -long kvm_arch_vcpu_async_ioctl(struct file *filp, > - unsigned int ioctl, unsigned long arg); > void kvm_arch_guest_memory_reclaimed(struct kvm *kvm); > > #ifdef CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index b7a0ae2a7b20..b7db1d5f71a8 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -4434,10 +4434,10 @@ static long kvm_vcpu_ioctl(struct file *filp, > return r; > > /* > - * Some architectures have vcpu ioctls that are asynchronous to vcpu > - * execution; mutex_lock() would break them. > + * Let arch code handle select vCPU ioctls without holding vcpu->mutex, > + * e.g. to support ioctls that can run asynchronous to vCPU execution. > */ > - r = kvm_arch_vcpu_async_ioctl(filp, ioctl, arg); > + r = kvm_arch_vcpu_unlocked_ioctl(filp, ioctl, arg); > if (r != -ENOIOCTLCMD) > return r; >
