mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-27 04:54:41 +08:00
KVM: s390: only deliver the set service event bits
The SCLP driver code masks off the last two bits of the parameter [1]
to determine if a read is required, but doesn't care about the
contents of those bits. Meanwhile, the KVM code that delivers
event interrupts masks off those two bits but sends both to the
guest, even if only one was specified by userspace [2].
This works for the driver code, but it means any nuances of those
bits gets lost. Use the event pending mask as an actual mask, and
only send the bit(s) that were specified in the pending interrupt.
[1] Linux: sclp_interrupt_handler() (drivers/s390/char/sclp.c:658)
[2] QEMU: service_interrupt() (hw/s390x/sclp.c:360..363)
Fixes: 0890ddea1a
("KVM: s390: protvirt: Add SCLP interrupt handling")
Signed-off-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Link: https://lore.kernel.org/r/20240205214300.1018522-1-farman@linux.ibm.com
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Message-Id: <20240205214300.1018522-1-farman@linux.ibm.com>
This commit is contained in:
parent
7b2411e793
commit
85a19b3054
@ -1031,7 +1031,7 @@ static int __must_check __deliver_service_ev(struct kvm_vcpu *vcpu)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ext = fi->srv_signal;
|
ext = fi->srv_signal;
|
||||||
/* only clear the event bit */
|
/* only clear the event bits */
|
||||||
fi->srv_signal.ext_params &= ~SCCB_EVENT_PENDING;
|
fi->srv_signal.ext_params &= ~SCCB_EVENT_PENDING;
|
||||||
clear_bit(IRQ_PEND_EXT_SERVICE_EV, &fi->pending_irqs);
|
clear_bit(IRQ_PEND_EXT_SERVICE_EV, &fi->pending_irqs);
|
||||||
spin_unlock(&fi->lock);
|
spin_unlock(&fi->lock);
|
||||||
@ -1041,7 +1041,7 @@ static int __must_check __deliver_service_ev(struct kvm_vcpu *vcpu)
|
|||||||
trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_INT_SERVICE,
|
trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_INT_SERVICE,
|
||||||
ext.ext_params, 0);
|
ext.ext_params, 0);
|
||||||
|
|
||||||
return write_sclp(vcpu, SCCB_EVENT_PENDING);
|
return write_sclp(vcpu, ext.ext_params & SCCB_EVENT_PENDING);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __must_check __deliver_pfault_done(struct kvm_vcpu *vcpu)
|
static int __must_check __deliver_pfault_done(struct kvm_vcpu *vcpu)
|
||||||
|
Loading…
Reference in New Issue
Block a user