2023-05-30 09:30:29

by Jing Zhang

[permalink] [raw]
Subject: [PATCH v3 1/7] driver/perf: Add identifier sysfs file for CMN

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 <[email protected]>
---
drivers/perf/arm-cmn.c | 79 +++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 71 insertions(+), 8 deletions(-)

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);
--
1.8.3.1



2023-05-31 03:14:09

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v3 1/7] driver/perf: Add identifier sysfs file for CMN

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/[email protected]/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 <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

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

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki