diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0075-perf-amd-ibs-Use-is_visible-callback-for-dynamic-att.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0075-perf-amd-ibs-Use-is_visible-callback-for-dynamic-att.patch | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0075-perf-amd-ibs-Use-is_visible-callback-for-dynamic-att.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0075-perf-amd-ibs-Use-is_visible-callback-for-dynamic-att.patch new file mode 100644 index 00000000..9469d4b9 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0075-perf-amd-ibs-Use-is_visible-callback-for-dynamic-att.patch @@ -0,0 +1,177 @@ +From 20efc1f83222c3003aed82f0c7e10e0379d6c40d Mon Sep 17 00:00:00 2001 +From: Ravi Bangoria <ravi.bangoria@amd.com> +Date: Mon, 9 May 2022 10:19:08 +0530 +Subject: [PATCH 75/86] perf/amd/ibs: Use ->is_visible callback for dynamic + attributes + +commit 2a7a7e658682bfd7501dc6b4c9d365aa6c79788a upstream + +Currently, some attributes are added at build time whereas others +at boot time depending on IBS pmu capabilities. Instead, we can +just add all attribute groups at build time but hide individual +group at boot time using more appropriate ->is_visible() callback. + +Also, struct perf_ibs has bunch of fields for pmu attributes which +just pass on the pointer, does not do anything else. Remove them. + +Signed-off-by: Ravi Bangoria <ravi.bangoria@amd.com> +Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> +Link: https://lore.kernel.org/r/20220509044914.1473-3-ravi.bangoria@amd.com +Signed-off-by: Zhaolong Zhang <zhaolong.zhang@windriver.com> +--- + arch/x86/events/amd/ibs.c | 78 +++++++++++++++++++++++++++------------ + 1 file changed, 54 insertions(+), 24 deletions(-) + +diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c +index 2704ec1e42a3..ece4f6a7d24b 100644 +--- a/arch/x86/events/amd/ibs.c ++++ b/arch/x86/events/amd/ibs.c +@@ -94,10 +94,6 @@ struct perf_ibs { + unsigned int fetch_ignore_if_zero_rip : 1; + struct cpu_perf_ibs __percpu *pcpu; + +- struct attribute **format_attrs; +- struct attribute_group format_group; +- const struct attribute_group *attr_groups[2]; +- + u64 (*get_count)(u64 config); + }; + +@@ -528,16 +524,61 @@ static void perf_ibs_del(struct perf_event *event, int flags) + + static void perf_ibs_read(struct perf_event *event) { } + ++/* ++ * We need to initialize with empty group if all attributes in the ++ * group are dynamic. ++ */ ++static struct attribute *attrs_empty[] = { ++ NULL, ++}; ++ ++static struct attribute_group empty_format_group = { ++ .name = "format", ++ .attrs = attrs_empty, ++}; ++ ++static const struct attribute_group *empty_attr_groups[] = { ++ &empty_format_group, ++ NULL, ++}; ++ + PMU_FORMAT_ATTR(rand_en, "config:57"); + PMU_FORMAT_ATTR(cnt_ctl, "config:19"); + +-static struct attribute *ibs_fetch_format_attrs[] = { ++static struct attribute *rand_en_attrs[] = { + &format_attr_rand_en.attr, + NULL, + }; + +-static struct attribute *ibs_op_format_attrs[] = { +- NULL, /* &format_attr_cnt_ctl.attr if IBS_CAPS_OPCNT */ ++static struct attribute_group group_rand_en = { ++ .name = "format", ++ .attrs = rand_en_attrs, ++}; ++ ++static const struct attribute_group *fetch_attr_groups[] = { ++ &group_rand_en, ++ NULL, ++}; ++ ++static umode_t ++cnt_ctl_is_visible(struct kobject *kobj, struct attribute *attr, int i) ++{ ++ return ibs_caps & IBS_CAPS_OPCNT ? attr->mode : 0; ++} ++ ++static struct attribute *cnt_ctl_attrs[] = { ++ &format_attr_cnt_ctl.attr, ++ NULL, ++}; ++ ++static struct attribute_group group_cnt_ctl = { ++ .name = "format", ++ .attrs = cnt_ctl_attrs, ++ .is_visible = cnt_ctl_is_visible, ++}; ++ ++static const struct attribute_group *op_attr_update[] = { ++ &group_cnt_ctl, + NULL, + }; + +@@ -561,7 +602,6 @@ static struct perf_ibs perf_ibs_fetch = { + .max_period = IBS_FETCH_MAX_CNT << 4, + .offset_mask = { MSR_AMD64_IBSFETCH_REG_MASK }, + .offset_max = MSR_AMD64_IBSFETCH_REG_COUNT, +- .format_attrs = ibs_fetch_format_attrs, + + .get_count = get_ibs_fetch_count, + }; +@@ -587,7 +627,6 @@ static struct perf_ibs perf_ibs_op = { + .max_period = IBS_OP_MAX_CNT << 4, + .offset_mask = { MSR_AMD64_IBSOP_REG_MASK }, + .offset_max = MSR_AMD64_IBSOP_REG_COUNT, +- .format_attrs = ibs_op_format_attrs, + + .get_count = get_ibs_op_count, + }; +@@ -757,17 +796,6 @@ static __init int perf_ibs_pmu_init(struct perf_ibs *perf_ibs, char *name) + + perf_ibs->pcpu = pcpu; + +- /* register attributes */ +- if (perf_ibs->format_attrs[0]) { +- memset(&perf_ibs->format_group, 0, sizeof(perf_ibs->format_group)); +- perf_ibs->format_group.name = "format"; +- perf_ibs->format_group.attrs = perf_ibs->format_attrs; +- +- memset(&perf_ibs->attr_groups, 0, sizeof(perf_ibs->attr_groups)); +- perf_ibs->attr_groups[0] = &perf_ibs->format_group; +- perf_ibs->pmu.attr_groups = perf_ibs->attr_groups; +- } +- + ret = perf_pmu_register(&perf_ibs->pmu, name, -1); + if (ret) { + perf_ibs->pcpu = NULL; +@@ -779,7 +807,6 @@ static __init int perf_ibs_pmu_init(struct perf_ibs *perf_ibs, char *name) + + static __init int perf_event_ibs_init(void) + { +- struct attribute **attr = ibs_op_format_attrs; + int ret; + + /* +@@ -792,14 +819,14 @@ static __init int perf_event_ibs_init(void) + if (boot_cpu_data.x86 == 0x19 && boot_cpu_data.x86_model < 0x10) + perf_ibs_fetch.fetch_ignore_if_zero_rip = 1; + ++ perf_ibs_fetch.pmu.attr_groups = fetch_attr_groups; ++ + ret = perf_ibs_pmu_init(&perf_ibs_fetch, "ibs_fetch"); + if (ret) + return ret; + +- if (ibs_caps & IBS_CAPS_OPCNT) { ++ if (ibs_caps & IBS_CAPS_OPCNT) + perf_ibs_op.config_mask |= IBS_OP_CNT_CTL; +- *attr++ = &format_attr_cnt_ctl.attr; +- } + + if (ibs_caps & IBS_CAPS_OPCNTEXT) { + perf_ibs_op.max_period |= IBS_OP_MAX_CNT_EXT_MASK; +@@ -807,6 +834,9 @@ static __init int perf_event_ibs_init(void) + perf_ibs_op.cnt_mask |= IBS_OP_MAX_CNT_EXT_MASK; + } + ++ perf_ibs_op.pmu.attr_groups = empty_attr_groups; ++ perf_ibs_op.pmu.attr_update = op_attr_update; ++ + ret = perf_ibs_pmu_init(&perf_ibs_op, "ibs_op"); + if (ret) + goto err_op; +-- +2.37.3 + |