]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: s390: preserve deliverable_mask in __airqs_kick_single_vcpu
authorHalil Pasic <pasic@linux.ibm.com>
Tue, 19 Oct 2021 17:54:00 +0000 (19:54 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Wed, 20 Oct 2021 11:03:04 +0000 (13:03 +0200)
Changing the deliverable mask in __airqs_kick_single_vcpu() is a bug. If
one idle vcpu can't take the interrupts we want to deliver, we should
look for another vcpu that can, instead of saying that we don't want
to deliver these interrupts by clearing the bits from the
deliverable_mask.

Fixes: a2ab0f7e961a ("KVM: s390: add gib_alert_irq_handler()")
Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Michael Mueller <mimu@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Link: https://lore.kernel.org/r/20211019175401.3757927-3-pasic@linux.ibm.com
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/kvm/interrupt.c

index 10722455fd02e9b2f81f7f53af238f13acd3a4d9..2245f4b8d362953f8f64c3d0103c7b2579e37c40 100644 (file)
@@ -3053,13 +3053,14 @@ static void __airqs_kick_single_vcpu(struct kvm *kvm, u8 deliverable_mask)
        int vcpu_idx, online_vcpus = atomic_read(&kvm->online_vcpus);
        struct kvm_s390_gisa_interrupt *gi = &kvm->arch.gisa_int;
        struct kvm_vcpu *vcpu;
+       u8 vcpu_isc_mask;
 
        for_each_set_bit(vcpu_idx, kvm->arch.idle_mask, online_vcpus) {
                vcpu = kvm_get_vcpu(kvm, vcpu_idx);
                if (psw_ioint_disabled(vcpu))
                        continue;
-               deliverable_mask &= (u8)(vcpu->arch.sie_block->gcr[6] >> 24);
-               if (deliverable_mask) {
+               vcpu_isc_mask = (u8)(vcpu->arch.sie_block->gcr[6] >> 24);
+               if (deliverable_mask & vcpu_isc_mask) {
                        /* lately kicked but not yet running */
                        if (test_and_set_bit(vcpu_idx, gi->kicked_mask))
                                return;