KVM: arm64: Move management of __hyp_running_vcpu to load/put on VHE
Marc Zyngier
maintainerPATCH 1/1 KVM: arm64: Move management of __hyp_running_vcpu to load/put on VHE
The per-CPU host context structure contains a __hyp_running_vcpu that serves as a replacement for kvm_get_current_vcpu() in contexts where we cannot make direct use of it (such as in the nVHE hypervisor). Since there is a lot of common code between nVHE and VHE, the latter also populates this field even if kvm_get_running_vcpu() always works.
We currently pretty inconsistent when populating __hyp_running_vcpu to point to the currently running vcpu:
- on {n,h}VHE, we set __hyp_running_vcpu on entry to __kvm_vcpu_run and clear it on exit.
- on VHE, we set __hyp_running_vcpu on entry to __kvm_vcpu_run_vhe and never clear it, effectively leaving a dangling pointer...
VHE is obviously the odd one here. Although we could make it behave just like nVHE, this wouldn't match the behaviour of KVM with VHE, where the load phase is where most of the context-switch gets done.
So move all the __hyp_running_vcpu management to the VHE-specific load/put phases, giving us a bit more sanity and matching the behaviour of kvm_get_running_vcpu().
--- arch/arm64/kvm/hyp/vhe/switch.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/arm64/kvm/hyp/vhe/switch.c +4 -1
@@ -194,6 +194,8 @@ static void __vcpu_put_deactivate_traps(struct kvm_vcpu *vcpu)void kvm_vcpu_load_vhe (struct kvm_vcpu *vcpu) { +host_data_ptr (host_ctxt)->__hyp_running_vcpu = vcpu; +__vcpu_load_switch_sysregs (vcpu);__vcpu_load_activate_traps (vcpu);__load_stage2 (vcpu->arch.hw_mmu, vcpu->arch.hw_mmu->arch);
@@ -203,6 +205,8 @@ void kvm_vcpu_put_vhe(struct kvm_vcpu *vcpu) {__vcpu_put_deactivate_traps (vcpu);__vcpu_put_switch_sysregs (vcpu); + +host_data_ptr (host_ctxt)->__hyp_running_vcpu =NULL ; }static bool kvm_hyp_handle_eret (struct kvm_vcpu *vcpu,u64 *exit_code)
@@ -307,7 +311,6 @@ static int __kvm_vcpu_run_vhe(struct kvm_vcpu *vcpu)u64 exit_code; host_ctxt =host_data_ptr (host_ctxt); - host_ctxt->__hyp_running_vcpu = vcpu; guest_ctxt = &vcpu->arch.ctxt;sysreg_save_host_state_vhe (host_ctxt);
Signature · 1 line
2.39.2
Quoted 19 lines · Marc Zyngier
The per-CPU host context structure contains a
__hyp_running_vcputhat serves as a replacement forkvm_get_current_vcpu()in contexts where we cannot make direct use of it (such as in the nVHE hypervisor). Since there is a lot of common code between nVHE and VHE, the latter also populates this field even ifkvm_get_running_vcpu()always works.We currently pretty inconsistent when populating
__hyp_running_vcputo point to the currently running vcpu:- on {n,h}VHE, we set
__hyp_running_vcpuon entry to__kvm_vcpu_runand clear it on exit.- on VHE, we set
__hyp_running_vcpuon entry to__kvm_vcpu_run_vheand never clear it, effectively leaving a dangling pointer...VHE is obviously the odd one here. Although we could make it behave just like nVHE, this wouldn't match the behaviour of KVM with VHE, where the load phase is where most of the context-switch gets done.
Quoted 5 lines
So move all the
__hyp_running_vcpumanagement to the VHE-specific load/put phases, giving us a bit more sanity and matching the behaviour ofkvm_get_running_vcpu().Signed-off-by Marc Zyngier <[email protected]>
Signature · 2 lines
Thanks, Oliver
Quoted 10 lines · Marc Zyngier
The per-CPU host context structure contains a
__hyp_running_vcputhat serves as a replacement forkvm_get_current_vcpu()in contexts where we cannot make direct use of it (such as in the nVHE hypervisor). Since there is a lot of common code between nVHE and VHE, the latter also populates this field even ifkvm_get_running_vcpu()always works.We currently pretty inconsistent when populating
__hyp_running_vcputo point to the currently running vcpu:[...]
Applied to next, thanks!
[1/1] KVM: arm64: Move management of __hyp_running_vcpu to load/put on VHE
commit: 9a39359903fea9c354d89dce81ffd952859c90dc
Cheers,
M.
Signature · 1 line
Without deviation from the norm, progress is not possible.