Description: KVM: PV: ext call delivered twice when receiver in PSW wait
Symptom: In a secure execution guest, the external interrupt for the
SIGP external call order is delivered twice to a VCPU even though it was only sent once.
Problem: Under PV, external call interrupts are delivered by the SIGP interpretation facility, without KVM's involvement. But, if the receiving CPU is in enabled wait, KVM needs to wake the receiving CPU such that the interrupt can be delivered. Hence,
in this case, the SIGP external call order causes an interception. In response, KVM only needs to wake the receiving VCPU. Interrupt delivery is then handled by the SIGP interpretation facility.
KVM wrongfuly assumed it also needs to request injection for the external call interrupt after the respective intercept, causing
the interrupt to be delivered twice: once through the SIGP interpretation facility and once through the interrupt injection control by KVM.
Solution: Add appropriate special handling for 108 external call intercepts.
Reproduction: 0. Apply kvm-unit-test submitted upstream ("[kvm-unit-tests PATCH v1 0/4] s390x: add tests for SIGP call orders in enabled wait").
1. Run the smp_PV kvm-unit-test: ./run_tests.sh smp_PV
2. Check logs/smp_PV.log. If system is affected, the following line can be found: ABORT: smp: psw wait: ecall: Unexpected external call \ interrupt (code 0x1202): on cpu 1 at 0x11958 If the system is not affected, the line should look like this: PASS: smp: psw wait: ecall: received
Description: KVM: PV: ext call delivered twice when receiver in PSW wait
though it was only sent once.
interpretation facility, without KVM's involvement. But, if the
receiving CPU is in enabled wait, KVM needs to wake the
receiving CPU such that the interrupt can be delivered. Hence,
interception. In response, KVM only needs to wake the receiving
VCPU. Interrupt delivery is then handled by the SIGP
interpretation facility.
Symptom: In a secure execution guest, the external interrupt for the
SIGP external call order is delivered twice to a VCPU even
Problem: Under PV, external call interrupts are delivered by the SIGP
in this case, the SIGP external call order causes an
KVM wrongfuly assumed it also needs to request injection for the
external call interrupt after the respective intercept, causing
interpretation facility and once through the interrupt injection
control by KVM.
intercepts.
("[ kvm-unit- tests PATCH v1 0/4] s390x: add tests for SIGP
call orders in enabled wait").
. /run_tests. sh smp_PV
line can be found:
ABORT: smp: psw wait: ecall: Unexpected external call \
interrupt (code 0x1202): on cpu 1 at 0x11958
If the system is not affected, the line should look like
this:
PASS: smp: psw wait: ecall: received
the interrupt to be delivered twice: once through the SIGP
Solution: Add appropriate special handling for 108 external call
Reproduction: 0. Apply kvm-unit-test submitted upstream
1. Run the smp_PV kvm-unit-test:
2. Check logs/smp_PV.log. If system is affected, the following
Preventive: yes
Author: Nico Boehr <email address hidden>
Component: kernel