From 46221f584b0c26b39cc02c473449375d23f3d846 Mon Sep 17 00:00:00 2001 From: Stephane Eranian Date: Wed, 27 May 2020 15:46:58 -0700 Subject: [PATCH 2653/2944] perf/x86/rapl: Make perf_probe_msr() more robust and flexible to #33635199 commit 4c953f879460bf65ea3c119354026b126fe8ee57 upstream This patch modifies perf_probe_msr() by allowing passing of struct perf_msr array where some entries are not populated, i.e., they have either an msr address of 0 or no attribute_group pointer. This helps with certain call paths, e.g., RAPL. In case the grp is NULL, the default sysfs visibility rule applies which is to make the group visible. Without the patch, you would get a kernel crash with a NULL group. Signed-off-by: Stephane Eranian Signed-off-by: Ingo Molnar Link: https://lore.kernel.org/r/20200527224659.206129-5-eranian@google.com Signed-off-by: Artie Ding Reviewed-by: Zelin Deng Reviewed-by: Shile Zhang Reviewed-by: Baolin Wang --- arch/x86/events/probe.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/arch/x86/events/probe.c b/arch/x86/events/probe.c index c2ede2f..136a1e8 100644 --- a/arch/x86/events/probe.c +++ b/arch/x86/events/probe.c @@ -10,6 +10,11 @@ return 0; } +/* + * Accepts msr[] array with non populated entries as long as either + * msr[i].msr is 0 or msr[i].grp is NULL. Note that the default sysfs + * visibility is visible when group->is_visible callback is set. + */ unsigned long perf_msr_probe(struct perf_msr *msr, int cnt, bool zero, void *data) { @@ -24,8 +29,16 @@ if (!msr[bit].no_check) { struct attribute_group *grp = msr[bit].grp; + /* skip entry with no group */ + if (!grp) + continue; + grp->is_visible = not_visible; + /* skip unpopulated entry */ + if (!msr[bit].msr) + continue; + if (msr[bit].test && !msr[bit].test(bit, data)) continue; /* Virt sucks; you cannot tell if a R/O MSR is present :/ */ -- 1.8.3.1