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: Kim Phillips <kim.phillips@amd.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20210817221048.88063-8-kim.phillips@amd.com
This commit is contained in:
parent
9164d9493a
commit
05485745ad
@ -34,4 +34,14 @@ config PERF_EVENTS_AMD_POWER
|
|||||||
(CPUID Fn8000_0007_EDX[12]) interface to calculate the
|
(CPUID Fn8000_0007_EDX[12]) interface to calculate the
|
||||||
average power consumption on Family 15h processors.
|
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
|
endmenu
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# 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_PERF_EVENTS_AMD_POWER) += power.o
|
||||||
obj-$(CONFIG_X86_LOCAL_APIC) += ibs.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
|
ifdef CONFIG_AMD_IOMMU
|
||||||
obj-$(CONFIG_CPU_SUP_AMD) += iommu.o
|
obj-$(CONFIG_CPU_SUP_AMD) += iommu.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -347,6 +347,7 @@ static struct pmu amd_nb_pmu = {
|
|||||||
.stop = amd_uncore_stop,
|
.stop = amd_uncore_stop,
|
||||||
.read = amd_uncore_read,
|
.read = amd_uncore_read,
|
||||||
.capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT,
|
.capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT,
|
||||||
|
.module = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pmu amd_llc_pmu = {
|
static struct pmu amd_llc_pmu = {
|
||||||
@ -360,6 +361,7 @@ static struct pmu amd_llc_pmu = {
|
|||||||
.stop = amd_uncore_stop,
|
.stop = amd_uncore_stop,
|
||||||
.read = amd_uncore_read,
|
.read = amd_uncore_read,
|
||||||
.capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT,
|
.capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT,
|
||||||
|
.module = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct amd_uncore *amd_uncore_alloc(unsigned int cpu)
|
static struct amd_uncore *amd_uncore_alloc(unsigned int cpu)
|
||||||
@ -665,4 +667,28 @@ fail_nb:
|
|||||||
|
|
||||||
return ret;
|
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");
|
||||||
|
Loading…
Reference in New Issue
Block a user