From: Jiri Olsa jolsa@kernel.org
mainline inclusion from mainline-v5.3-rc1 commit f3a3a8257e5a1a5e67cbb1afdbc4c1c6a26f1b22 category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I47H3V CVE: NA
--------------------------------
commit f3a3a8257e5a1a5e67cbb1afdbc4c1c6a26f1b22 upstream Backport summary: backport to kernel 4.19.57 for ICX perf topdown support
Adding attr_update attribute group into pmu, to allow having multiple attribute groups for same group name.
This will allow us to update "events" or "format" directories with attributes that depend on various HW conditions.
For example having group_format_extra group that updates "format" directory only if pmu version is 2 and higher:
static umode_t exra_is_visible(struct kobject *kobj, struct attribute *attr, int i) { return x86_pmu.version >= 2 ? attr->mode : 0; }
static struct attribute_group group_format_extra = { .name = "format", .is_visible = exra_is_visible, };
Signed-off-by: Jiri Olsa jolsa@kernel.org Signed-off-by: Peter Zijlstra (Intel) peterz@infradead.org Cc: Alexander Shishkin alexander.shishkin@linux.intel.com Cc: Arnaldo Carvalho de Melo acme@kernel.org Cc: Greg Kroah-Hartman gregkh@linuxfoundation.org Cc: Linus Torvalds torvalds@linux-foundation.org Cc: Namhyung Kim namhyung@kernel.org Cc: Peter Zijlstra peterz@infradead.org Cc: Thomas Gleixner tglx@linutronix.de Link: https://lkml.kernel.org/r/20190512155518.21468-3-jolsa@kernel.org Signed-off-by: Ingo Molnar mingo@kernel.org Signed-off-by: Yunying Sun yunying.sun@intel.com Signed-off-by: Jackie Liu liuyun01@kylinos.cn Signed-off-by: Zheng Zengkai zhengzengkai@huawei.com Reviewed-by: Wei Li liwei391@huawei.com Reviewed-by: Xie XiuQi xiexiuqi@huawei.com Signed-off-by: Yang Yingliang yangyingliang@huawei.com --- include/linux/perf_event.h | 1 + kernel/events/core.c | 6 ++++++ 2 files changed, 7 insertions(+)
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index e27d517bd0fe4..5926044108cad 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -255,6 +255,7 @@ struct pmu { struct module *module; struct device *dev; const struct attribute_group **attr_groups; + const struct attribute_group **attr_update; const char *name; int type;
diff --git a/kernel/events/core.c b/kernel/events/core.c index 667e0afe7ddd1..6cd50e17269f2 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -9719,6 +9719,12 @@ static int pmu_dev_alloc(struct pmu *pmu) if (ret) goto del_dev;
+ if (pmu->attr_update) + ret = sysfs_update_groups(&pmu->dev->kobj, pmu->attr_update); + + if (ret) + goto del_dev; + out: return ret;