ACK: [SRU][F][PATCH 1/1] KVM: s390: pv: don't present the ecall interrupt twice
Stefan Bader
stefan.bader at canonical.com
Fri Nov 11 08:57:16 UTC 2022
On 10.11.22 21:06, frank.heimes at canonical.com wrote:
> From: Nico Boehr <nrb at linux.ibm.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1995941
>
> When the SIGP interpretation facility is present and a VCPU sends an
> ecall to another VCPU in enabled wait, the sending VCPU receives a 56
> intercept (partial execution), so KVM can wake up the receiving CPU.
> Note that the SIGP interpretation facility will take care of the
> interrupt delivery and KVM's only job is to wake the receiving VCPU.
>
> For PV, the sending VCPU will receive a 108 intercept (pv notify) and
> should continue like in the non-PV case, i.e. wake the receiving VCPU.
>
> For PV and non-PV guests the interrupt delivery will occur through the
> SIGP interpretation facility on SIE entry when SIE finds the X bit in
> the status field set.
>
> However, in handle_pv_notification(), there was no special handling for
> SIGP, which leads to interrupt injection being requested by KVM for the
> next SIE entry. This results in the interrupt being delivered twice:
> once by the SIGP interpretation facility and once by KVM through the
> IICTL.
>
> Add the necessary special handling in handle_pv_notification(), similar
> to handle_partial_execution(), which simply wakes the receiving VCPU and
> leave interrupt delivery to the SIGP interpretation facility.
>
> In contrast to external calls, emergency calls are not interpreted but
> also cause a 108 intercept, which is why we still need to call
> handle_instruction() for SIGP orders other than ecall.
>
> Since kvm_s390_handle_sigp_pei() is now called for all SIGP orders which
> cause a 108 intercept - even if they are actually handled by
> handle_instruction() - move the tracepoint in kvm_s390_handle_sigp_pei()
> to avoid possibly confusing trace messages.
>
> Signed-off-by: Nico Boehr <nrb at linux.ibm.com>
> Cc: <stable at vger.kernel.org> # 5.7
> Fixes: da24a0cc58ed ("KVM: s390: protvirt: Instruction emulation")
> Reviewed-by: Claudio Imbrenda <imbrenda at linux.ibm.com>
> Reviewed-by: Janosch Frank <frankja at linux.ibm.com>
> Reviewed-by: Christian Borntraeger <borntraeger at linux.ibm.com>
> Link: https://lore.kernel.org/r/20220718130434.73302-1-nrb@linux.ibm.com
> Message-Id: <20220718130434.73302-1-nrb at linux.ibm.com>
> Signed-off-by: Claudio Imbrenda <imbrenda at linux.ibm.com>
> (cherry picked from commit c3f0e5fd2d33d80c5a5a8b5e5d2bab2841709cc8)
> Signed-off-by: Frank Heimes <frank.heimes at canonical.com>
Acked-by: Stefan Bader <stefan.bader at canonical.com>
> ---
> arch/s390/kvm/intercept.c | 15 +++++++++++++++
> arch/s390/kvm/sigp.c | 4 ++--
> 2 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c
> index 5c10f96a50b1..9566b50d9da1 100644
> --- a/arch/s390/kvm/intercept.c
> +++ b/arch/s390/kvm/intercept.c
> @@ -527,12 +527,27 @@ static int handle_pv_uvc(struct kvm_vcpu *vcpu)
>
> static int handle_pv_notification(struct kvm_vcpu *vcpu)
> {
> + int ret;
> +
> if (vcpu->arch.sie_block->ipa == 0xb210)
> return handle_pv_spx(vcpu);
> if (vcpu->arch.sie_block->ipa == 0xb220)
> return handle_pv_sclp(vcpu);
> if (vcpu->arch.sie_block->ipa == 0xb9a4)
> return handle_pv_uvc(vcpu);
> + if (vcpu->arch.sie_block->ipa >> 8 == 0xae) {
> + /*
> + * Besides external call, other SIGP orders also cause a
> + * 108 (pv notify) intercept. In contrast to external call,
> + * these orders need to be emulated and hence the appropriate
> + * place to handle them is in handle_instruction().
> + * So first try kvm_s390_handle_sigp_pei() and if that isn't
> + * successful, go on with handle_instruction().
> + */
> + ret = kvm_s390_handle_sigp_pei(vcpu);
> + if (!ret)
> + return ret;
> + }
>
> return handle_instruction(vcpu);
> }
> diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c
> index 8aaee2892ec3..cb747bf6c798 100644
> --- a/arch/s390/kvm/sigp.c
> +++ b/arch/s390/kvm/sigp.c
> @@ -480,9 +480,9 @@ int kvm_s390_handle_sigp_pei(struct kvm_vcpu *vcpu)
> struct kvm_vcpu *dest_vcpu;
> u8 order_code = kvm_s390_get_base_disp_rs(vcpu, NULL);
>
> - trace_kvm_s390_handle_sigp_pei(vcpu, order_code, cpu_addr);
> -
> if (order_code == SIGP_EXTERNAL_CALL) {
> + trace_kvm_s390_handle_sigp_pei(vcpu, order_code, cpu_addr);
> +
> dest_vcpu = kvm_get_vcpu_by_id(vcpu->kvm, cpu_addr);
> BUG_ON(dest_vcpu == NULL);
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20221111/0a4d7fb2/attachment.sig>
More information about the kernel-team
mailing list