aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/s390/include/asm/kvm_host.h1
-rw-r--r--arch/s390/kvm/kvm-s390.c35
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 {
711struct kvm_s390_cpu_model { 711struct 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,
1266static int kvm_s390_set_processor_subfunc(struct kvm *kvm, 1266static 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
1276static int kvm_s390_set_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr) 1285static 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,
1389static int kvm_s390_get_processor_subfunc(struct kvm *kvm, 1398static 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
1400static int kvm_s390_get_machine_subfunc(struct kvm *kvm, 1408static 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
1408static int kvm_s390_get_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr) 1417static 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);