Commit c718ca0e authored by Raghavendra Rao Ananta's avatar Raghavendra Rao Ananta Committed by Oliver Upton
Browse files

KVM: arm64: Fix hardware enable/disable flows for pKVM



When running in protected mode, the hyp stub is disabled after pKVM is
initialized, meaning the host cannot enable/disable the hyp at
runtime. As such, kvm_arm_hardware_enabled is always 1 after
initialization, and kvm_arch_hardware_enable() never enables the vgic
maintenance irq or timer irqs.

Unconditionally enable/disable the vgic + timer irqs in the respective
calls, instead relying on the percpu bookkeeping in the generic code
to keep track of which cpus have the interrupts unmasked.

Fixes: 466d27e4 ("KVM: arm64: Simplify the CPUHP logic")
Reported-by: default avatarOliver Upton <oliver.upton@linux.dev>
Suggested-by: default avatarOliver Upton <oliver.upton@linux.dev>
Signed-off-by: default avatarRaghavendra Rao Ananta <rananta@google.com>
Link: https://lore.kernel.org/r/20230719175400.647154-1-rananta@google.com


Acked-by: default avatarMarc Zyngier <maz@kernel.org>
Signed-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
parent 84f68679
Loading
Loading
Loading
Loading
+4 −11
Original line number Diff line number Diff line
@@ -1874,8 +1874,6 @@ static void _kvm_arch_hardware_enable(void *discard)

int kvm_arch_hardware_enable(void)
{
	int was_enabled;

	/*
	 * Most calls to this function are made with migration
	 * disabled, but not with preemption disabled. The former is
@@ -1884,13 +1882,10 @@ int kvm_arch_hardware_enable(void)
	 */
	preempt_disable();

	was_enabled = __this_cpu_read(kvm_arm_hardware_enabled);
	_kvm_arch_hardware_enable(NULL);

	if (!was_enabled) {
	kvm_vgic_cpu_up();
	kvm_timer_cpu_up();
	}

	preempt_enable();

@@ -1907,10 +1902,8 @@ static void _kvm_arch_hardware_disable(void *discard)

void kvm_arch_hardware_disable(void)
{
	if (__this_cpu_read(kvm_arm_hardware_enabled)) {
	kvm_timer_cpu_down();
	kvm_vgic_cpu_down();
	}

	if (!is_protected_kvm_enabled())
		_kvm_arch_hardware_disable(NULL);