Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5cb0944c authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

KVM: introduce kvm_arch_vcpu_async_ioctl



After the vcpu_load/vcpu_put pushdown, the handling of asynchronous VCPU
ioctl is already much clearer in that it is obvious that they bypass
vcpu_load and vcpu_put.

However, it is still not perfect in that the different state of the VCPU
mutex is still hidden in the caller.  Separate those ioctls into a new
function kvm_arch_vcpu_async_ioctl that returns -ENOIOCTLCMD for more
"traditional" synchronous ioctls.

Cc: James Hogan <jhogan@kernel.org>
Cc: Paul Mackerras <paulus@ozlabs.org>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
Suggested-by: default avatarCornelia Huck <cohuck@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 9b062471
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ config KVM
	select PREEMPT_NOTIFIERS
	select ANON_INODES
	select KVM_GENERIC_DIRTYLOG_READ_PROTECT
	select HAVE_KVM_VCPU_ASYNC_IOCTL
	select KVM_MMIO
	select MMU_NOTIFIER
	select SRCU
+12 −3
Original line number Diff line number Diff line
@@ -903,12 +903,11 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
	return r;
}

long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl,
long kvm_arch_vcpu_async_ioctl(struct file *filp, unsigned int ioctl,
			       unsigned long arg)
{
	struct kvm_vcpu *vcpu = filp->private_data;
	void __user *argp = (void __user *)arg;
	long r;

	if (ioctl == KVM_INTERRUPT) {
		struct kvm_mips_interrupt irq;
@@ -921,6 +920,16 @@ long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl,
		return kvm_vcpu_ioctl_interrupt(vcpu, &irq);
	}

	return -ENOIOCTLCMD;
}

long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl,
			 unsigned long arg)
{
	struct kvm_vcpu *vcpu = filp->private_data;
	void __user *argp = (void __user *)arg;
	long r;

	vcpu_load(vcpu);

	switch (ioctl) {
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ config KVM
	select PREEMPT_NOTIFIERS
	select ANON_INODES
	select HAVE_KVM_EVENTFD
	select HAVE_KVM_VCPU_ASYNC_IOCTL
	select SRCU
	select KVM_VFIO
	select IRQ_BYPASS_MANAGER
+11 −3
Original line number Diff line number Diff line
@@ -1607,12 +1607,11 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
	return -EINVAL;
}

long kvm_arch_vcpu_ioctl(struct file *filp,
long kvm_arch_vcpu_async_ioctl(struct file *filp,
			       unsigned int ioctl, unsigned long arg)
{
	struct kvm_vcpu *vcpu = filp->private_data;
	void __user *argp = (void __user *)arg;
	long r;

	if (ioctl == KVM_INTERRUPT) {
		struct kvm_interrupt irq;
@@ -1620,6 +1619,15 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
			return -EFAULT;
		return kvm_vcpu_ioctl_interrupt(vcpu, &irq);
	}
	return -ENOIOCTLCMD;
}

long kvm_arch_vcpu_ioctl(struct file *filp,
                         unsigned int ioctl, unsigned long arg)
{
	struct kvm_vcpu *vcpu = filp->private_data;
	void __user *argp = (void __user *)arg;
	long r;

	vcpu_load(vcpu);

+1 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ config KVM
	select PREEMPT_NOTIFIERS
	select ANON_INODES
	select HAVE_KVM_CPU_RELAX_INTERCEPT
	select HAVE_KVM_VCPU_ASYNC_IOCTL
	select HAVE_KVM_EVENTFD
	select KVM_ASYNC_PF
	select KVM_ASYNC_PF_SYNC
Loading