diff options
-rw-r--r-- | Documentation/virtual/kvm/api.txt | 13 | ||||
-rw-r--r-- | arch/powerpc/kvm/powerpc.c | 14 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 11 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 14 | ||||
-rw-r--r-- | include/linux/kvm_host.h | 2 | ||||
-rw-r--r-- | virt/kvm/kvm_main.c | 25 |
6 files changed, 41 insertions, 38 deletions
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index cd209f7730af..1071c10cf1c7 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt | |||
@@ -1129,10 +1129,15 @@ documentation when it pops into existence). | |||
1129 | 1129 | ||
1130 | 4.37 KVM_ENABLE_CAP | 1130 | 4.37 KVM_ENABLE_CAP |
1131 | 1131 | ||
1132 | Capability: KVM_CAP_ENABLE_CAP, KVM_CAP_ENABLE_CAP_VM | 1132 | Capability: KVM_CAP_ENABLE_CAP |
1133 | Architectures: x86 (only KVM_CAP_ENABLE_CAP_VM), | 1133 | Architectures: mips, ppc, s390 |
1134 | mips (only KVM_CAP_ENABLE_CAP), ppc, s390 | 1134 | Type: vcpu ioctl |
1135 | Type: vcpu ioctl, vm ioctl (with KVM_CAP_ENABLE_CAP_VM) | 1135 | Parameters: struct kvm_enable_cap (in) |
1136 | Returns: 0 on success; -1 on error | ||
1137 | |||
1138 | Capability: KVM_CAP_ENABLE_CAP_VM | ||
1139 | Architectures: all | ||
1140 | Type: vcpu ioctl | ||
1136 | Parameters: struct kvm_enable_cap (in) | 1141 | Parameters: struct kvm_enable_cap (in) |
1137 | Returns: 0 on success; -1 on error | 1142 | Returns: 0 on success; -1 on error |
1138 | 1143 | ||
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 2869a299c4ed..b1ed31a17a8c 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c | |||
@@ -518,7 +518,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | |||
518 | case KVM_CAP_PPC_UNSET_IRQ: | 518 | case KVM_CAP_PPC_UNSET_IRQ: |
519 | case KVM_CAP_PPC_IRQ_LEVEL: | 519 | case KVM_CAP_PPC_IRQ_LEVEL: |
520 | case KVM_CAP_ENABLE_CAP: | 520 | case KVM_CAP_ENABLE_CAP: |
521 | case KVM_CAP_ENABLE_CAP_VM: | ||
522 | case KVM_CAP_ONE_REG: | 521 | case KVM_CAP_ONE_REG: |
523 | case KVM_CAP_IOEVENTFD: | 522 | case KVM_CAP_IOEVENTFD: |
524 | case KVM_CAP_DEVICE_CTRL: | 523 | case KVM_CAP_DEVICE_CTRL: |
@@ -2084,8 +2083,8 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event, | |||
2084 | } | 2083 | } |
2085 | 2084 | ||
2086 | 2085 | ||
2087 | static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, | 2086 | int kvm_vm_ioctl_enable_cap(struct kvm *kvm, |
2088 | struct kvm_enable_cap *cap) | 2087 | struct kvm_enable_cap *cap) |
2089 | { | 2088 | { |
2090 | int r; | 2089 | int r; |
2091 | 2090 | ||
@@ -2273,15 +2272,6 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
2273 | 2272 | ||
2274 | break; | 2273 | break; |
2275 | } | 2274 | } |
2276 | case KVM_ENABLE_CAP: | ||
2277 | { | ||
2278 | struct kvm_enable_cap cap; | ||
2279 | r = -EFAULT; | ||
2280 | if (copy_from_user(&cap, argp, sizeof(cap))) | ||
2281 | goto out; | ||
2282 | r = kvm_vm_ioctl_enable_cap(kvm, &cap); | ||
2283 | break; | ||
2284 | } | ||
2285 | #ifdef CONFIG_SPAPR_TCE_IOMMU | 2275 | #ifdef CONFIG_SPAPR_TCE_IOMMU |
2286 | case KVM_CREATE_SPAPR_TCE_64: { | 2276 | case KVM_CREATE_SPAPR_TCE_64: { |
2287 | struct kvm_create_spapr_tce_64 create_tce_64; | 2277 | struct kvm_create_spapr_tce_64 create_tce_64; |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index fe24150ff666..16c300bdf2c8 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -464,7 +464,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | |||
464 | case KVM_CAP_S390_CSS_SUPPORT: | 464 | case KVM_CAP_S390_CSS_SUPPORT: |
465 | case KVM_CAP_IOEVENTFD: | 465 | case KVM_CAP_IOEVENTFD: |
466 | case KVM_CAP_DEVICE_CTRL: | 466 | case KVM_CAP_DEVICE_CTRL: |
467 | case KVM_CAP_ENABLE_CAP_VM: | ||
468 | case KVM_CAP_S390_IRQCHIP: | 467 | case KVM_CAP_S390_IRQCHIP: |
469 | case KVM_CAP_VM_ATTRIBUTES: | 468 | case KVM_CAP_VM_ATTRIBUTES: |
470 | case KVM_CAP_MP_STATE: | 469 | case KVM_CAP_MP_STATE: |
@@ -607,7 +606,7 @@ static void icpt_operexc_on_all_vcpus(struct kvm *kvm) | |||
607 | } | 606 | } |
608 | } | 607 | } |
609 | 608 | ||
610 | static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) | 609 | int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) |
611 | { | 610 | { |
612 | int r; | 611 | int r; |
613 | 612 | ||
@@ -1933,14 +1932,6 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
1933 | r = kvm_s390_inject_vm(kvm, &s390int); | 1932 | r = kvm_s390_inject_vm(kvm, &s390int); |
1934 | break; | 1933 | break; |
1935 | } | 1934 | } |
1936 | case KVM_ENABLE_CAP: { | ||
1937 | struct kvm_enable_cap cap; | ||
1938 | r = -EFAULT; | ||
1939 | if (copy_from_user(&cap, argp, sizeof(cap))) | ||
1940 | break; | ||
1941 | r = kvm_vm_ioctl_enable_cap(kvm, &cap); | ||
1942 | break; | ||
1943 | } | ||
1944 | case KVM_CREATE_IRQCHIP: { | 1935 | case KVM_CREATE_IRQCHIP: { |
1945 | struct kvm_irq_routing_entry routing; | 1936 | struct kvm_irq_routing_entry routing; |
1946 | 1937 | ||
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index d02937760c3b..714c5eb0c3bd 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -3008,7 +3008,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | |||
3008 | case KVM_CAP_HYPERV_TIME: | 3008 | case KVM_CAP_HYPERV_TIME: |
3009 | case KVM_CAP_IOAPIC_POLARITY_IGNORED: | 3009 | case KVM_CAP_IOAPIC_POLARITY_IGNORED: |
3010 | case KVM_CAP_TSC_DEADLINE_TIMER: | 3010 | case KVM_CAP_TSC_DEADLINE_TIMER: |
3011 | case KVM_CAP_ENABLE_CAP_VM: | ||
3012 | case KVM_CAP_DISABLE_QUIRKS: | 3011 | case KVM_CAP_DISABLE_QUIRKS: |
3013 | case KVM_CAP_SET_BOOT_CPU_ID: | 3012 | case KVM_CAP_SET_BOOT_CPU_ID: |
3014 | case KVM_CAP_SPLIT_IRQCHIP: | 3013 | case KVM_CAP_SPLIT_IRQCHIP: |
@@ -4431,8 +4430,8 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event, | |||
4431 | return 0; | 4430 | return 0; |
4432 | } | 4431 | } |
4433 | 4432 | ||
4434 | static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, | 4433 | int kvm_vm_ioctl_enable_cap(struct kvm *kvm, |
4435 | struct kvm_enable_cap *cap) | 4434 | struct kvm_enable_cap *cap) |
4436 | { | 4435 | { |
4437 | int r; | 4436 | int r; |
4438 | 4437 | ||
@@ -4765,15 +4764,6 @@ set_identity_unlock: | |||
4765 | r = 0; | 4764 | r = 0; |
4766 | break; | 4765 | break; |
4767 | } | 4766 | } |
4768 | case KVM_ENABLE_CAP: { | ||
4769 | struct kvm_enable_cap cap; | ||
4770 | |||
4771 | r = -EFAULT; | ||
4772 | if (copy_from_user(&cap, argp, sizeof(cap))) | ||
4773 | goto out; | ||
4774 | r = kvm_vm_ioctl_enable_cap(kvm, &cap); | ||
4775 | break; | ||
4776 | } | ||
4777 | case KVM_MEMORY_ENCRYPT_OP: { | 4767 | case KVM_MEMORY_ENCRYPT_OP: { |
4778 | r = -ENOTTY; | 4768 | r = -ENOTTY; |
4779 | if (kvm_x86_ops->mem_enc_op) | 4769 | if (kvm_x86_ops->mem_enc_op) |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index c926698040e0..54cc06dd7e6c 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -765,6 +765,8 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
765 | 765 | ||
766 | int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level, | 766 | int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level, |
767 | bool line_status); | 767 | bool line_status); |
768 | int kvm_vm_ioctl_enable_cap(struct kvm *kvm, | ||
769 | struct kvm_enable_cap *cap); | ||
768 | long kvm_arch_vm_ioctl(struct file *filp, | 770 | long kvm_arch_vm_ioctl(struct file *filp, |
769 | unsigned int ioctl, unsigned long arg); | 771 | unsigned int ioctl, unsigned long arg); |
770 | 772 | ||
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 2679e476b6c3..1d6b77162d7c 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -2948,6 +2948,7 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) | |||
2948 | #endif | 2948 | #endif |
2949 | case KVM_CAP_IOEVENTFD_ANY_LENGTH: | 2949 | case KVM_CAP_IOEVENTFD_ANY_LENGTH: |
2950 | case KVM_CAP_CHECK_EXTENSION_VM: | 2950 | case KVM_CAP_CHECK_EXTENSION_VM: |
2951 | case KVM_CAP_ENABLE_CAP_VM: | ||
2951 | return 1; | 2952 | return 1; |
2952 | #ifdef CONFIG_KVM_MMIO | 2953 | #ifdef CONFIG_KVM_MMIO |
2953 | case KVM_CAP_COALESCED_MMIO: | 2954 | case KVM_CAP_COALESCED_MMIO: |
@@ -2971,6 +2972,21 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) | |||
2971 | return kvm_vm_ioctl_check_extension(kvm, arg); | 2972 | return kvm_vm_ioctl_check_extension(kvm, arg); |
2972 | } | 2973 | } |
2973 | 2974 | ||
2975 | int __attribute__((weak)) kvm_vm_ioctl_enable_cap(struct kvm *kvm, | ||
2976 | struct kvm_enable_cap *cap) | ||
2977 | { | ||
2978 | return -EINVAL; | ||
2979 | } | ||
2980 | |||
2981 | static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm, | ||
2982 | struct kvm_enable_cap *cap) | ||
2983 | { | ||
2984 | switch (cap->cap) { | ||
2985 | default: | ||
2986 | return kvm_vm_ioctl_enable_cap(kvm, cap); | ||
2987 | } | ||
2988 | } | ||
2989 | |||
2974 | static long kvm_vm_ioctl(struct file *filp, | 2990 | static long kvm_vm_ioctl(struct file *filp, |
2975 | unsigned int ioctl, unsigned long arg) | 2991 | unsigned int ioctl, unsigned long arg) |
2976 | { | 2992 | { |
@@ -2984,6 +3000,15 @@ static long kvm_vm_ioctl(struct file *filp, | |||
2984 | case KVM_CREATE_VCPU: | 3000 | case KVM_CREATE_VCPU: |
2985 | r = kvm_vm_ioctl_create_vcpu(kvm, arg); | 3001 | r = kvm_vm_ioctl_create_vcpu(kvm, arg); |
2986 | break; | 3002 | break; |
3003 | case KVM_ENABLE_CAP: { | ||
3004 | struct kvm_enable_cap cap; | ||
3005 | |||
3006 | r = -EFAULT; | ||
3007 | if (copy_from_user(&cap, argp, sizeof(cap))) | ||
3008 | goto out; | ||
3009 | r = kvm_vm_ioctl_enable_cap_generic(kvm, &cap); | ||
3010 | break; | ||
3011 | } | ||
2987 | case KVM_SET_USER_MEMORY_REGION: { | 3012 | case KVM_SET_USER_MEMORY_REGION: { |
2988 | struct kvm_userspace_memory_region kvm_userspace_mem; | 3013 | struct kvm_userspace_memory_region kvm_userspace_mem; |
2989 | 3014 | ||