KVM: PPC: Book3S HV P9: Fix "lost kick" race
authorNicholas Piggin <npiggin@gmail.com>
Thu, 3 Mar 2022 05:33:10 +0000 (15:33 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 7 Mar 2022 02:14:30 +0000 (13:14 +1100)
commitc7fa848ff01dad9ed3146a6b1a7d3622131bcedd
tree249a200a298b2e2914167eda305821ed859b85ba
parente40b38a41ce916d6a3a4751d59a01b6c0c03afd0
KVM: PPC: Book3S HV P9: Fix "lost kick" race

When new work is created that requires attention from the hypervisor
(e.g., to inject an interrupt into the guest), fast_vcpu_kick is used to
pull the target vcpu out of the guest if it may have been running.

Therefore the work creation side looks like this:

  vcpu->arch.doorbell_request = 1;
  kvmppc_fast_vcpu_kick_hv(vcpu) {
    smp_mb();
    cpu = vcpu->cpu;
    if (cpu != -1)
        send_ipi(cpu);
  }

And the guest entry side *should* look like this:

  vcpu->cpu = smp_processor_id();
  smp_mb();
  if (vcpu->arch.doorbell_request) {
    // do something (abort entry or inject doorbell etc)
  }

But currently the store and load are flipped, so it is possible for the
entry to see no doorbell pending, and the doorbell creation misses the
store to set cpu, resulting lost work (or at least delayed until the
next guest exit).

Fix this by reordering the entry operations and adding a smp_mb
between them. The P8 path appears to have a similar race which is
commented but not addressed yet.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220303053315.1056880-2-npiggin@gmail.com
arch/powerpc/kvm/book3s_hv.c