Commit f26f9933 authored by Kajol Jain's avatar Kajol Jain Committed by Michael Ellerman
Browse files

powerpc/perf: Add per-task/process monitoring to vpa_pmu driver



Enhance the vpa_pmu driver with a feature to observe context switch
latency event for both per-task (tid) and per-pid (pid) option.
Couple of new helper functions are added to hide the abstraction of
reading the context switch latency counter from kvm_vcpu_arch struct
and these helper functions are defined in the "kvm/book3s_hv.c".

"PERF_ATTACH_TASK" flag is used to decide whether to read the counter
values from lppaca or kvm_vcpu_arch struct.

Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
Co-developed-by: default avatarMadhavan Srinivasan <maddy@linux.ibm.com>
Signed-off-by: default avatarMadhavan Srinivasan <maddy@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://patch.msgid.link/20241118114114.208964-4-kjain@linux.ibm.com
parent 5f0b48c6
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -691,6 +691,9 @@ void kvmhv_set_l2_counters_status(int cpu, bool status);
u64 kvmhv_get_l1_to_l2_cs_time(void);
u64 kvmhv_get_l2_to_l1_cs_time(void);
u64 kvmhv_get_l2_runtime_agg(void);
u64 kvmhv_get_l1_to_l2_cs_time_vcpu(void);
u64 kvmhv_get_l2_to_l1_cs_time_vcpu(void);
u64 kvmhv_get_l2_runtime_agg_vcpu(void);

#endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */

+45 −0
Original line number Diff line number Diff line
@@ -4190,6 +4190,51 @@ u64 kvmhv_get_l2_runtime_agg(void)
}
EXPORT_SYMBOL(kvmhv_get_l2_runtime_agg);

u64 kvmhv_get_l1_to_l2_cs_time_vcpu(void)
{
	struct kvm_vcpu *vcpu;
	struct kvm_vcpu_arch *arch;

	vcpu = local_paca->kvm_hstate.kvm_vcpu;
	if (vcpu) {
		arch = &vcpu->arch;
		return arch->l1_to_l2_cs;
	} else {
		return 0;
	}
}
EXPORT_SYMBOL(kvmhv_get_l1_to_l2_cs_time_vcpu);

u64 kvmhv_get_l2_to_l1_cs_time_vcpu(void)
{
	struct kvm_vcpu *vcpu;
	struct kvm_vcpu_arch *arch;

	vcpu = local_paca->kvm_hstate.kvm_vcpu;
	if (vcpu) {
		arch = &vcpu->arch;
		return arch->l2_to_l1_cs;
	} else {
		return 0;
	}
}
EXPORT_SYMBOL(kvmhv_get_l2_to_l1_cs_time_vcpu);

u64 kvmhv_get_l2_runtime_agg_vcpu(void)
{
	struct kvm_vcpu *vcpu;
	struct kvm_vcpu_arch *arch;

	vcpu = local_paca->kvm_hstate.kvm_vcpu;
	if (vcpu) {
		arch = &vcpu->arch;
		return arch->l2_runtime_agg;
	} else {
		return 0;
	}
}
EXPORT_SYMBOL(kvmhv_get_l2_runtime_agg_vcpu);

#else
int kvmhv_get_l2_counters_status(void)
{
+12 −3
Original line number Diff line number Diff line
@@ -97,12 +97,21 @@ static unsigned long get_counter_data(struct perf_event *event)

	switch (config) {
	case L1_TO_L2_CS_LAT:
		if (event->attach_state & PERF_ATTACH_TASK)
			data = kvmhv_get_l1_to_l2_cs_time_vcpu();
		else
			data = kvmhv_get_l1_to_l2_cs_time();
		break;
	case L2_TO_L1_CS_LAT:
		if (event->attach_state & PERF_ATTACH_TASK)
			data = kvmhv_get_l2_to_l1_cs_time_vcpu();
		else
			data = kvmhv_get_l2_to_l1_cs_time();
		break;
	case L2_RUNTIME_AGG:
		if (event->attach_state & PERF_ATTACH_TASK)
			data = kvmhv_get_l2_runtime_agg_vcpu();
		else
			data = kvmhv_get_l2_runtime_agg();
		break;
	default: