mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
KVM: arm64: vgic-its: Stop the VM when handling MOVALL
MOVALL is a royal pain, as it requires us to iterate over all the LPIs and move them around if they are on the correct source vcpu, and requiring locking for each of them. This locking can result in contention for vcpus that enter and exit the guest, and hinders forward progress. In order to make sure such process is not contended, just stop the VM altogether. Nobody in their right mind uses MOVALL anyway, as this is a rather braindead aspect of the GICv3 architecture. Reviewed-by: Fuad Tabba <fuad.tabba@linux.dev> Tested-by: Fuad Tabba <fuad.tabba@linux.dev> Link: https://patch.msgid.link/20261015100539.1011760-8-maz@kernel.org Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
parent
a1b4bd2c2c
commit
b31bce255a
|
|
@ -1382,6 +1382,15 @@ static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its,
|
|||
if (vcpu1 == vcpu2)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Bulk operations such as MOVALL are a pain, as they can clash
|
||||
* badly locking-wise with other vcpus entering and exiting the
|
||||
* guest, should they be affected by it. Stopping the guest is a
|
||||
* safer bet to ensure uncontended access and ultimately forward
|
||||
* progress. Yeah...
|
||||
*/
|
||||
kvm_arm_halt_guest(kvm);
|
||||
|
||||
xa_for_each(&dist->lpi_xa, intid, irq) {
|
||||
irq = vgic_get_irq(kvm, intid);
|
||||
if (!irq)
|
||||
|
|
@ -1394,6 +1403,8 @@ static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its,
|
|||
|
||||
vgic_its_invalidate_cache(its);
|
||||
|
||||
kvm_arm_resume_guest(kvm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user