diff options
author | Christian Borntraeger <borntraeger@de.ibm.com> | 2017-05-31 04:18:55 -0400 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2017-05-31 13:54:49 -0400 |
commit | 1ba15b24f07c44f68067959522639226c963e212 (patch) | |
tree | 9818cb497c4c898e1496203909478143d2811836 | |
parent | 55c315ee09d3bd37f9d71e85e54d6ebe675b6462 (diff) |
KVM: s390: fix ais handling vs cpu model
If ais is disabled via cpumodel, we must act accordingly, even if
KVM_CAP_S390_AIS was enabled.
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
Reviewed-by: Yi Min Zhao <zyimin@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Reviewed-by: Eric Farman <farman@linux.vnet.ibm.com>
-rw-r--r-- | arch/s390/include/asm/kvm_host.h | 1 | ||||
-rw-r--r-- | arch/s390/kvm/interrupt.c | 4 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 2 |
3 files changed, 2 insertions, 5 deletions
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index 426614a882a9..65d07ac34647 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
@@ -541,7 +541,6 @@ struct kvm_s390_float_interrupt { | |||
541 | struct mutex ais_lock; | 541 | struct mutex ais_lock; |
542 | u8 simm; | 542 | u8 simm; |
543 | u8 nimm; | 543 | u8 nimm; |
544 | int ais_enabled; | ||
545 | }; | 544 | }; |
546 | 545 | ||
547 | struct kvm_hw_wp_info_arch { | 546 | struct kvm_hw_wp_info_arch { |
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index caf15c8a8948..2d120fef7d90 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c | |||
@@ -2160,7 +2160,7 @@ static int modify_ais_mode(struct kvm *kvm, struct kvm_device_attr *attr) | |||
2160 | struct kvm_s390_ais_req req; | 2160 | struct kvm_s390_ais_req req; |
2161 | int ret = 0; | 2161 | int ret = 0; |
2162 | 2162 | ||
2163 | if (!fi->ais_enabled) | 2163 | if (!test_kvm_facility(kvm, 72)) |
2164 | return -ENOTSUPP; | 2164 | return -ENOTSUPP; |
2165 | 2165 | ||
2166 | if (copy_from_user(&req, (void __user *)attr->addr, sizeof(req))) | 2166 | if (copy_from_user(&req, (void __user *)attr->addr, sizeof(req))) |
@@ -2204,7 +2204,7 @@ static int kvm_s390_inject_airq(struct kvm *kvm, | |||
2204 | }; | 2204 | }; |
2205 | int ret = 0; | 2205 | int ret = 0; |
2206 | 2206 | ||
2207 | if (!fi->ais_enabled || !adapter->suppressible) | 2207 | if (!test_kvm_facility(kvm, 72) || !adapter->suppressible) |
2208 | return kvm_s390_inject_vm(kvm, &s390int); | 2208 | return kvm_s390_inject_vm(kvm, &s390int); |
2209 | 2209 | ||
2210 | mutex_lock(&fi->ais_lock); | 2210 | mutex_lock(&fi->ais_lock); |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 689ac48361c6..f28e2e776931 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -558,7 +558,6 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) | |||
558 | } else { | 558 | } else { |
559 | set_kvm_facility(kvm->arch.model.fac_mask, 72); | 559 | set_kvm_facility(kvm->arch.model.fac_mask, 72); |
560 | set_kvm_facility(kvm->arch.model.fac_list, 72); | 560 | set_kvm_facility(kvm->arch.model.fac_list, 72); |
561 | kvm->arch.float_int.ais_enabled = 1; | ||
562 | r = 0; | 561 | r = 0; |
563 | } | 562 | } |
564 | mutex_unlock(&kvm->lock); | 563 | mutex_unlock(&kvm->lock); |
@@ -1533,7 +1532,6 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
1533 | mutex_init(&kvm->arch.float_int.ais_lock); | 1532 | mutex_init(&kvm->arch.float_int.ais_lock); |
1534 | kvm->arch.float_int.simm = 0; | 1533 | kvm->arch.float_int.simm = 0; |
1535 | kvm->arch.float_int.nimm = 0; | 1534 | kvm->arch.float_int.nimm = 0; |
1536 | kvm->arch.float_int.ais_enabled = 0; | ||
1537 | spin_lock_init(&kvm->arch.float_int.lock); | 1535 | spin_lock_init(&kvm->arch.float_int.lock); |
1538 | for (i = 0; i < FIRQ_LIST_COUNT; i++) | 1536 | for (i = 0; i < FIRQ_LIST_COUNT; i++) |
1539 | INIT_LIST_HEAD(&kvm->arch.float_int.lists[i]); | 1537 | INIT_LIST_HEAD(&kvm->arch.float_int.lists[i]); |