Replace static per-architecture ops with a callback-based ops structure. This makes architecture-specific PMU implementations more modular and easier to extend.
Signed-off-by: Tomasz Duszynski <tduszyn...@marvell.com> --- lib/pmu/pmu.c | 17 +---------------- lib/pmu/pmu_arm64.c | 19 +++++++++++++------ lib/pmu/pmu_private.h | 43 +++++++++++++++++++++++++++++++++++++------ 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/lib/pmu/pmu.c b/lib/pmu/pmu.c index 46b0b450ac..0709f5e58c 100644 --- a/lib/pmu/pmu.c +++ b/lib/pmu/pmu.c @@ -40,22 +40,7 @@ struct rte_pmu_event { RTE_EXPORT_INTERNAL_SYMBOL(rte_pmu) struct rte_pmu rte_pmu; -/* Stubs for arch-specific functions */ -#if !defined(RTE_PMU_SUPPORTED) || defined(RTE_ARCH_X86_64) -int -pmu_arch_init(void) -{ - return 0; -} -void -pmu_arch_fini(void) -{ -} -void -pmu_arch_fixup_config(uint64_t __rte_unused config[3]) -{ -} -#endif +const struct pmu_arch_ops *arch_ops; static int get_term_format(const char *name, int *num, uint64_t *mask) diff --git a/lib/pmu/pmu_arm64.c b/lib/pmu/pmu_arm64.c index a23f1864df..3f4f5fa297 100644 --- a/lib/pmu/pmu_arm64.c +++ b/lib/pmu/pmu_arm64.c @@ -62,8 +62,8 @@ write_attr_int(const char *path, int val) return 0; } -int -pmu_arch_init(void) +static int +pmu_arm64_init(void) { int ret; @@ -78,17 +78,24 @@ pmu_arch_init(void) return write_attr_int(PERF_USER_ACCESS_PATH, 1); } -void -pmu_arch_fini(void) +static void +pmu_arm64_fini(void) { write_attr_int(PERF_USER_ACCESS_PATH, restore_uaccess); } -void -pmu_arch_fixup_config(uint64_t config[3]) +static void +pmu_arm64_fixup_config(uint64_t config[3]) { /* select 64 bit counters */ config[1] |= RTE_BIT64(0); /* enable userspace access */ config[1] |= RTE_BIT64(1); } + +static const struct pmu_arch_ops arm64_ops = { + .init = pmu_arm64_init, + .fini = pmu_arm64_fini, + .fixup_config = pmu_arm64_fixup_config, +}; +PMU_SET_ARCH_OPS(arm64_ops) diff --git a/lib/pmu/pmu_private.h b/lib/pmu/pmu_private.h index 3db1cb242b..d74f7f4092 100644 --- a/lib/pmu/pmu_private.h +++ b/lib/pmu/pmu_private.h @@ -5,20 +5,47 @@ #ifndef PMU_PRIVATE_H #define PMU_PRIVATE_H +/** + * Structure describing architecture specific PMU operations. + */ +struct pmu_arch_ops { + int (*init)(void); + void (*fini)(void); + void (*fixup_config)(uint64_t config[3]); +}; + +extern const struct pmu_arch_ops *arch_ops; + +#define PMU_SET_ARCH_OPS(ops) \ + RTE_INIT(libpmu_set_arch_ops) \ + { \ + arch_ops = &(ops); \ + } + /** * Architecture-specific PMU init callback. * * @return * 0 in case of success, negative value otherwise. */ -int -pmu_arch_init(void); +static inline int +pmu_arch_init(void) +{ + if (arch_ops != NULL && arch_ops->init != NULL) + return arch_ops->init(); + + return 0; +} /** * Architecture-specific PMU cleanup callback. */ -void -pmu_arch_fini(void); +static inline void +pmu_arch_fini(void) +{ + if (arch_ops != NULL && arch_ops->fini != NULL) + arch_ops->fini(); +} /** * Apply architecture-specific settings to config before passing it to syscall. @@ -27,7 +54,11 @@ pmu_arch_fini(void); * Architecture-specific event configuration. * Consult kernel sources for available options. */ -void -pmu_arch_fixup_config(uint64_t config[3]); +static inline void +pmu_arch_fixup_config(uint64_t config[3]) +{ + if (arch_ops != NULL && arch_ops->fixup_config != NULL) + arch_ops->fixup_config(config); +} #endif /* PMU_PRIVATE_H */ -- 2.34.1