diff options
| -rw-r--r-- | arch/s390/include/asm/kvm_host.h | 1 | ||||
| -rw-r--r-- | arch/s390/kvm/kvm-s390.c | 35 |
2 files changed, 23 insertions, 13 deletions
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index c5f51566ecd6..3369677a7df7 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
| @@ -711,6 +711,7 @@ struct s390_io_adapter { | |||
| 711 | struct kvm_s390_cpu_model { | 711 | struct kvm_s390_cpu_model { |
| 712 | /* facility mask supported by kvm & hosting machine */ | 712 | /* facility mask supported by kvm & hosting machine */ |
| 713 | __u64 fac_mask[S390_ARCH_FAC_LIST_SIZE_U64]; | 713 | __u64 fac_mask[S390_ARCH_FAC_LIST_SIZE_U64]; |
| 714 | struct kvm_s390_vm_cpu_subfunc subfuncs; | ||
| 714 | /* facility list requested by guest (in dma page) */ | 715 | /* facility list requested by guest (in dma page) */ |
| 715 | __u64 *fac_list; | 716 | __u64 *fac_list; |
| 716 | u64 cpuid; | 717 | u64 cpuid; |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 2e47c724679e..82a95afa6629 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
| @@ -1266,11 +1266,20 @@ static int kvm_s390_set_processor_feat(struct kvm *kvm, | |||
| 1266 | static int kvm_s390_set_processor_subfunc(struct kvm *kvm, | 1266 | static int kvm_s390_set_processor_subfunc(struct kvm *kvm, |
| 1267 | struct kvm_device_attr *attr) | 1267 | struct kvm_device_attr *attr) |
| 1268 | { | 1268 | { |
| 1269 | /* | 1269 | mutex_lock(&kvm->lock); |
| 1270 | * Once supported by kernel + hw, we have to store the subfunctions | 1270 | if (kvm->created_vcpus) { |
| 1271 | * in kvm->arch and remember that user space configured them. | 1271 | mutex_unlock(&kvm->lock); |
| 1272 | */ | 1272 | return -EBUSY; |
| 1273 | return -ENXIO; | 1273 | } |
| 1274 | |||
| 1275 | if (copy_from_user(&kvm->arch.model.subfuncs, (void __user *)attr->addr, | ||
| 1276 | sizeof(struct kvm_s390_vm_cpu_subfunc))) { | ||
| 1277 | mutex_unlock(&kvm->lock); | ||
| 1278 | return -EFAULT; | ||
| 1279 | } | ||
| 1280 | mutex_unlock(&kvm->lock); | ||
| 1281 | |||
| 1282 | return 0; | ||
| 1274 | } | 1283 | } |
| 1275 | 1284 | ||
| 1276 | static int kvm_s390_set_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr) | 1285 | static int kvm_s390_set_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr) |
| @@ -1389,12 +1398,11 @@ static int kvm_s390_get_machine_feat(struct kvm *kvm, | |||
| 1389 | static int kvm_s390_get_processor_subfunc(struct kvm *kvm, | 1398 | static int kvm_s390_get_processor_subfunc(struct kvm *kvm, |
| 1390 | struct kvm_device_attr *attr) | 1399 | struct kvm_device_attr *attr) |
| 1391 | { | 1400 | { |
| 1392 | /* | 1401 | if (copy_to_user((void __user *)attr->addr, &kvm->arch.model.subfuncs, |
| 1393 | * Once we can actually configure subfunctions (kernel + hw support), | 1402 | sizeof(struct kvm_s390_vm_cpu_subfunc))) |
| 1394 | * we have to check if they were already set by user space, if so copy | 1403 | return -EFAULT; |
| 1395 | * them from kvm->arch. | 1404 | |
| 1396 | */ | 1405 | return 0; |
| 1397 | return -ENXIO; | ||
| 1398 | } | 1406 | } |
| 1399 | 1407 | ||
| 1400 | static int kvm_s390_get_machine_subfunc(struct kvm *kvm, | 1408 | static int kvm_s390_get_machine_subfunc(struct kvm *kvm, |
| @@ -1405,6 +1413,7 @@ static int kvm_s390_get_machine_subfunc(struct kvm *kvm, | |||
| 1405 | return -EFAULT; | 1413 | return -EFAULT; |
| 1406 | return 0; | 1414 | return 0; |
| 1407 | } | 1415 | } |
| 1416 | |||
| 1408 | static int kvm_s390_get_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr) | 1417 | static int kvm_s390_get_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr) |
| 1409 | { | 1418 | { |
| 1410 | int ret = -ENXIO; | 1419 | int ret = -ENXIO; |
| @@ -1522,10 +1531,9 @@ static int kvm_s390_vm_has_attr(struct kvm *kvm, struct kvm_device_attr *attr) | |||
| 1522 | case KVM_S390_VM_CPU_PROCESSOR_FEAT: | 1531 | case KVM_S390_VM_CPU_PROCESSOR_FEAT: |
| 1523 | case KVM_S390_VM_CPU_MACHINE_FEAT: | 1532 | case KVM_S390_VM_CPU_MACHINE_FEAT: |
| 1524 | case KVM_S390_VM_CPU_MACHINE_SUBFUNC: | 1533 | case KVM_S390_VM_CPU_MACHINE_SUBFUNC: |
| 1534 | case KVM_S390_VM_CPU_PROCESSOR_SUBFUNC: | ||
| 1525 | ret = 0; | 1535 | ret = 0; |
| 1526 | break; | 1536 | break; |
| 1527 | /* configuring subfunctions is not supported yet */ | ||
| 1528 | case KVM_S390_VM_CPU_PROCESSOR_SUBFUNC: | ||
| 1529 | default: | 1537 | default: |
| 1530 | ret = -ENXIO; | 1538 | ret = -ENXIO; |
| 1531 | break; | 1539 | break; |
| @@ -2227,6 +2235,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
| 2227 | kvm->arch.model.fac_list[i] = S390_lowcore.stfle_fac_list[i] & | 2235 | kvm->arch.model.fac_list[i] = S390_lowcore.stfle_fac_list[i] & |
| 2228 | kvm_s390_fac_base[i]; | 2236 | kvm_s390_fac_base[i]; |
| 2229 | } | 2237 | } |
| 2238 | kvm->arch.model.subfuncs = kvm_s390_available_subfunc; | ||
| 2230 | 2239 | ||
| 2231 | /* we are always in czam mode - even on pre z14 machines */ | 2240 | /* we are always in czam mode - even on pre z14 machines */ |
| 2232 | set_kvm_facility(kvm->arch.model.fac_mask, 138); | 2241 | set_kvm_facility(kvm->arch.model.fac_mask, 138); |
