aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Borntraeger <borntraeger@de.ibm.com>2018-02-12 07:33:39 -0500
committerChristian Borntraeger <borntraeger@de.ibm.com>2018-02-14 03:16:42 -0500
commit8846f3175c6bf16382b06a4b9755e5296c0f921c (patch)
tree31550d8a63ab81f259df1c970f80936a51bf3b36
parenta9810327726b01404ecde082c075a7468c433ddf (diff)
KVM: s390: do not set intervention requests for GISA interrupts
If GISA is available, we do not have to kick CPUs out of SIE to deliver interrupts. The hardware can deliver such interrupts while running. Cc: Michael Mueller <mimu@linux.vnet.ibm.com> Reviewed-by: David Hildenbrand <david@redhat.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
-rw-r--r--arch/s390/kvm/interrupt.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index 337a69bc04db..e399495001ca 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -236,10 +236,15 @@ static inline int kvm_s390_gisa_tac_ipm_gisc(struct kvm_s390_gisa *gisa, u32 gis
236 return test_and_clear_bit_inv(IPM_BIT_OFFSET + gisc, (unsigned long *) gisa); 236 return test_and_clear_bit_inv(IPM_BIT_OFFSET + gisc, (unsigned long *) gisa);
237} 237}
238 238
239static inline unsigned long pending_irqs(struct kvm_vcpu *vcpu) 239static inline unsigned long pending_irqs_no_gisa(struct kvm_vcpu *vcpu)
240{ 240{
241 return vcpu->kvm->arch.float_int.pending_irqs | 241 return vcpu->kvm->arch.float_int.pending_irqs |
242 vcpu->arch.local_int.pending_irqs | 242 vcpu->arch.local_int.pending_irqs;
243}
244
245static inline unsigned long pending_irqs(struct kvm_vcpu *vcpu)
246{
247 return pending_irqs_no_gisa(vcpu) |
243 kvm_s390_gisa_get_ipm(vcpu->kvm->arch.gisa) << IRQ_PEND_IO_ISC_7; 248 kvm_s390_gisa_get_ipm(vcpu->kvm->arch.gisa) << IRQ_PEND_IO_ISC_7;
244} 249}
245 250
@@ -337,7 +342,7 @@ static void __reset_intercept_indicators(struct kvm_vcpu *vcpu)
337 342
338static void set_intercept_indicators_io(struct kvm_vcpu *vcpu) 343static void set_intercept_indicators_io(struct kvm_vcpu *vcpu)
339{ 344{
340 if (!(pending_irqs(vcpu) & IRQ_PEND_IO_MASK)) 345 if (!(pending_irqs_no_gisa(vcpu) & IRQ_PEND_IO_MASK))
341 return; 346 return;
342 else if (psw_ioint_disabled(vcpu)) 347 else if (psw_ioint_disabled(vcpu))
343 kvm_s390_set_cpuflags(vcpu, CPUSTAT_IO_INT); 348 kvm_s390_set_cpuflags(vcpu, CPUSTAT_IO_INT);