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;
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: {
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;
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);