KVM: arm64: vgic-its: Plug race in vgic_put_irq
authorChristoffer Dall <christoffer.dall@linaro.org>
Tue, 2 Aug 2016 20:05:42 +0000 (22:05 +0200)
committerChristoffer Dall <christoffer.dall@linaro.org>
Wed, 10 Aug 2016 09:41:54 +0000 (11:41 +0200)
commit2cccbb368a2bf27d98cf36bb424fbbf5572c0fab
tree83edb3161029df208d04341330a381b8c6e9f5a1
parent99e5e886a0a59df267ff6838f763b789847df982
KVM: arm64: vgic-its: Plug race in vgic_put_irq

Right now the following sequence of events can happen:

  1. Thread X calls vgic_put_irq
  2. Thread Y calls vgic_add_lpi
  3. Thread Y gets lpi_list_lock
  4. Thread X drops the ref count to 0 and blocks on lpi_list_lock
  5. Thread Y finds the irq via the lpi_list_lock, raises the ref
     count to 1, and release the lpi_list_lock.
  6. Thread X proceeds and frees the irq.

Avoid this by holding the spinlock around the kref_put.

Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
virt/kvm/arm/vgic/vgic.c