]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - virt/kvm/kvm_main.c
KVM: introduce kvm_arch_vcpu_async_ioctl
[linux.git] / virt / kvm / kvm_main.c
index 37217ec647b416b20aac353554b260df997736a0..b4414842b02392136a4c6625153bb6680ab4d733 100644 (file)
@@ -2544,15 +2544,13 @@ static long kvm_vcpu_ioctl(struct file *filp,
        if (unlikely(_IOC_TYPE(ioctl) != KVMIO))
                return -EINVAL;
 
-#if defined(CONFIG_S390) || defined(CONFIG_PPC) || defined(CONFIG_MIPS)
        /*
-        * Special cases: vcpu ioctls that are asynchronous to vcpu execution,
-        * so vcpu_load() would break it.
+        * Some architectures have vcpu ioctls that are asynchronous to vcpu
+        * execution; mutex_lock() would break them.
         */
-       if (ioctl == KVM_S390_INTERRUPT || ioctl == KVM_S390_IRQ || ioctl == KVM_INTERRUPT)
-               return kvm_arch_vcpu_ioctl(filp, ioctl, arg);
-#endif
-
+       r = kvm_arch_vcpu_async_ioctl(filp, ioctl, arg);
+       if (r != -ENOIOCTLCMD)
+               return r;
 
        if (mutex_lock_killable(&vcpu->mutex))
                return -EINTR;
@@ -2673,9 +2671,7 @@ static long kvm_vcpu_ioctl(struct file *filp,
                r = -EFAULT;
                if (copy_from_user(&dbg, argp, sizeof(dbg)))
                        goto out;
-               vcpu_load(vcpu);
                r = kvm_arch_vcpu_ioctl_set_guest_debug(vcpu, &dbg);
-               vcpu_put(vcpu);
                break;
        }
        case KVM_SET_SIGNAL_MASK: {
@@ -2706,9 +2702,7 @@ static long kvm_vcpu_ioctl(struct file *filp,
                r = -ENOMEM;
                if (!fpu)
                        goto out;
-               vcpu_load(vcpu);
                r = kvm_arch_vcpu_ioctl_get_fpu(vcpu, fpu);
-               vcpu_put(vcpu);
                if (r)
                        goto out;
                r = -EFAULT;
@@ -2724,15 +2718,11 @@ static long kvm_vcpu_ioctl(struct file *filp,
                        fpu = NULL;
                        goto out;
                }
-               vcpu_load(vcpu);
                r = kvm_arch_vcpu_ioctl_set_fpu(vcpu, fpu);
-               vcpu_put(vcpu);
                break;
        }
        default:
-               vcpu_load(vcpu);
                r = kvm_arch_vcpu_ioctl(filp, ioctl, arg);
-               vcpu_put(vcpu);
        }
 out:
        mutex_unlock(&vcpu->mutex);