Message ID | 1685438374-33287-2-git-send-email-renyu.zj@linux.alibaba.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add JSON metrics for arm CMN and Yitian710 DDR | expand |
Hi Jing, kernel test robot noticed the following build warnings: [auto build test WARNING on tip/perf/core] [also build test WARNING on acme/perf/core arm-perf/for-next/perf linus/master v6.4-rc4 next-20230530] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Jing-Zhang/driver-perf-Add-identifier-sysfs-file-for-CMN/20230530-172139 base: tip/perf/core patch link: https://lore.kernel.org/r/1685438374-33287-2-git-send-email-renyu.zj%40linux.alibaba.com patch subject: [PATCH v3 1/7] driver/perf: Add identifier sysfs file for CMN config: hexagon-buildonly-randconfig-r006-20230530 (https://download.01.org/0day-ci/archive/20230531/202305311005.YR2SisSe-lkp@intel.com/config) compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1) reproduce (this is a W=1 build): mkdir -p ~/bin wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/c7483d062f1b91e98b028fa720b8a98b94ec9bc5 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Jing-Zhang/driver-perf-Add-identifier-sysfs-file-for-CMN/20230530-172139 git checkout c7483d062f1b91e98b028fa720b8a98b94ec9bc5 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang ~/bin/make.cross W=1 O=build_dir ARCH=hexagon olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang ~/bin/make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/perf/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202305311005.YR2SisSe-lkp@intel.com/ All warnings (new ones prefixed by >>): In file included from drivers/perf/arm-cmn.c:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:11: In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/hexagon/include/asm/io.h:334: include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __raw_readb(PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu' #define __le16_to_cpu(x) ((__force __u16)(__le16)(x)) ^ In file included from drivers/perf/arm-cmn.c:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:11: In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/hexagon/include/asm/io.h:334: include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu' #define __le32_to_cpu(x) ((__force __u32)(__le32)(x)) ^ In file included from drivers/perf/arm-cmn.c:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:11: In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/hexagon/include/asm/io.h:334: include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writeb(value, PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ >> drivers/perf/arm-cmn.c:2379:41: warning: unused variable 'arm_cmn600_data' [-Wunused-const-variable] static const struct arm_cmn_device_data arm_cmn600_data = { ^ >> drivers/perf/arm-cmn.c:2384:41: warning: unused variable 'arm_cmn650_data' [-Wunused-const-variable] static const struct arm_cmn_device_data arm_cmn650_data = { ^ >> drivers/perf/arm-cmn.c:2389:41: warning: unused variable 'arm_cmn700_data' [-Wunused-const-variable] static const struct arm_cmn_device_data arm_cmn700_data = { ^ >> drivers/perf/arm-cmn.c:2394:41: warning: unused variable 'arm_ci700_data' [-Wunused-const-variable] static const struct arm_cmn_device_data arm_ci700_data = { ^ 10 warnings generated. vim +/arm_cmn600_data +2379 drivers/perf/arm-cmn.c 2378 > 2379 static const struct arm_cmn_device_data arm_cmn600_data = { 2380 .model_name = "arm_cmn600", 2381 .model = CMN600 2382 }; 2383 > 2384 static const struct arm_cmn_device_data arm_cmn650_data = { 2385 .model_name = "arm_cmn650", 2386 .model = CMN650 2387 }; 2388 > 2389 static const struct arm_cmn_device_data arm_cmn700_data = { 2390 .model_name = "arm_cmn700", 2391 .model = CMN700 2392 }; 2393 > 2394 static const struct arm_cmn_device_data arm_ci700_data = { 2395 .model_name = "arm_ci700", 2396 .model = CI700 2397 }; 2398
diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c index c968986..cd6962b 100644 --- a/drivers/perf/arm-cmn.c +++ b/drivers/perf/arm-cmn.c @@ -334,6 +334,7 @@ struct arm_cmn { struct pmu pmu; struct dentry *debug; + const char *identifier; }; #define to_cmn(p) container_of(p, struct arm_cmn, pmu) @@ -347,6 +348,11 @@ struct arm_cmn_nodeid { u8 dev; }; +struct arm_cmn_device_data { + const char * model_name; + enum cmn_model model; +}; + static int arm_cmn_xyidbits(const struct arm_cmn *cmn) { return fls((cmn->mesh_x - 1) | (cmn->mesh_y - 1) | 2); @@ -1168,10 +1174,43 @@ static ssize_t arm_cmn_cpumask_show(struct device *dev, .attrs = arm_cmn_cpumask_attrs, }; +static ssize_t arm_cmn_identifier_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct arm_cmn *cmn = to_cmn(dev_get_drvdata(dev)); + + return sysfs_emit(buf, "%s\n", cmn->identifier); +} + +static umode_t arm_cmn_identifier_attr_visible(struct kobject *kobj, + struct attribute *attr, int n) +{ + struct device *dev = kobj_to_dev(kobj); + struct arm_cmn *cmn = to_cmn(dev_get_drvdata(dev)); + + if (cmn->identifier == NULL) + return 0; + return attr->mode; +} + +static struct device_attribute arm_cmn_identifier_attr = + __ATTR(identifier, 0444, arm_cmn_identifier_show, NULL); + +static struct attribute *arm_cmn_identifier_attrs[] = { + &arm_cmn_identifier_attr.attr, + NULL +}; + +static struct attribute_group arm_cmn_identifier_attr_group = { + .attrs = arm_cmn_identifier_attrs, + .is_visible = arm_cmn_identifier_attr_visible +}; + static const struct attribute_group *arm_cmn_attr_groups[] = { &arm_cmn_event_attrs_group, &arm_cmn_format_attrs_group, &arm_cmn_cpumask_attr_group, + &arm_cmn_identifier_attr_group, NULL }; @@ -2247,13 +2286,15 @@ static int arm_cmn_probe(struct platform_device *pdev) const char *name; static atomic_t id; int err, rootnode, this_id; + const struct arm_cmn_device_data * dev_data; cmn = devm_kzalloc(&pdev->dev, sizeof(*cmn), GFP_KERNEL); if (!cmn) return -ENOMEM; cmn->dev = &pdev->dev; - cmn->model = (unsigned long)device_get_match_data(cmn->dev); + dev_data = (const struct arm_cmn_device_data *)device_get_match_data(cmn->dev); + cmn->model = dev_data->model; platform_set_drvdata(pdev, cmn); if (cmn->model == CMN600 && has_acpi_companion(cmn->dev)) { @@ -2281,6 +2322,8 @@ static int arm_cmn_probe(struct platform_device *pdev) if (err) return err; + cmn->identifier = devm_kasprintf( + cmn->dev, GFP_KERNEL, "%s_%d", dev_data->model_name, cmn->rev); cmn->cpu = cpumask_local_spread(0, dev_to_node(cmn->dev)); cmn->pmu = (struct pmu) { .module = THIS_MODULE, @@ -2330,12 +2373,32 @@ static int arm_cmn_remove(struct platform_device *pdev) return 0; } +static const struct arm_cmn_device_data arm_cmn600_data = { + .model_name = "arm_cmn600", + .model = CMN600 +}; + +static const struct arm_cmn_device_data arm_cmn650_data = { + .model_name = "arm_cmn650", + .model = CMN650 +}; + +static const struct arm_cmn_device_data arm_cmn700_data = { + .model_name = "arm_cmn700", + .model = CMN700 +}; + +static const struct arm_cmn_device_data arm_ci700_data = { + .model_name = "arm_ci700", + .model = CI700 +}; + #ifdef CONFIG_OF static const struct of_device_id arm_cmn_of_match[] = { - { .compatible = "arm,cmn-600", .data = (void *)CMN600 }, - { .compatible = "arm,cmn-650", .data = (void *)CMN650 }, - { .compatible = "arm,cmn-700", .data = (void *)CMN700 }, - { .compatible = "arm,ci-700", .data = (void *)CI700 }, + { .compatible = "arm,cmn-600", .data = (void *)&arm_cmn600_data }, + { .compatible = "arm,cmn-650", .data = (void *)&arm_cmn650_data }, + { .compatible = "arm,cmn-700", .data = (void *)&arm_cmn700_data }, + { .compatible = "arm,ci-700", .data = (void *)&arm_ci700_data }, {} }; MODULE_DEVICE_TABLE(of, arm_cmn_of_match); @@ -2343,9 +2406,9 @@ static int arm_cmn_remove(struct platform_device *pdev) #ifdef CONFIG_ACPI static const struct acpi_device_id arm_cmn_acpi_match[] = { - { "ARMHC600", CMN600 }, - { "ARMHC650", CMN650 }, - { "ARMHC700", CMN700 }, + { "ARMHC600", (kernel_ulong_t)&arm_cmn600_data }, + { "ARMHC650", (kernel_ulong_t)&arm_cmn650_data }, + { "ARMHC700", (kernel_ulong_t)&arm_cmn700_data }, {} }; MODULE_DEVICE_TABLE(acpi, arm_cmn_acpi_match);
To allow userspace to identify the specific implementation of the device, add an "identifier" sysfs file. The "identifier" consists of model name and revision. One of possible identifier is "arm_cmn700_0". The perf tool can match the arm CMN metric through the identifier. Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com> --- drivers/perf/arm-cmn.c | 79 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 8 deletions(-)