aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm
diff options
context:
space:
mode:
authorDominik Dingel <dingel@linux.vnet.ibm.com>2015-05-07 09:41:57 -0400
committerChristian Borntraeger <borntraeger@de.ibm.com>2015-07-29 05:02:05 -0400
commite6db1d61c7cc05dd3c8b787a0bd47dcb94800300 (patch)
treef7cc9f1c33d9866bd111e881eb899eae74047d47 /arch/s390/kvm
parent0df30abcd69b61d8163282c157f15ed3b0f1ac85 (diff)
KVM: s390: clean up cmma_enable check
As we already only enable CMMA when userspace requests it, we can safely move the additional checks to the request handler and avoid doing them multiple times. This also tells userspace if CMMA is available. Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com> Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r--arch/s390/kvm/kvm-s390.c21
-rw-r--r--arch/s390/kvm/kvm-s390.h2
-rw-r--r--arch/s390/kvm/priv.c2
3 files changed, 8 insertions, 17 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index b77dcfe867be..641639b2fbd0 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -330,6 +330,11 @@ static int kvm_s390_set_mem_control(struct kvm *kvm, struct kvm_device_attr *att
330 unsigned int idx; 330 unsigned int idx;
331 switch (attr->attr) { 331 switch (attr->attr) {
332 case KVM_S390_VM_MEM_ENABLE_CMMA: 332 case KVM_S390_VM_MEM_ENABLE_CMMA:
333 /* enable CMMA only for z10 and later (EDAT_1) */
334 ret = -EINVAL;
335 if (!MACHINE_IS_LPAR || !MACHINE_HAS_EDAT1)
336 break;
337
333 ret = -EBUSY; 338 ret = -EBUSY;
334 mutex_lock(&kvm->lock); 339 mutex_lock(&kvm->lock);
335 if (atomic_read(&kvm->online_vcpus) == 0) { 340 if (atomic_read(&kvm->online_vcpus) == 0) {
@@ -1133,7 +1138,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
1133 if (kvm_is_ucontrol(vcpu->kvm)) 1138 if (kvm_is_ucontrol(vcpu->kvm))
1134 gmap_free(vcpu->arch.gmap); 1139 gmap_free(vcpu->arch.gmap);
1135 1140
1136 if (kvm_s390_cmma_enabled(vcpu->kvm)) 1141 if (vcpu->kvm->arch.use_cmma)
1137 kvm_s390_vcpu_unsetup_cmma(vcpu); 1142 kvm_s390_vcpu_unsetup_cmma(vcpu);
1138 free_page((unsigned long)(vcpu->arch.sie_block)); 1143 free_page((unsigned long)(vcpu->arch.sie_block));
1139 1144
@@ -1344,7 +1349,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
1344 } 1349 }
1345 vcpu->arch.sie_block->ictl |= ICTL_ISKE | ICTL_SSKE | ICTL_RRBE; 1350 vcpu->arch.sie_block->ictl |= ICTL_ISKE | ICTL_SSKE | ICTL_RRBE;
1346 1351
1347 if (kvm_s390_cmma_enabled(vcpu->kvm)) { 1352 if (vcpu->kvm->arch.use_cmma) {
1348 rc = kvm_s390_vcpu_setup_cmma(vcpu); 1353 rc = kvm_s390_vcpu_setup_cmma(vcpu);
1349 if (rc) 1354 if (rc)
1350 return rc; 1355 return rc;
@@ -1725,18 +1730,6 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
1725 return rc; 1730 return rc;
1726} 1731}
1727 1732
1728bool kvm_s390_cmma_enabled(struct kvm *kvm)
1729{
1730 if (!MACHINE_IS_LPAR)
1731 return false;
1732 /* only enable for z10 and later */
1733 if (!MACHINE_HAS_EDAT1)
1734 return false;
1735 if (!kvm->arch.use_cmma)
1736 return false;
1737 return true;
1738}
1739
1740static bool ibs_enabled(struct kvm_vcpu *vcpu) 1733static bool ibs_enabled(struct kvm_vcpu *vcpu)
1741{ 1734{
1742 return atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_IBS; 1735 return atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_IBS;
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
index c5704786e473..81de2af28c9c 100644
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -217,8 +217,6 @@ void exit_sie(struct kvm_vcpu *vcpu);
217void kvm_s390_sync_request(int req, struct kvm_vcpu *vcpu); 217void kvm_s390_sync_request(int req, struct kvm_vcpu *vcpu);
218int kvm_s390_vcpu_setup_cmma(struct kvm_vcpu *vcpu); 218int kvm_s390_vcpu_setup_cmma(struct kvm_vcpu *vcpu);
219void kvm_s390_vcpu_unsetup_cmma(struct kvm_vcpu *vcpu); 219void kvm_s390_vcpu_unsetup_cmma(struct kvm_vcpu *vcpu);
220/* is cmma enabled */
221bool kvm_s390_cmma_enabled(struct kvm *kvm);
222unsigned long kvm_s390_fac_list_mask_size(void); 220unsigned long kvm_s390_fac_list_mask_size(void);
223extern unsigned long kvm_s390_fac_list_mask[]; 221extern unsigned long kvm_s390_fac_list_mask[];
224 222
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
index ad4242245771..1b95d2934472 100644
--- a/arch/s390/kvm/priv.c
+++ b/arch/s390/kvm/priv.c
@@ -761,7 +761,7 @@ static int handle_essa(struct kvm_vcpu *vcpu)
761 VCPU_EVENT(vcpu, 5, "cmma release %d pages", entries); 761 VCPU_EVENT(vcpu, 5, "cmma release %d pages", entries);
762 gmap = vcpu->arch.gmap; 762 gmap = vcpu->arch.gmap;
763 vcpu->stat.instruction_essa++; 763 vcpu->stat.instruction_essa++;
764 if (!kvm_s390_cmma_enabled(vcpu->kvm)) 764 if (!vcpu->kvm->arch.use_cmma)
765 return kvm_s390_inject_program_int(vcpu, PGM_OPERATION); 765 return kvm_s390_inject_program_int(vcpu, PGM_OPERATION);
766 766
767 if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) 767 if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)