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

KVM: Add per-vm capability enablement.

Allow KVM_ENABLE_CAP to act on a vm as well as on a vcpu. This makes more
sense when the caller wants to enable a vm-related capability.

s390 will be the first user; wire it up.

Reviewed-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>

+33 -2
+4 -2
Documentation/virtual/kvm/api.txt
··· 932 932 933 933 4.37 KVM_ENABLE_CAP 934 934 935 - Capability: KVM_CAP_ENABLE_CAP 935 + Capability: KVM_CAP_ENABLE_CAP, KVM_CAP_ENABLE_CAP_VM 936 936 Architectures: ppc, s390 937 - Type: vcpu ioctl 937 + Type: vcpu ioctl, vm ioctl (with KVM_CAP_ENABLE_CAP_VM) 938 938 Parameters: struct kvm_enable_cap (in) 939 939 Returns: 0 on success; -1 on error 940 940 ··· 965 965 __u8 pad[64]; 966 966 }; 967 967 968 + The vcpu ioctl should be used for vcpu-specific capabilities, the vm ioctl 969 + for vm-wide capabilities. 968 970 969 971 4.38 KVM_GET_MP_STATE 970 972
+24
arch/s390/kvm/kvm-s390.c
··· 159 159 case KVM_CAP_S390_CSS_SUPPORT: 160 160 case KVM_CAP_IOEVENTFD: 161 161 case KVM_CAP_DEVICE_CTRL: 162 + case KVM_CAP_ENABLE_CAP_VM: 162 163 r = 1; 163 164 break; 164 165 case KVM_CAP_NR_VCPUS: ··· 188 187 return 0; 189 188 } 190 189 190 + static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) 191 + { 192 + int r; 193 + 194 + if (cap->flags) 195 + return -EINVAL; 196 + 197 + switch (cap->cap) { 198 + default: 199 + r = -EINVAL; 200 + break; 201 + } 202 + return r; 203 + } 204 + 191 205 long kvm_arch_vm_ioctl(struct file *filp, 192 206 unsigned int ioctl, unsigned long arg) 193 207 { ··· 218 202 if (copy_from_user(&s390int, argp, sizeof(s390int))) 219 203 break; 220 204 r = kvm_s390_inject_vm(kvm, &s390int); 205 + break; 206 + } 207 + case KVM_ENABLE_CAP: { 208 + struct kvm_enable_cap cap; 209 + r = -EFAULT; 210 + if (copy_from_user(&cap, argp, sizeof(cap))) 211 + break; 212 + r = kvm_vm_ioctl_enable_cap(kvm, &cap); 221 213 break; 222 214 } 223 215 default:
+5
include/uapi/linux/kvm.h
··· 741 741 #define KVM_CAP_EXT_EMUL_CPUID 95 742 742 #define KVM_CAP_HYPERV_TIME 96 743 743 #define KVM_CAP_IOAPIC_POLARITY_IGNORED 97 744 + #define KVM_CAP_ENABLE_CAP_VM 98 744 745 745 746 #ifdef KVM_CAP_IRQ_ROUTING 746 747 ··· 1077 1076 /* Available with KVM_CAP_DEBUGREGS */ 1078 1077 #define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs) 1079 1078 #define KVM_SET_DEBUGREGS _IOW(KVMIO, 0xa2, struct kvm_debugregs) 1079 + /* 1080 + * vcpu version available with KVM_ENABLE_CAP 1081 + * vm version available with KVM_CAP_ENABLE_CAP_VM 1082 + */ 1080 1083 #define KVM_ENABLE_CAP _IOW(KVMIO, 0xa3, struct kvm_enable_cap) 1081 1084 /* Available with KVM_CAP_XSAVE */ 1082 1085 #define KVM_GET_XSAVE _IOR(KVMIO, 0xa4, struct kvm_xsave)