Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+41 -38
+9 -4
Documentation/virtual/kvm/api.txt
··· 1129 1129 1130 1130 4.37 KVM_ENABLE_CAP 1131 1131 1132 - Capability: KVM_CAP_ENABLE_CAP, KVM_CAP_ENABLE_CAP_VM 1133 - Architectures: x86 (only KVM_CAP_ENABLE_CAP_VM), 1134 - mips (only KVM_CAP_ENABLE_CAP), ppc, s390 1135 - Type: vcpu ioctl, vm ioctl (with KVM_CAP_ENABLE_CAP_VM) 1132 + Capability: KVM_CAP_ENABLE_CAP 1133 + Architectures: mips, ppc, s390 1134 + Type: vcpu ioctl 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 1141 Parameters: struct kvm_enable_cap (in) 1137 1142 Returns: 0 on success; -1 on error 1138 1143
+2 -12
arch/powerpc/kvm/powerpc.c
··· 518 518 case KVM_CAP_PPC_UNSET_IRQ: 519 519 case KVM_CAP_PPC_IRQ_LEVEL: 520 520 case KVM_CAP_ENABLE_CAP: 521 - case KVM_CAP_ENABLE_CAP_VM: 522 521 case KVM_CAP_ONE_REG: 523 522 case KVM_CAP_IOEVENTFD: 524 523 case KVM_CAP_DEVICE_CTRL: ··· 2083 2084 } 2084 2085 2085 2086 2086 - static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, 2087 - struct kvm_enable_cap *cap) 2087 + int kvm_vm_ioctl_enable_cap(struct kvm *kvm, 2088 + struct kvm_enable_cap *cap) 2088 2089 { 2089 2090 int r; 2090 2091 ··· 2270 2271 goto out; 2271 2272 } 2272 2273 2273 - break; 2274 - } 2275 - case KVM_ENABLE_CAP: 2276 - { 2277 - struct kvm_enable_cap cap; 2278 - r = -EFAULT; 2279 - if (copy_from_user(&cap, argp, sizeof(cap))) 2280 - goto out; 2281 - r = kvm_vm_ioctl_enable_cap(kvm, &cap); 2282 2274 break; 2283 2275 } 2284 2276 #ifdef CONFIG_SPAPR_TCE_IOMMU
+1 -10
arch/s390/kvm/kvm-s390.c
··· 464 464 case KVM_CAP_S390_CSS_SUPPORT: 465 465 case KVM_CAP_IOEVENTFD: 466 466 case KVM_CAP_DEVICE_CTRL: 467 - case KVM_CAP_ENABLE_CAP_VM: 468 467 case KVM_CAP_S390_IRQCHIP: 469 468 case KVM_CAP_VM_ATTRIBUTES: 470 469 case KVM_CAP_MP_STATE: ··· 606 607 } 607 608 } 608 609 609 - static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) 610 + int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) 610 611 { 611 612 int r; 612 613 ··· 1930 1931 if (copy_from_user(&s390int, argp, sizeof(s390int))) 1931 1932 break; 1932 1933 r = kvm_s390_inject_vm(kvm, &s390int); 1933 - break; 1934 - } 1935 - case KVM_ENABLE_CAP: { 1936 - struct kvm_enable_cap cap; 1937 - r = -EFAULT; 1938 - if (copy_from_user(&cap, argp, sizeof(cap))) 1939 - break; 1940 - r = kvm_vm_ioctl_enable_cap(kvm, &cap); 1941 1934 break; 1942 1935 } 1943 1936 case KVM_CREATE_IRQCHIP: {
+2 -12
arch/x86/kvm/x86.c
··· 3008 3008 case KVM_CAP_HYPERV_TIME: 3009 3009 case KVM_CAP_IOAPIC_POLARITY_IGNORED: 3010 3010 case KVM_CAP_TSC_DEADLINE_TIMER: 3011 - case KVM_CAP_ENABLE_CAP_VM: 3012 3011 case KVM_CAP_DISABLE_QUIRKS: 3013 3012 case KVM_CAP_SET_BOOT_CPU_ID: 3014 3013 case KVM_CAP_SPLIT_IRQCHIP: ··· 4430 4431 return 0; 4431 4432 } 4432 4433 4433 - static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, 4434 - struct kvm_enable_cap *cap) 4434 + int kvm_vm_ioctl_enable_cap(struct kvm *kvm, 4435 + struct kvm_enable_cap *cap) 4435 4436 { 4436 4437 int r; 4437 4438 ··· 4762 4763 if (copy_to_user(argp, &user_ns, sizeof(user_ns))) 4763 4764 goto out; 4764 4765 r = 0; 4765 - break; 4766 - } 4767 - case KVM_ENABLE_CAP: { 4768 - struct kvm_enable_cap cap; 4769 - 4770 - r = -EFAULT; 4771 - if (copy_from_user(&cap, argp, sizeof(cap))) 4772 - goto out; 4773 - r = kvm_vm_ioctl_enable_cap(kvm, &cap); 4774 4766 break; 4775 4767 } 4776 4768 case KVM_MEMORY_ENCRYPT_OP: {
+2
include/linux/kvm_host.h
··· 765 765 766 766 int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level, 767 767 bool line_status); 768 + int kvm_vm_ioctl_enable_cap(struct kvm *kvm, 769 + struct kvm_enable_cap *cap); 768 770 long kvm_arch_vm_ioctl(struct file *filp, 769 771 unsigned int ioctl, unsigned long arg); 770 772
+25
virt/kvm/kvm_main.c
··· 2948 2948 #endif 2949 2949 case KVM_CAP_IOEVENTFD_ANY_LENGTH: 2950 2950 case KVM_CAP_CHECK_EXTENSION_VM: 2951 + case KVM_CAP_ENABLE_CAP_VM: 2951 2952 return 1; 2952 2953 #ifdef CONFIG_KVM_MMIO 2953 2954 case KVM_CAP_COALESCED_MMIO: ··· 2972 2971 return kvm_vm_ioctl_check_extension(kvm, arg); 2973 2972 } 2974 2973 2974 + int __attribute__((weak)) kvm_vm_ioctl_enable_cap(struct kvm *kvm, 2975 + struct kvm_enable_cap *cap) 2976 + { 2977 + return -EINVAL; 2978 + } 2979 + 2980 + static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm, 2981 + struct kvm_enable_cap *cap) 2982 + { 2983 + switch (cap->cap) { 2984 + default: 2985 + return kvm_vm_ioctl_enable_cap(kvm, cap); 2986 + } 2987 + } 2988 + 2975 2989 static long kvm_vm_ioctl(struct file *filp, 2976 2990 unsigned int ioctl, unsigned long arg) 2977 2991 { ··· 3000 2984 case KVM_CREATE_VCPU: 3001 2985 r = kvm_vm_ioctl_create_vcpu(kvm, arg); 3002 2986 break; 2987 + case KVM_ENABLE_CAP: { 2988 + struct kvm_enable_cap cap; 2989 + 2990 + r = -EFAULT; 2991 + if (copy_from_user(&cap, argp, sizeof(cap))) 2992 + goto out; 2993 + r = kvm_vm_ioctl_enable_cap_generic(kvm, &cap); 2994 + break; 2995 + } 3003 2996 case KVM_SET_USER_MEMORY_REGION: { 3004 2997 struct kvm_userspace_memory_region kvm_userspace_mem; 3005 2998