Re: [PATCH] perf/core: introduced stub APIs for exported APIs

From: Mark Rutland
Date: Mon Mar 06 2023 - 11:57:53 EST


On Sun, Mar 05, 2023 at 11:09:34AM +0530, Manish Bhardwaj wrote:
> Introduced stub APIs for exported APIs so that we can build
> independent module without any error if CONFIG_PERF_EVENT
> feature is disabled in kernel.
>
> drivers/platform/tegra/uncore_pmu/tegra23x_perf_uncore.c:

This file and folders do not exist in mainline (looking at v6.3-rc1), and I'd
expect this driver to live under drivers/perf/ unless it's tied to some other
component, which the naming implies it is not.

There is no point bulding a PMU driver when CONFIG_PERF_EVENT=n, since it
cannot register with perf and so the code will bloat the kernel for no reason.

The better option is to fix the Kconfig for the driver to depend upon
CONFIG_PERF_EVENT=y so that it cannot be built in this case.

Thanks,
Mark.

> In function _scf_pmu_device_probe_:
> drivers/platform/tegra/uncore_pmu/tegra23x_perf_uncore.c:596: 8:
> error: implicit declaration of function _perf_pmu_register_
> [-Werror=implicit-function-declaration]
> err = perf_pmu_register(&uncore_pmu->pmu, uncore_pmu->pmu.name,
> 531 | ^~~~~~~~~~~~~~~~~
> drivers/platform/tegra/uncore_pmu/tegra23x_perf_uncore.c: In
> function _scf_pmu_device_remove_:
> drivers/platform/tegra/uncore_pmu/tegra23x_perf_uncore.c:611: 2:
> error: implicit declaration of function _perf_pmu_unregister_; did you
> mean _device_unregister_? [-Werror=implicit-function-declaration]
> 611 | perf_pmu_unregister(&uncore_pmu->pmu);
> | ^~~~~~~~~~~~~~~~~~~
> | device_unregister
> cc1: some warnings being treated as errors
> scripts/Makefile.build:297: recipe for target
> 'drivers/platform/tegra/uncore_pmu/tegra23x_perf_uncore.o' failed
> make[7]: *** [drivers/platform/tegra/
> uncore_pmu/tegra23x_perf_uncore.o] Error 1
>
> Signed-off-by: Manish Bhardwaj <bhardwajmanish18@xxxxxxxxx>
> ---
> include/linux/perf_event.h | 36 ++++++++++++++++++++++++++++++++++++
> 1 file changed, 36 insertions(+)
>
> diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> index d5628a7b5eaa..f3361f6f348e 100644
> --- a/include/linux/perf_event.h
> +++ b/include/linux/perf_event.h
> @@ -1679,6 +1679,42 @@ extern int perf_event_account_interrupt(struct perf_event *event);
> extern int perf_event_period(struct perf_event *event, u64 value);
> extern u64 perf_event_pause(struct perf_event *event, bool reset);
> #else /* !CONFIG_PERF_EVENTS: */
> +static void perf_event_addr_filters_sync(struct perf_event *event) { }
> +static u64 perf_event_read_value(struct perf_event *event,
> + u64 *enabled, u64 *running)
> +{
> + return 0;
> +}
> +static void perf_event_update_userpage(struct perf_event *event) { }
> +static void perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *cbs) { }
> +static void perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs) { }
> +static void perf_report_aux_output_id(struct perf_event *event, u64 hw_id) { }
> +static void perf_tp_event(u16 event_type, u64 count, void *record,
> + int entry_size, struct pt_regs *regs,
> + struct hlist_head *head, int rctx,
> + struct task_struct *task)
> +{
> +}
> +static int perf_pmu_register(struct pmu *pmu, const char *name, int type)
> +{
> + return -1;
> +}
> +extern void perf_pmu_unregister(struct pmu *pmu) { }
> +static struct perf_event *
> +perf_event_create_kernel_counter(struct perf_event_attr *attr,
> + int cpu,
> + struct task_struct *task,
> + perf_overflow_handler_t callback,
> + void *context)
> +{
> + return NULL;
> +}
> +static void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu) { }
> +static ssize_t perf_event_sysfs_show(struct device *dev, struct device_attribute *attr,
> + char *page)
> +{
> + return -1;
> +}
> static inline void *
> perf_aux_output_begin(struct perf_output_handle *handle,
> struct perf_event *event) { return NULL; }
> --
> 2.39.2
>