Commit 3e7b3379 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman
Browse files

KVM: PPC: Book3S HV P9: Switch PMU to guest as late as possible



This moves PMU switch to guest as late as possible in entry, and switch
back to host as early as possible at exit. This helps the host get the
most perf coverage of KVM entry/exit code as possible.

This is slightly suboptimal for SPR scheduling point of view when the
PMU is enabled, but when perf is disabled there is no real difference.

Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20211123095231.1036501-34-npiggin@gmail.com
parent 3f9e2966
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -3833,8 +3833,6 @@ static int kvmhv_vcpu_entry_p9_nested(struct kvm_vcpu *vcpu, u64 time_limit, uns
	s64 dec;
	int trap;

	switch_pmu_to_guest(vcpu, &host_os_sprs);

	save_p9_host_os_sprs(&host_os_sprs);

	/*
@@ -3897,9 +3895,11 @@ static int kvmhv_vcpu_entry_p9_nested(struct kvm_vcpu *vcpu, u64 time_limit, uns

	mtspr(SPRN_DAR, vcpu->arch.shregs.dar);
	mtspr(SPRN_DSISR, vcpu->arch.shregs.dsisr);
	switch_pmu_to_guest(vcpu, &host_os_sprs);
	trap = plpar_hcall_norets(H_ENTER_NESTED, __pa(&hvregs),
				  __pa(&vcpu->arch.regs));
	kvmhv_restore_hv_return_state(vcpu, &hvregs);
	switch_pmu_to_host(vcpu, &host_os_sprs);
	vcpu->arch.shregs.msr = vcpu->arch.regs.msr;
	vcpu->arch.shregs.dar = mfspr(SPRN_DAR);
	vcpu->arch.shregs.dsisr = mfspr(SPRN_DSISR);
@@ -3918,8 +3918,6 @@ static int kvmhv_vcpu_entry_p9_nested(struct kvm_vcpu *vcpu, u64 time_limit, uns

	restore_p9_host_os_sprs(vcpu, &host_os_sprs);

	switch_pmu_to_host(vcpu, &host_os_sprs);

	return trap;
}

+2 −4
Original line number Diff line number Diff line
@@ -601,8 +601,6 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
	local_paca->kvm_hstate.host_purr = mfspr(SPRN_PURR);
	local_paca->kvm_hstate.host_spurr = mfspr(SPRN_SPURR);

	switch_pmu_to_guest(vcpu, &host_os_sprs);

	save_p9_host_os_sprs(&host_os_sprs);

	/*
@@ -744,7 +742,9 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc

	accumulate_time(vcpu, &vcpu->arch.guest_time);

	switch_pmu_to_guest(vcpu, &host_os_sprs);
	kvmppc_p9_enter_guest(vcpu);
	switch_pmu_to_host(vcpu, &host_os_sprs);

	accumulate_time(vcpu, &vcpu->arch.rm_intr);

@@ -955,8 +955,6 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
		asm volatile(PPC_CP_ABORT);

out:
	switch_pmu_to_host(vcpu, &host_os_sprs);

	end_timing(vcpu);

	return trap;