aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2015-11-24 07:33:49 -0500
committerChristian Borntraeger <borntraeger@de.ibm.com>2016-06-10 06:07:18 -0400
commit76a6dd7241ae03c47f44a9605dcd525f31b2124a (patch)
treeba19690ca9aedb46e308d156b80fdd36a89f5046 /arch/s390/kvm
parent4013ade3fb2fefa021827d675d8bc1d51f4aef93 (diff)
KVM: s390: handle missing 64-bit-SCAO facility
Without that facility, we may only use scaol. So fallback to DMA allocation in that case, so we won't overwrite random memory via the SIE. Also disallow ESCA, so we don't have to handle that allocation case. Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-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.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index f746a35e3950..efb902cdd1d2 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -317,8 +317,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
317 break; 317 break;
318 case KVM_CAP_NR_VCPUS: 318 case KVM_CAP_NR_VCPUS:
319 case KVM_CAP_MAX_VCPUS: 319 case KVM_CAP_MAX_VCPUS:
320 r = sclp.has_esca ? KVM_S390_ESCA_CPU_SLOTS 320 r = KVM_S390_BSCA_CPU_SLOTS;
321 : KVM_S390_BSCA_CPU_SLOTS; 321 if (sclp.has_esca && sclp.has_64bscao)
322 r = KVM_S390_ESCA_CPU_SLOTS;
322 break; 323 break;
323 case KVM_CAP_NR_MEMSLOTS: 324 case KVM_CAP_NR_MEMSLOTS:
324 r = KVM_USER_MEM_SLOTS; 325 r = KVM_USER_MEM_SLOTS;
@@ -1295,6 +1296,7 @@ static void sca_dispose(struct kvm *kvm)
1295 1296
1296int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) 1297int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
1297{ 1298{
1299 gfp_t alloc_flags = GFP_KERNEL;
1298 int i, rc; 1300 int i, rc;
1299 char debug_name[16]; 1301 char debug_name[16];
1300 static unsigned long sca_offset; 1302 static unsigned long sca_offset;
@@ -1319,8 +1321,10 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
1319 ratelimit_state_init(&kvm->arch.sthyi_limit, 5 * HZ, 500); 1321 ratelimit_state_init(&kvm->arch.sthyi_limit, 5 * HZ, 500);
1320 1322
1321 kvm->arch.use_esca = 0; /* start with basic SCA */ 1323 kvm->arch.use_esca = 0; /* start with basic SCA */
1324 if (!sclp.has_64bscao)
1325 alloc_flags |= GFP_DMA;
1322 rwlock_init(&kvm->arch.sca_lock); 1326 rwlock_init(&kvm->arch.sca_lock);
1323 kvm->arch.sca = (struct bsca_block *) get_zeroed_page(GFP_KERNEL); 1327 kvm->arch.sca = (struct bsca_block *) get_zeroed_page(alloc_flags);
1324 if (!kvm->arch.sca) 1328 if (!kvm->arch.sca)
1325 goto out_err; 1329 goto out_err;
1326 spin_lock(&kvm_lock); 1330 spin_lock(&kvm_lock);
@@ -1567,7 +1571,7 @@ static int sca_can_add_vcpu(struct kvm *kvm, unsigned int id)
1567 1571
1568 if (id < KVM_S390_BSCA_CPU_SLOTS) 1572 if (id < KVM_S390_BSCA_CPU_SLOTS)
1569 return true; 1573 return true;
1570 if (!sclp.has_esca) 1574 if (!sclp.has_esca || !sclp.has_64bscao)
1571 return false; 1575 return false;
1572 1576
1573 mutex_lock(&kvm->lock); 1577 mutex_lock(&kvm->lock);