On 11/11/19 2:39 PM, Paolo Bonzini wrote: > On 06/11/19 18:56, Joao Martins wrote: >> When vCPU enters block phase, pi_pre_block() inserts vCPU to a per pCPU >> linked list of all vCPUs that are blocked on this pCPU. Afterwards, it >> changes PID.NV to POSTED_INTR_WAKEUP_VECTOR which its handler >> (wakeup_handler()) is responsible to kick (unblock) any vCPU on that >> linked list that now has pending posted interrupts. >> >> While vCPU is blocked (in kvm_vcpu_block()), it may be preempted which >> will cause vmx_vcpu_pi_put() to set PID.SN. If later the vCPU will be >> scheduled to run on a different pCPU, vmx_vcpu_pi_load() will clear >> PID.SN but will also *overwrite PID.NDST to this different pCPU*. >> Instead of keeping it with original pCPU which vCPU had entered block >> phase on. >> >> This results in an issue because when a posted interrupt is delivered, >> the wakeup_handler() will be executed and fail to find blocked vCPU on >> its per pCPU linked list of all vCPUs that are blocked on this pCPU. >> Which is due to the vCPU being placed on a *different* per pCPU >> linked list than the original pCPU that it had entered block phase. >> >> The regression is introduced by commit c112b5f50232 ("KVM: x86: >> Recompute PID.ON when clearing PID.SN"). Therefore, partially revert >> it and reintroduce the condition in vmx_vcpu_pi_load() responsible for >> avoiding changing PID.NDST when loading a blocked vCPU. >> >> Fixes: c112b5f50232 ("KVM: x86: Recompute PID.ON when clearing PID.SN") >> Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx> >> Signed-off-by: Liran Alon <liran.alon@xxxxxxxxxx> > > Something wrong in the SoB line? > I can't spot any mistake; at least it looks chained correctly for me. What's the issue you see with the Sob line? The only thing I forgot was a: Tested-by: Nathan Ni <nathan.ni@xxxxxxxxxx> > Otherwise looks good. If you want I can resubmit the series with the Tb and Jag Rb, unless you think it's OK doing on commit? Otherwise I can resubmit. Joao