Commit 05485745 authored by Kim Phillips's avatar Kim Phillips Committed by Ingo Molnar
Browse files

perf/amd/uncore: Allow the driver to be built as a module



Add support to build the AMD uncore driver as a module.

This is in order to facilitate development without having
to reboot the kernel in most cases.

Signed-off-by: default avatarKim Phillips <kim.phillips@amd.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20210817221048.88063-8-kim.phillips@amd.com
parent 9164d949
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -34,4 +34,14 @@ config PERF_EVENTS_AMD_POWER
	  (CPUID Fn8000_0007_EDX[12]) interface to calculate the
	  average power consumption on Family 15h processors.

config PERF_EVENTS_AMD_UNCORE
	tristate "AMD Uncore performance events"
	depends on PERF_EVENTS && CPU_SUP_AMD
	default y
	help
	  Include support for AMD uncore performance events for use with
	  e.g., perf stat -e amd_l3/.../,amd_df/.../.

	  To compile this driver as a module, choose M here: the
	  module will be called 'amd-uncore'.
endmenu
+3 −2
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_CPU_SUP_AMD)		+= core.o uncore.o
obj-$(CONFIG_CPU_SUP_AMD)		+= core.o
obj-$(CONFIG_PERF_EVENTS_AMD_POWER)	+= power.o
obj-$(CONFIG_X86_LOCAL_APIC)		+= ibs.o
obj-$(CONFIG_PERF_EVENTS_AMD_UNCORE)	+= amd-uncore.o
amd-uncore-objs				:= uncore.o
ifdef CONFIG_AMD_IOMMU
obj-$(CONFIG_CPU_SUP_AMD)		+= iommu.o
endif
+27 −1
Original line number Diff line number Diff line
@@ -347,6 +347,7 @@ static struct pmu amd_nb_pmu = {
	.stop		= amd_uncore_stop,
	.read		= amd_uncore_read,
	.capabilities	= PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT,
	.module		= THIS_MODULE,
};

static struct pmu amd_llc_pmu = {
@@ -360,6 +361,7 @@ static struct pmu amd_llc_pmu = {
	.stop		= amd_uncore_stop,
	.read		= amd_uncore_read,
	.capabilities	= PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT,
	.module		= THIS_MODULE,
};

static struct amd_uncore *amd_uncore_alloc(unsigned int cpu)
@@ -665,4 +667,28 @@ static int __init amd_uncore_init(void)

	return ret;
}
device_initcall(amd_uncore_init);

static void __exit amd_uncore_exit(void)
{
	cpuhp_remove_state(CPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE);
	cpuhp_remove_state(CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING);
	cpuhp_remove_state(CPUHP_PERF_X86_AMD_UNCORE_PREP);

	if (boot_cpu_has(X86_FEATURE_PERFCTR_LLC)) {
		perf_pmu_unregister(&amd_llc_pmu);
		free_percpu(amd_uncore_llc);
		amd_uncore_llc = NULL;
	}

	if (boot_cpu_has(X86_FEATURE_PERFCTR_NB)) {
		perf_pmu_unregister(&amd_nb_pmu);
		free_percpu(amd_uncore_nb);
		amd_uncore_nb = NULL;
	}
}

module_init(amd_uncore_init);
module_exit(amd_uncore_exit);

MODULE_DESCRIPTION("AMD Uncore Driver");
MODULE_LICENSE("GPL v2");