Commit 68b35dfe authored by Marc Zyngier's avatar Marc Zyngier Committed by Treehugger Robot
Browse files

UPSTREAM: KVM: arm64: GICv4.1: Fix race with doorbell on VPE activation/deactivation



To save the vgic LPI pending state with GICv4.1, the VPEs must all be
unmapped from the ITSs so that the sGIC caches can be flushed.
The opposite is done once the state is saved.

This is all done by using the activate/deactivate irqdomain callbacks
directly from the vgic code. Crutially, this is done without holding
the irqdesc lock for the interrupts that represent the VPE. And these
callbacks are changing the state of the irqdesc. What could possibly
go wrong?

If a doorbell fires while we are messing with the irqdesc state,
it will acquire the lock and change the interrupt state concurrently.
Since we don't hole the lock, curruption occurs in on the interrupt
state. Oh well.

While acquiring the lock would fix this (and this was Shanker's
initial approach), this is still a layering violation we could do
without. A better approach is actually to free the VPE interrupt,
do what we have to do, and re-request it.

It is more work, but this usually happens only once in the lifetime
of the VM and we don't really care about this sort of overhead.

Bug: 254441685
Fixes: f66b7b15 ("KVM: arm64: GICv4.1: Try to save VLPI state in save_pending_tables")
Reported-by: default avatarShanker Donthineni <sdonthineni@nvidia.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20230118022348.4137094-1-sdonthineni@nvidia.com


(cherry picked from commit ef369168)
Signed-off-by: default avatarLee Jones <joneslee@google.com>
Change-Id: Idd37ccf24e2c42bfc63ea4a79bb836c9ce16e366
parent 40fc945d
Loading
Loading
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment