perf: make Arm CCI driver modular
v2 cover perf: make Arm CCI driver modular
Now that it has been surgically removed from the MCPM port-control code, we can let the CCI PMU driver be modular. Probing the PMU in the first place still depends on the bus driver stub being built-in, but it's a small price to pay compared to the major upheaval of completely reworking the DT-handling code across the two drivers.
Robin.
v2: Fix Kconfig dependencies per kbuild robot report
Robin Murphy (3):
perf/arm-cc*: Fix MODULE_LICENSE() tags
perf/arm-cci: Remove pointless PMU disabling
perf/arm-cci: Allow building as a module
drivers/perf/Kconfig | 34 ++++++++++++++++++---------------- drivers/perf/arm-cci.c | 32 ++++++++++++++++++++------------ drivers/perf/arm-ccn.c | 2 +- 3 files changed, 39 insertions(+), 29 deletions(-)
Signature · 1 line
2.17.0.dirty
PATCH v2 1/3 perf/arm-cc*: Fix MODULE_LICENSE() tags
The CCI/CCN drivers are licensed under GPLv2, but the MODULE_LICENSE() tags are using the bare "GPL" string implying GPLv2 or later. Fix them to match their actual file license.
---
v2: No change
drivers/perf/arm-cci.c | 2 +- drivers/perf/arm-ccn.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/perf/arm-cci.c +1 -1
@@ -1718,5 +1718,5 @@ static struct platform_driver cci_pmu_driver = { };builtin_platform_driver (cci_pmu_driver); -MODULE_LICENSE ("GPL" ); +MODULE_LICENSE ("GPL v2" );MODULE_DESCRIPTION ("ARM CCI PMU support" );
drivers/perf/arm-ccn.c +1 -1
@@ -1594,4 +1594,4 @@ module_init(arm_ccn_init);module_exit (arm_ccn_exit);MODULE_AUTHOR ("Pawel Moll <[email protected]>" ); -MODULE_LICENSE ("GPL" ); +MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.17.0.dirty
PATCH v2 2/3 perf/arm-cci: Remove pointless PMU disabling
In reply to Robin MurphyThe CCI PMU driver bears some legacy remnants of the arm_pmu framework from when it was split in c6f85cb4305b ("bus: cci: move away from arm_pmu framework"). In particular this perf_pmu_{dis,en}able() dance around pmu->add which was fixed for arm_pmu in a9e469d1c89b ("drivers/perf: arm_pmu: remove pointless PMU disabling").
For the exact same reasons (i.e. perf core already does this around the call anyway), give cci_pmu_add() the exact same change, which also prevents having to export those core functions to build it as a module.
---
v2: Add Mark's ack
drivers/perf/arm-cci.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-)
drivers/perf/arm-cci.c +3 -10
@@ -1184,16 +1184,11 @@ static int cci_pmu_add(struct perf_event *event, int flags)struct cci_pmu_hw_events *hw_events = &cci_pmu->hw_events;struct hw_perf_event *hwc = &event->hw;int idx; -int err =0 ; - -perf_pmu_disable (event->pmu);/* If we don't have a space for the counter then finish early. */ idx =pmu_get_event_idx (hw_events, event); -if (idx <0 ) { - err = idx; - goto out; - } +if (idx <0 ) +return idx; event->hw.idx = idx; hw_events->events[idx] = event;
@@ -1205,9 +1200,7 @@ static int cci_pmu_add(struct perf_event *event, int flags)/* Propagate our changes to the userspace mapping. */ perf_event_update_userpage (event); -out: -perf_pmu_enable (event->pmu); -return err; +return 0 ; }static void cci_pmu_del (struct perf_event *event,int flags)
Signature · 1 line
2.17.0.dirty
PATCH v2 3/3 perf/arm-cci: Allow building as a module
In reply to Robin MurphyFill in the few extra bits and annotations needed to make the driver work properly as a module, and jiggle the Kconfig to expose the driver-level ARM_CCI_PMU option.
---
v2: Move ARM/64 dependency up accordingly
drivers/perf/Kconfig | 34 ++++++++++++++++++---------------- drivers/perf/arm-cci.c | 17 ++++++++++++++++- 2 files changed, 34 insertions(+), 17 deletions(-)
drivers/perf/Kconfig +18 -16
@@ -6,30 +6,32 @@ menu "Performance monitor support" depends on PERF_EVENTS config ARM_CCI_PMU - bool + tristate "ARM CCI PMU driver" + depends on (ARM && CPU_V7) || ARM64 select ARM_CCI + help + Support for PMU events monitoring on the ARM CCI (Cache Coherent + Interconnect) family of products. + + If compiled as a module, it will be called arm-cci. config ARM_CCI400_PMU - bool "ARM CCI400 PMU support" - depends on (ARM && CPU_V7) || ARM64 + bool "support CCI-400" + default y + depends on ARM_CCI_PMU select ARM_CCI400_COMMON - select ARM_CCI_PMU help - Support for PMU events monitoring on the ARM CCI-400 (cache coherent - interconnect). CCI-400 supports counting events related to the - connected slave/master interfaces. + CCI-400 provides 4 independent event counters counting events related + to the connected slave/master interfaces, plus a cycle counter. config ARM_CCI5xx_PMU - bool "ARM CCI-500/CCI-550 PMU support" - depends on (ARM && CPU_V7) || ARM64 - select ARM_CCI_PMU + bool "support CCI-500/CCI-550" + default y + depends on ARM_CCI_PMU help - Support for PMU events monitoring on the ARM CCI-500/CCI-550 cache - coherent interconnects. Both of them provide 8 independent event counters, - which can count events pertaining to the slave/master interfaces as well - as the internal events to the CCI. - - If unsure, say Y + CCI-500/CCI-550 both provide 8 independent event counters, which can + count events pertaining to the slave/master interfaces as well as the + internal events to the CCI. config ARM_CCN tristate "ARM CCN driver support"
drivers/perf/arm-cci.c +16 -1
@@ -1416,6 +1416,7 @@ static int cci_pmu_init(struct cci_pmu *cci_pmu, struct platform_device *pdev) pmu_format_attr_group.attrs = model->format_attrs; cci_pmu->pmu = (struct pmu ) { + .module =THIS_MODULE , .name = cci_pmu->model->name, .task_ctx_nr = perf_invalid_context, .pmu_enable = cci_pmu_enable,
@@ -1581,6 +1582,7 @@ static const struct of_device_id arm_cci_pmu_matches[] = {#endif {}, }; +MODULE_DEVICE_TABLE (of, arm_cci_pmu_matches);static bool is_duplicate_irq (int irq,int *irqs,int nr_irqs) {
@@ -1702,14 +1704,27 @@ static int cci_pmu_probe(struct platform_device *pdev)return 0 ; } +static int cci_pmu_remove (struct platform_device *pdev) +{ +if (!g_cci_pmu) +return 0 ; + +cpuhp_remove_state (CPUHP_AP_PERF_ARM_CCI_ONLINE ); +perf_pmu_unregister (&g_cci_pmu->pmu); + g_cci_pmu =NULL ; + +return 0 ; +} +static struct platform_driver cci_pmu_driver = { .driver = { .name =DRIVER_NAME , .of_match_table = arm_cci_pmu_matches, }, .probe = cci_pmu_probe, + .remove = cci_pmu_remove, }; -builtin_platform_driver (cci_pmu_driver); +module_platform_driver (cci_pmu_driver);MODULE_LICENSE ("GPL v2" );MODULE_DESCRIPTION ("ARM CCI PMU support" );
Signature · 1 line
2.17.0.dirty