mirror of https://gitee.com/openkylin/linux.git
kvm: make KVM_CAP_ENABLE_CAP_VM architecture agnostic
The first such capability to be handled in virt/kvm/ will be manual dirty page reprotection. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
bb22dc14a2
commit
e5d83c74a5
|
@ -1129,10 +1129,15 @@ documentation when it pops into existence).
|
||||||
|
|
||||||
4.37 KVM_ENABLE_CAP
|
4.37 KVM_ENABLE_CAP
|
||||||
|
|
||||||
Capability: KVM_CAP_ENABLE_CAP, KVM_CAP_ENABLE_CAP_VM
|
Capability: KVM_CAP_ENABLE_CAP
|
||||||
Architectures: x86 (only KVM_CAP_ENABLE_CAP_VM),
|
Architectures: mips, ppc, s390
|
||||||
mips (only KVM_CAP_ENABLE_CAP), ppc, s390
|
Type: vcpu ioctl
|
||||||
Type: vcpu ioctl, vm ioctl (with KVM_CAP_ENABLE_CAP_VM)
|
Parameters: struct kvm_enable_cap (in)
|
||||||
|
Returns: 0 on success; -1 on error
|
||||||
|
|
||||||
|
Capability: KVM_CAP_ENABLE_CAP_VM
|
||||||
|
Architectures: all
|
||||||
|
Type: vcpu ioctl
|
||||||
Parameters: struct kvm_enable_cap (in)
|
Parameters: struct kvm_enable_cap (in)
|
||||||
Returns: 0 on success; -1 on error
|
Returns: 0 on success; -1 on error
|
||||||
|
|
||||||
|
|
|
@ -518,7 +518,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
||||||
case KVM_CAP_PPC_UNSET_IRQ:
|
case KVM_CAP_PPC_UNSET_IRQ:
|
||||||
case KVM_CAP_PPC_IRQ_LEVEL:
|
case KVM_CAP_PPC_IRQ_LEVEL:
|
||||||
case KVM_CAP_ENABLE_CAP:
|
case KVM_CAP_ENABLE_CAP:
|
||||||
case KVM_CAP_ENABLE_CAP_VM:
|
|
||||||
case KVM_CAP_ONE_REG:
|
case KVM_CAP_ONE_REG:
|
||||||
case KVM_CAP_IOEVENTFD:
|
case KVM_CAP_IOEVENTFD:
|
||||||
case KVM_CAP_DEVICE_CTRL:
|
case KVM_CAP_DEVICE_CTRL:
|
||||||
|
@ -2084,8 +2083,8 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
|
int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
|
||||||
struct kvm_enable_cap *cap)
|
struct kvm_enable_cap *cap)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -2273,15 +2272,6 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KVM_ENABLE_CAP:
|
|
||||||
{
|
|
||||||
struct kvm_enable_cap cap;
|
|
||||||
r = -EFAULT;
|
|
||||||
if (copy_from_user(&cap, argp, sizeof(cap)))
|
|
||||||
goto out;
|
|
||||||
r = kvm_vm_ioctl_enable_cap(kvm, &cap);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#ifdef CONFIG_SPAPR_TCE_IOMMU
|
#ifdef CONFIG_SPAPR_TCE_IOMMU
|
||||||
case KVM_CREATE_SPAPR_TCE_64: {
|
case KVM_CREATE_SPAPR_TCE_64: {
|
||||||
struct kvm_create_spapr_tce_64 create_tce_64;
|
struct kvm_create_spapr_tce_64 create_tce_64;
|
||||||
|
|
|
@ -464,7 +464,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
||||||
case KVM_CAP_S390_CSS_SUPPORT:
|
case KVM_CAP_S390_CSS_SUPPORT:
|
||||||
case KVM_CAP_IOEVENTFD:
|
case KVM_CAP_IOEVENTFD:
|
||||||
case KVM_CAP_DEVICE_CTRL:
|
case KVM_CAP_DEVICE_CTRL:
|
||||||
case KVM_CAP_ENABLE_CAP_VM:
|
|
||||||
case KVM_CAP_S390_IRQCHIP:
|
case KVM_CAP_S390_IRQCHIP:
|
||||||
case KVM_CAP_VM_ATTRIBUTES:
|
case KVM_CAP_VM_ATTRIBUTES:
|
||||||
case KVM_CAP_MP_STATE:
|
case KVM_CAP_MP_STATE:
|
||||||
|
@ -607,7 +606,7 @@ static void icpt_operexc_on_all_vcpus(struct kvm *kvm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap)
|
int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -1933,14 +1932,6 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
r = kvm_s390_inject_vm(kvm, &s390int);
|
r = kvm_s390_inject_vm(kvm, &s390int);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KVM_ENABLE_CAP: {
|
|
||||||
struct kvm_enable_cap cap;
|
|
||||||
r = -EFAULT;
|
|
||||||
if (copy_from_user(&cap, argp, sizeof(cap)))
|
|
||||||
break;
|
|
||||||
r = kvm_vm_ioctl_enable_cap(kvm, &cap);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case KVM_CREATE_IRQCHIP: {
|
case KVM_CREATE_IRQCHIP: {
|
||||||
struct kvm_irq_routing_entry routing;
|
struct kvm_irq_routing_entry routing;
|
||||||
|
|
||||||
|
|
|
@ -3008,7 +3008,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
||||||
case KVM_CAP_HYPERV_TIME:
|
case KVM_CAP_HYPERV_TIME:
|
||||||
case KVM_CAP_IOAPIC_POLARITY_IGNORED:
|
case KVM_CAP_IOAPIC_POLARITY_IGNORED:
|
||||||
case KVM_CAP_TSC_DEADLINE_TIMER:
|
case KVM_CAP_TSC_DEADLINE_TIMER:
|
||||||
case KVM_CAP_ENABLE_CAP_VM:
|
|
||||||
case KVM_CAP_DISABLE_QUIRKS:
|
case KVM_CAP_DISABLE_QUIRKS:
|
||||||
case KVM_CAP_SET_BOOT_CPU_ID:
|
case KVM_CAP_SET_BOOT_CPU_ID:
|
||||||
case KVM_CAP_SPLIT_IRQCHIP:
|
case KVM_CAP_SPLIT_IRQCHIP:
|
||||||
|
@ -4431,8 +4430,8 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
|
int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
|
||||||
struct kvm_enable_cap *cap)
|
struct kvm_enable_cap *cap)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -4765,15 +4764,6 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
r = 0;
|
r = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KVM_ENABLE_CAP: {
|
|
||||||
struct kvm_enable_cap cap;
|
|
||||||
|
|
||||||
r = -EFAULT;
|
|
||||||
if (copy_from_user(&cap, argp, sizeof(cap)))
|
|
||||||
goto out;
|
|
||||||
r = kvm_vm_ioctl_enable_cap(kvm, &cap);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case KVM_MEMORY_ENCRYPT_OP: {
|
case KVM_MEMORY_ENCRYPT_OP: {
|
||||||
r = -ENOTTY;
|
r = -ENOTTY;
|
||||||
if (kvm_x86_ops->mem_enc_op)
|
if (kvm_x86_ops->mem_enc_op)
|
||||||
|
|
|
@ -765,6 +765,8 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
|
||||||
|
|
||||||
int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level,
|
int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level,
|
||||||
bool line_status);
|
bool line_status);
|
||||||
|
int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
|
||||||
|
struct kvm_enable_cap *cap);
|
||||||
long kvm_arch_vm_ioctl(struct file *filp,
|
long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
unsigned int ioctl, unsigned long arg);
|
unsigned int ioctl, unsigned long arg);
|
||||||
|
|
||||||
|
|
|
@ -2948,6 +2948,7 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
|
||||||
#endif
|
#endif
|
||||||
case KVM_CAP_IOEVENTFD_ANY_LENGTH:
|
case KVM_CAP_IOEVENTFD_ANY_LENGTH:
|
||||||
case KVM_CAP_CHECK_EXTENSION_VM:
|
case KVM_CAP_CHECK_EXTENSION_VM:
|
||||||
|
case KVM_CAP_ENABLE_CAP_VM:
|
||||||
return 1;
|
return 1;
|
||||||
#ifdef CONFIG_KVM_MMIO
|
#ifdef CONFIG_KVM_MMIO
|
||||||
case KVM_CAP_COALESCED_MMIO:
|
case KVM_CAP_COALESCED_MMIO:
|
||||||
|
@ -2971,6 +2972,21 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
|
||||||
return kvm_vm_ioctl_check_extension(kvm, arg);
|
return kvm_vm_ioctl_check_extension(kvm, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __attribute__((weak)) kvm_vm_ioctl_enable_cap(struct kvm *kvm,
|
||||||
|
struct kvm_enable_cap *cap)
|
||||||
|
{
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm,
|
||||||
|
struct kvm_enable_cap *cap)
|
||||||
|
{
|
||||||
|
switch (cap->cap) {
|
||||||
|
default:
|
||||||
|
return kvm_vm_ioctl_enable_cap(kvm, cap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static long kvm_vm_ioctl(struct file *filp,
|
static long kvm_vm_ioctl(struct file *filp,
|
||||||
unsigned int ioctl, unsigned long arg)
|
unsigned int ioctl, unsigned long arg)
|
||||||
{
|
{
|
||||||
|
@ -2984,6 +3000,15 @@ static long kvm_vm_ioctl(struct file *filp,
|
||||||
case KVM_CREATE_VCPU:
|
case KVM_CREATE_VCPU:
|
||||||
r = kvm_vm_ioctl_create_vcpu(kvm, arg);
|
r = kvm_vm_ioctl_create_vcpu(kvm, arg);
|
||||||
break;
|
break;
|
||||||
|
case KVM_ENABLE_CAP: {
|
||||||
|
struct kvm_enable_cap cap;
|
||||||
|
|
||||||
|
r = -EFAULT;
|
||||||
|
if (copy_from_user(&cap, argp, sizeof(cap)))
|
||||||
|
goto out;
|
||||||
|
r = kvm_vm_ioctl_enable_cap_generic(kvm, &cap);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case KVM_SET_USER_MEMORY_REGION: {
|
case KVM_SET_USER_MEMORY_REGION: {
|
||||||
struct kvm_userspace_memory_region kvm_userspace_mem;
|
struct kvm_userspace_memory_region kvm_userspace_mem;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue