KVM: s390: force ibc into valid range
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>
Mon, 4 Apr 2016 11:59:42 +0000 (13:59 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Mon, 9 May 2016 11:33:57 +0000 (13:33 +0200)
Some hardware variants will round the ibc value up/down themselves,
others will report a validity intercept. Let's always round it up/down.

This patch will also make sure that the ibc is set to 0 in case we don't
have ibc support (lowest_ibc == 0).

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>
arch/s390/kvm/kvm-s390.c

index 0d2f24210198078c4276a5e8b0f030fb97c600b6..eb52b3624b41a25426befd94c5cfa191c014b41e 100644 (file)
@@ -638,6 +638,7 @@ static int kvm_s390_get_tod(struct kvm *kvm, struct kvm_device_attr *attr)
 static int kvm_s390_set_processor(struct kvm *kvm, struct kvm_device_attr *attr)
 {
        struct kvm_s390_vm_cpu_processor *proc;
+       u16 lowest_ibc, unblocked_ibc;
        int ret = 0;
 
        mutex_lock(&kvm->lock);
@@ -653,7 +654,16 @@ static int kvm_s390_set_processor(struct kvm *kvm, struct kvm_device_attr *attr)
        if (!copy_from_user(proc, (void __user *)attr->addr,
                            sizeof(*proc))) {
                kvm->arch.model.cpuid = proc->cpuid;
-               kvm->arch.model.ibc = proc->ibc;
+               lowest_ibc = sclp.ibc >> 16 & 0xfff;
+               unblocked_ibc = sclp.ibc & 0xfff;
+               if (lowest_ibc) {
+                       if (proc->ibc > unblocked_ibc)
+                               kvm->arch.model.ibc = unblocked_ibc;
+                       else if (proc->ibc < lowest_ibc)
+                               kvm->arch.model.ibc = lowest_ibc;
+                       else
+                               kvm->arch.model.ibc = proc->ibc;
+               }
                memcpy(kvm->arch.model.fac_list, proc->fac_list,
                       S390_ARCH_FAC_LIST_SIZE_BYTE);
        } else