All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] perf tools: Add arm64 version of get_cpuid()
@ 2019-12-13 13:54 ` John Garry
  0 siblings, 0 replies; 13+ messages in thread
From: John Garry @ 2019-12-13 13:54 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa, namhyung
  Cc: linux-kernel, will, linux-arm-kernel, linuxarm, John Garry

Add an arm64 version of get_cpuid(), which is used for various annotation
and headers - for example, I now get the CPUID in "perf report --header",
as shown in this snippet:

# hostname : ubuntu
# os release : 5.5.0-rc1-dirty
# perf version : 5.5.rc1.gbf8a13dc9851
# arch : aarch64
# nrcpus online : 96
# nrcpus avail : 96
# cpuid : 0x00000000480fd010

Since much of the code to read the MIDR is already in get_cpuid_str(),
factor out this code.

Signed-off-by: John Garry <john.garry@huawei.com>

diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
index a32e4b72a98f..d730666ab95d 100644
--- a/tools/perf/arch/arm64/util/header.c
+++ b/tools/perf/arch/arm64/util/header.c
@@ -1,8 +1,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <perf/cpumap.h>
+#include <util/cpumap.h>
 #include <internal/cpumap.h>
 #include <api/fs/fs.h>
+#include <errno.h>
 #include "debug.h"
 #include "header.h"
 
@@ -12,26 +14,21 @@
 #define MIDR_VARIANT_SHIFT      20
 #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
 
-char *get_cpuid_str(struct perf_pmu *pmu)
+static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
 {
-	char *buf = NULL;
-	char path[PATH_MAX];
 	const char *sysfs = sysfs__mountpoint();
-	int cpu;
 	u64 midr = 0;
-	struct perf_cpu_map *cpus;
-	FILE *file;
+	int cpu;
 
-	if (!sysfs || !pmu || !pmu->cpus)
-		return NULL;
+	if (!sysfs || sz < MIDR_SIZE)
+		return EINVAL;
 
-	buf = malloc(MIDR_SIZE);
-	if (!buf)
-		return NULL;
+	cpus = perf_cpu_map__get(cpus);
 
-	/* read midr from list of cpus mapped to this pmu */
-	cpus = perf_cpu_map__get(pmu->cpus);
 	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
+		char path[PATH_MAX];
+		FILE *file;
+
 		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
 				sysfs, cpus->map[cpu]);
 
@@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
 		break;
 	}
 
-	if (!midr) {
+	perf_cpu_map__put(cpus);
+
+	if (!midr)
+		return EINVAL;
+
+	return 0;
+}
+
+int get_cpuid(char *buf, size_t sz)
+{
+	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
+	int ret;
+
+	if (!cpus)
+		return EINVAL;
+
+	ret = _get_cpuid(buf, sz, cpus);
+
+	perf_cpu_map__put(cpus);
+
+	return ret;
+}
+
+char *get_cpuid_str(struct perf_pmu *pmu)
+{
+	char *buf = NULL;
+	int res;
+
+	if (!pmu || !pmu->cpus)
+		return NULL;
+
+	buf = malloc(MIDR_SIZE);
+	if (!buf)
+		return NULL;
+
+	/* read midr from list of cpus mapped to this pmu */
+	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
+	if (res) {
 		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
 		free(buf);
 		buf = NULL;
 	}
 
-	perf_cpu_map__put(cpus);
 	return buf;
 }
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH] perf tools: Add arm64 version of get_cpuid()
@ 2019-12-13 13:54 ` John Garry
  0 siblings, 0 replies; 13+ messages in thread
From: John Garry @ 2019-12-13 13:54 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa, namhyung
  Cc: John Garry, will, linux-kernel, linux-arm-kernel, linuxarm

Add an arm64 version of get_cpuid(), which is used for various annotation
and headers - for example, I now get the CPUID in "perf report --header",
as shown in this snippet:

# hostname : ubuntu
# os release : 5.5.0-rc1-dirty
# perf version : 5.5.rc1.gbf8a13dc9851
# arch : aarch64
# nrcpus online : 96
# nrcpus avail : 96
# cpuid : 0x00000000480fd010

Since much of the code to read the MIDR is already in get_cpuid_str(),
factor out this code.

Signed-off-by: John Garry <john.garry@huawei.com>

diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
index a32e4b72a98f..d730666ab95d 100644
--- a/tools/perf/arch/arm64/util/header.c
+++ b/tools/perf/arch/arm64/util/header.c
@@ -1,8 +1,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <perf/cpumap.h>
+#include <util/cpumap.h>
 #include <internal/cpumap.h>
 #include <api/fs/fs.h>
+#include <errno.h>
 #include "debug.h"
 #include "header.h"
 
@@ -12,26 +14,21 @@
 #define MIDR_VARIANT_SHIFT      20
 #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
 
-char *get_cpuid_str(struct perf_pmu *pmu)
+static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
 {
-	char *buf = NULL;
-	char path[PATH_MAX];
 	const char *sysfs = sysfs__mountpoint();
-	int cpu;
 	u64 midr = 0;
-	struct perf_cpu_map *cpus;
-	FILE *file;
+	int cpu;
 
-	if (!sysfs || !pmu || !pmu->cpus)
-		return NULL;
+	if (!sysfs || sz < MIDR_SIZE)
+		return EINVAL;
 
-	buf = malloc(MIDR_SIZE);
-	if (!buf)
-		return NULL;
+	cpus = perf_cpu_map__get(cpus);
 
-	/* read midr from list of cpus mapped to this pmu */
-	cpus = perf_cpu_map__get(pmu->cpus);
 	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
+		char path[PATH_MAX];
+		FILE *file;
+
 		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
 				sysfs, cpus->map[cpu]);
 
@@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
 		break;
 	}
 
-	if (!midr) {
+	perf_cpu_map__put(cpus);
+
+	if (!midr)
+		return EINVAL;
+
+	return 0;
+}
+
+int get_cpuid(char *buf, size_t sz)
+{
+	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
+	int ret;
+
+	if (!cpus)
+		return EINVAL;
+
+	ret = _get_cpuid(buf, sz, cpus);
+
+	perf_cpu_map__put(cpus);
+
+	return ret;
+}
+
+char *get_cpuid_str(struct perf_pmu *pmu)
+{
+	char *buf = NULL;
+	int res;
+
+	if (!pmu || !pmu->cpus)
+		return NULL;
+
+	buf = malloc(MIDR_SIZE);
+	if (!buf)
+		return NULL;
+
+	/* read midr from list of cpus mapped to this pmu */
+	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
+	if (res) {
 		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
 		free(buf);
 		buf = NULL;
 	}
 
-	perf_cpu_map__put(cpus);
 	return buf;
 }
-- 
2.17.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH] perf tools: Add arm64 version of get_cpuid()
  2019-12-13 13:54 ` John Garry
@ 2020-01-07  9:13   ` John Garry
  -1 siblings, 0 replies; 13+ messages in thread
From: John Garry @ 2020-01-07  9:13 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa, namhyung
  Cc: linux-kernel, will, linux-arm-kernel, linuxarm

On 13/12/2019 13:54, John Garry wrote:

Hi Arnaldo,

Do we need some reviews on this? Or was it missed/still catching up?

Cheers,
John

> Add an arm64 version of get_cpuid(), which is used for various annotation
> and headers - for example, I now get the CPUID in "perf report --header",
> as shown in this snippet:
> 
> # hostname : ubuntu
> # os release : 5.5.0-rc1-dirty
> # perf version : 5.5.rc1.gbf8a13dc9851
> # arch : aarch64
> # nrcpus online : 96
> # nrcpus avail : 96
> # cpuid : 0x00000000480fd010
> 
> Since much of the code to read the MIDR is already in get_cpuid_str(),
> factor out this code.
> 
> Signed-off-by: John Garry <john.garry@huawei.com>
> 
> diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
> index a32e4b72a98f..d730666ab95d 100644
> --- a/tools/perf/arch/arm64/util/header.c
> +++ b/tools/perf/arch/arm64/util/header.c
> @@ -1,8 +1,10 @@
>   #include <stdio.h>
>   #include <stdlib.h>
>   #include <perf/cpumap.h>
> +#include <util/cpumap.h>
>   #include <internal/cpumap.h>
>   #include <api/fs/fs.h>
> +#include <errno.h>
>   #include "debug.h"
>   #include "header.h"
>   
> @@ -12,26 +14,21 @@
>   #define MIDR_VARIANT_SHIFT      20
>   #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
>   
> -char *get_cpuid_str(struct perf_pmu *pmu)
> +static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
>   {
> -	char *buf = NULL;
> -	char path[PATH_MAX];
>   	const char *sysfs = sysfs__mountpoint();
> -	int cpu;
>   	u64 midr = 0;
> -	struct perf_cpu_map *cpus;
> -	FILE *file;
> +	int cpu;
>   
> -	if (!sysfs || !pmu || !pmu->cpus)
> -		return NULL;
> +	if (!sysfs || sz < MIDR_SIZE)
> +		return EINVAL;
>   
> -	buf = malloc(MIDR_SIZE);
> -	if (!buf)
> -		return NULL;
> +	cpus = perf_cpu_map__get(cpus);
>   
> -	/* read midr from list of cpus mapped to this pmu */
> -	cpus = perf_cpu_map__get(pmu->cpus);
>   	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
> +		char path[PATH_MAX];
> +		FILE *file;
> +
>   		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
>   				sysfs, cpus->map[cpu]);
>   
> @@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
>   		break;
>   	}
>   
> -	if (!midr) {
> +	perf_cpu_map__put(cpus);
> +
> +	if (!midr)
> +		return EINVAL;
> +
> +	return 0;
> +}
> +
> +int get_cpuid(char *buf, size_t sz)
> +{
> +	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
> +	int ret;
> +
> +	if (!cpus)
> +		return EINVAL;
> +
> +	ret = _get_cpuid(buf, sz, cpus);
> +
> +	perf_cpu_map__put(cpus);
> +
> +	return ret;
> +}
> +
> +char *get_cpuid_str(struct perf_pmu *pmu)
> +{
> +	char *buf = NULL;
> +	int res;
> +
> +	if (!pmu || !pmu->cpus)
> +		return NULL;
> +
> +	buf = malloc(MIDR_SIZE);
> +	if (!buf)
> +		return NULL;
> +
> +	/* read midr from list of cpus mapped to this pmu */
> +	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
> +	if (res) {
>   		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
>   		free(buf);
>   		buf = NULL;
>   	}
>   
> -	perf_cpu_map__put(cpus);
>   	return buf;
>   }
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] perf tools: Add arm64 version of get_cpuid()
@ 2020-01-07  9:13   ` John Garry
  0 siblings, 0 replies; 13+ messages in thread
From: John Garry @ 2020-01-07  9:13 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa, namhyung
  Cc: will, linux-kernel, linux-arm-kernel, linuxarm

On 13/12/2019 13:54, John Garry wrote:

Hi Arnaldo,

Do we need some reviews on this? Or was it missed/still catching up?

Cheers,
John

> Add an arm64 version of get_cpuid(), which is used for various annotation
> and headers - for example, I now get the CPUID in "perf report --header",
> as shown in this snippet:
> 
> # hostname : ubuntu
> # os release : 5.5.0-rc1-dirty
> # perf version : 5.5.rc1.gbf8a13dc9851
> # arch : aarch64
> # nrcpus online : 96
> # nrcpus avail : 96
> # cpuid : 0x00000000480fd010
> 
> Since much of the code to read the MIDR is already in get_cpuid_str(),
> factor out this code.
> 
> Signed-off-by: John Garry <john.garry@huawei.com>
> 
> diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
> index a32e4b72a98f..d730666ab95d 100644
> --- a/tools/perf/arch/arm64/util/header.c
> +++ b/tools/perf/arch/arm64/util/header.c
> @@ -1,8 +1,10 @@
>   #include <stdio.h>
>   #include <stdlib.h>
>   #include <perf/cpumap.h>
> +#include <util/cpumap.h>
>   #include <internal/cpumap.h>
>   #include <api/fs/fs.h>
> +#include <errno.h>
>   #include "debug.h"
>   #include "header.h"
>   
> @@ -12,26 +14,21 @@
>   #define MIDR_VARIANT_SHIFT      20
>   #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
>   
> -char *get_cpuid_str(struct perf_pmu *pmu)
> +static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
>   {
> -	char *buf = NULL;
> -	char path[PATH_MAX];
>   	const char *sysfs = sysfs__mountpoint();
> -	int cpu;
>   	u64 midr = 0;
> -	struct perf_cpu_map *cpus;
> -	FILE *file;
> +	int cpu;
>   
> -	if (!sysfs || !pmu || !pmu->cpus)
> -		return NULL;
> +	if (!sysfs || sz < MIDR_SIZE)
> +		return EINVAL;
>   
> -	buf = malloc(MIDR_SIZE);
> -	if (!buf)
> -		return NULL;
> +	cpus = perf_cpu_map__get(cpus);
>   
> -	/* read midr from list of cpus mapped to this pmu */
> -	cpus = perf_cpu_map__get(pmu->cpus);
>   	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
> +		char path[PATH_MAX];
> +		FILE *file;
> +
>   		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
>   				sysfs, cpus->map[cpu]);
>   
> @@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
>   		break;
>   	}
>   
> -	if (!midr) {
> +	perf_cpu_map__put(cpus);
> +
> +	if (!midr)
> +		return EINVAL;
> +
> +	return 0;
> +}
> +
> +int get_cpuid(char *buf, size_t sz)
> +{
> +	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
> +	int ret;
> +
> +	if (!cpus)
> +		return EINVAL;
> +
> +	ret = _get_cpuid(buf, sz, cpus);
> +
> +	perf_cpu_map__put(cpus);
> +
> +	return ret;
> +}
> +
> +char *get_cpuid_str(struct perf_pmu *pmu)
> +{
> +	char *buf = NULL;
> +	int res;
> +
> +	if (!pmu || !pmu->cpus)
> +		return NULL;
> +
> +	buf = malloc(MIDR_SIZE);
> +	if (!buf)
> +		return NULL;
> +
> +	/* read midr from list of cpus mapped to this pmu */
> +	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
> +	if (res) {
>   		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
>   		free(buf);
>   		buf = NULL;
>   	}
>   
> -	perf_cpu_map__put(cpus);
>   	return buf;
>   }
> 


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] perf tools: Add arm64 version of get_cpuid()
  2019-12-13 13:54 ` John Garry
@ 2020-02-12  9:30   ` Shaokun Zhang
  -1 siblings, 0 replies; 13+ messages in thread
From: Shaokun Zhang @ 2020-02-12  9:30 UTC (permalink / raw)
  To: John Garry, peterz, mingo, acme, mark.rutland,
	alexander.shishkin, jolsa, namhyung
  Cc: linux-kernel, will, linux-arm-kernel, linuxarm

Hi John,

I tested this patch on my new ARM64 Kunpeng 920 server.
[root@node1 zsk]# ./perf --version
perf version 5.6.rc1.g2cdb955b7252

Both perf list and perf stat can work.

Tested-by: Shaokun Zhang <zhangshaokun@hisilicon.com>

Thanks,
Shaokun

On 2019/12/13 21:54, John Garry wrote:
> Add an arm64 version of get_cpuid(), which is used for various annotation
> and headers - for example, I now get the CPUID in "perf report --header",
> as shown in this snippet:
> 
> # hostname : ubuntu
> # os release : 5.5.0-rc1-dirty
> # perf version : 5.5.rc1.gbf8a13dc9851
> # arch : aarch64
> # nrcpus online : 96
> # nrcpus avail : 96
> # cpuid : 0x00000000480fd010
> 
> Since much of the code to read the MIDR is already in get_cpuid_str(),
> factor out this code.
> 
> Signed-off-by: John Garry <john.garry@huawei.com>
> 
> diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
> index a32e4b72a98f..d730666ab95d 100644
> --- a/tools/perf/arch/arm64/util/header.c
> +++ b/tools/perf/arch/arm64/util/header.c
> @@ -1,8 +1,10 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <perf/cpumap.h>
> +#include <util/cpumap.h>
>  #include <internal/cpumap.h>
>  #include <api/fs/fs.h>
> +#include <errno.h>
>  #include "debug.h"
>  #include "header.h"
>  
> @@ -12,26 +14,21 @@
>  #define MIDR_VARIANT_SHIFT      20
>  #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
>  
> -char *get_cpuid_str(struct perf_pmu *pmu)
> +static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
>  {
> -	char *buf = NULL;
> -	char path[PATH_MAX];
>  	const char *sysfs = sysfs__mountpoint();
> -	int cpu;
>  	u64 midr = 0;
> -	struct perf_cpu_map *cpus;
> -	FILE *file;
> +	int cpu;
>  
> -	if (!sysfs || !pmu || !pmu->cpus)
> -		return NULL;
> +	if (!sysfs || sz < MIDR_SIZE)
> +		return EINVAL;
>  
> -	buf = malloc(MIDR_SIZE);
> -	if (!buf)
> -		return NULL;
> +	cpus = perf_cpu_map__get(cpus);
>  
> -	/* read midr from list of cpus mapped to this pmu */
> -	cpus = perf_cpu_map__get(pmu->cpus);
>  	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
> +		char path[PATH_MAX];
> +		FILE *file;
> +
>  		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
>  				sysfs, cpus->map[cpu]);
>  
> @@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
>  		break;
>  	}
>  
> -	if (!midr) {
> +	perf_cpu_map__put(cpus);
> +
> +	if (!midr)
> +		return EINVAL;
> +
> +	return 0;
> +}
> +
> +int get_cpuid(char *buf, size_t sz)
> +{
> +	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
> +	int ret;
> +
> +	if (!cpus)
> +		return EINVAL;
> +
> +	ret = _get_cpuid(buf, sz, cpus);
> +
> +	perf_cpu_map__put(cpus);
> +
> +	return ret;
> +}
> +
> +char *get_cpuid_str(struct perf_pmu *pmu)
> +{
> +	char *buf = NULL;
> +	int res;
> +
> +	if (!pmu || !pmu->cpus)
> +		return NULL;
> +
> +	buf = malloc(MIDR_SIZE);
> +	if (!buf)
> +		return NULL;
> +
> +	/* read midr from list of cpus mapped to this pmu */
> +	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
> +	if (res) {
>  		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
>  		free(buf);
>  		buf = NULL;
>  	}
>  
> -	perf_cpu_map__put(cpus);
>  	return buf;
>  }
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] perf tools: Add arm64 version of get_cpuid()
@ 2020-02-12  9:30   ` Shaokun Zhang
  0 siblings, 0 replies; 13+ messages in thread
From: Shaokun Zhang @ 2020-02-12  9:30 UTC (permalink / raw)
  To: John Garry, peterz, mingo, acme, mark.rutland,
	alexander.shishkin, jolsa, namhyung
  Cc: will, linux-kernel, linux-arm-kernel, linuxarm

Hi John,

I tested this patch on my new ARM64 Kunpeng 920 server.
[root@node1 zsk]# ./perf --version
perf version 5.6.rc1.g2cdb955b7252

Both perf list and perf stat can work.

Tested-by: Shaokun Zhang <zhangshaokun@hisilicon.com>

Thanks,
Shaokun

On 2019/12/13 21:54, John Garry wrote:
> Add an arm64 version of get_cpuid(), which is used for various annotation
> and headers - for example, I now get the CPUID in "perf report --header",
> as shown in this snippet:
> 
> # hostname : ubuntu
> # os release : 5.5.0-rc1-dirty
> # perf version : 5.5.rc1.gbf8a13dc9851
> # arch : aarch64
> # nrcpus online : 96
> # nrcpus avail : 96
> # cpuid : 0x00000000480fd010
> 
> Since much of the code to read the MIDR is already in get_cpuid_str(),
> factor out this code.
> 
> Signed-off-by: John Garry <john.garry@huawei.com>
> 
> diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
> index a32e4b72a98f..d730666ab95d 100644
> --- a/tools/perf/arch/arm64/util/header.c
> +++ b/tools/perf/arch/arm64/util/header.c
> @@ -1,8 +1,10 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <perf/cpumap.h>
> +#include <util/cpumap.h>
>  #include <internal/cpumap.h>
>  #include <api/fs/fs.h>
> +#include <errno.h>
>  #include "debug.h"
>  #include "header.h"
>  
> @@ -12,26 +14,21 @@
>  #define MIDR_VARIANT_SHIFT      20
>  #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
>  
> -char *get_cpuid_str(struct perf_pmu *pmu)
> +static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
>  {
> -	char *buf = NULL;
> -	char path[PATH_MAX];
>  	const char *sysfs = sysfs__mountpoint();
> -	int cpu;
>  	u64 midr = 0;
> -	struct perf_cpu_map *cpus;
> -	FILE *file;
> +	int cpu;
>  
> -	if (!sysfs || !pmu || !pmu->cpus)
> -		return NULL;
> +	if (!sysfs || sz < MIDR_SIZE)
> +		return EINVAL;
>  
> -	buf = malloc(MIDR_SIZE);
> -	if (!buf)
> -		return NULL;
> +	cpus = perf_cpu_map__get(cpus);
>  
> -	/* read midr from list of cpus mapped to this pmu */
> -	cpus = perf_cpu_map__get(pmu->cpus);
>  	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
> +		char path[PATH_MAX];
> +		FILE *file;
> +
>  		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
>  				sysfs, cpus->map[cpu]);
>  
> @@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
>  		break;
>  	}
>  
> -	if (!midr) {
> +	perf_cpu_map__put(cpus);
> +
> +	if (!midr)
> +		return EINVAL;
> +
> +	return 0;
> +}
> +
> +int get_cpuid(char *buf, size_t sz)
> +{
> +	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
> +	int ret;
> +
> +	if (!cpus)
> +		return EINVAL;
> +
> +	ret = _get_cpuid(buf, sz, cpus);
> +
> +	perf_cpu_map__put(cpus);
> +
> +	return ret;
> +}
> +
> +char *get_cpuid_str(struct perf_pmu *pmu)
> +{
> +	char *buf = NULL;
> +	int res;
> +
> +	if (!pmu || !pmu->cpus)
> +		return NULL;
> +
> +	buf = malloc(MIDR_SIZE);
> +	if (!buf)
> +		return NULL;
> +
> +	/* read midr from list of cpus mapped to this pmu */
> +	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
> +	if (res) {
>  		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
>  		free(buf);
>  		buf = NULL;
>  	}
>  
> -	perf_cpu_map__put(cpus);
>  	return buf;
>  }
> 


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] perf tools: Add arm64 version of get_cpuid()
  2020-02-12  9:30   ` Shaokun Zhang
@ 2020-02-12 13:35     ` Arnaldo Carvalho de Melo
  -1 siblings, 0 replies; 13+ messages in thread
From: Arnaldo Carvalho de Melo @ 2020-02-12 13:35 UTC (permalink / raw)
  To: Shaokun Zhang
  Cc: John Garry, peterz, mingo, mark.rutland, alexander.shishkin,
	jolsa, namhyung, linux-kernel, will, linux-arm-kernel, linuxarm

Em Wed, Feb 12, 2020 at 05:30:56PM +0800, Shaokun Zhang escreveu:
> Hi John,
> 
> I tested this patch on my new ARM64 Kunpeng 920 server.
> [root@node1 zsk]# ./perf --version
> perf version 5.6.rc1.g2cdb955b7252
> 
> Both perf list and perf stat can work.
> 
> Tested-by: Shaokun Zhang <zhangshaokun@hisilicon.com>

Thanks for the test and for (re)bringing this patch to my attention, I'll
process it now.

Thanks!

- Arnaldo
 
> Thanks,
> Shaokun
> 
> On 2019/12/13 21:54, John Garry wrote:
> > Add an arm64 version of get_cpuid(), which is used for various annotation
> > and headers - for example, I now get the CPUID in "perf report --header",
> > as shown in this snippet:
> > 
> > # hostname : ubuntu
> > # os release : 5.5.0-rc1-dirty
> > # perf version : 5.5.rc1.gbf8a13dc9851
> > # arch : aarch64
> > # nrcpus online : 96
> > # nrcpus avail : 96
> > # cpuid : 0x00000000480fd010
> > 
> > Since much of the code to read the MIDR is already in get_cpuid_str(),
> > factor out this code.
> > 
> > Signed-off-by: John Garry <john.garry@huawei.com>
> > 
> > diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
> > index a32e4b72a98f..d730666ab95d 100644
> > --- a/tools/perf/arch/arm64/util/header.c
> > +++ b/tools/perf/arch/arm64/util/header.c
> > @@ -1,8 +1,10 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >  #include <perf/cpumap.h>
> > +#include <util/cpumap.h>
> >  #include <internal/cpumap.h>
> >  #include <api/fs/fs.h>
> > +#include <errno.h>
> >  #include "debug.h"
> >  #include "header.h"
> >  
> > @@ -12,26 +14,21 @@
> >  #define MIDR_VARIANT_SHIFT      20
> >  #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
> >  
> > -char *get_cpuid_str(struct perf_pmu *pmu)
> > +static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
> >  {
> > -	char *buf = NULL;
> > -	char path[PATH_MAX];
> >  	const char *sysfs = sysfs__mountpoint();
> > -	int cpu;
> >  	u64 midr = 0;
> > -	struct perf_cpu_map *cpus;
> > -	FILE *file;
> > +	int cpu;
> >  
> > -	if (!sysfs || !pmu || !pmu->cpus)
> > -		return NULL;
> > +	if (!sysfs || sz < MIDR_SIZE)
> > +		return EINVAL;
> >  
> > -	buf = malloc(MIDR_SIZE);
> > -	if (!buf)
> > -		return NULL;
> > +	cpus = perf_cpu_map__get(cpus);
> >  
> > -	/* read midr from list of cpus mapped to this pmu */
> > -	cpus = perf_cpu_map__get(pmu->cpus);
> >  	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
> > +		char path[PATH_MAX];
> > +		FILE *file;
> > +
> >  		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
> >  				sysfs, cpus->map[cpu]);
> >  
> > @@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
> >  		break;
> >  	}
> >  
> > -	if (!midr) {
> > +	perf_cpu_map__put(cpus);
> > +
> > +	if (!midr)
> > +		return EINVAL;
> > +
> > +	return 0;
> > +}
> > +
> > +int get_cpuid(char *buf, size_t sz)
> > +{
> > +	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
> > +	int ret;
> > +
> > +	if (!cpus)
> > +		return EINVAL;
> > +
> > +	ret = _get_cpuid(buf, sz, cpus);
> > +
> > +	perf_cpu_map__put(cpus);
> > +
> > +	return ret;
> > +}
> > +
> > +char *get_cpuid_str(struct perf_pmu *pmu)
> > +{
> > +	char *buf = NULL;
> > +	int res;
> > +
> > +	if (!pmu || !pmu->cpus)
> > +		return NULL;
> > +
> > +	buf = malloc(MIDR_SIZE);
> > +	if (!buf)
> > +		return NULL;
> > +
> > +	/* read midr from list of cpus mapped to this pmu */
> > +	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
> > +	if (res) {
> >  		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
> >  		free(buf);
> >  		buf = NULL;
> >  	}
> >  
> > -	perf_cpu_map__put(cpus);
> >  	return buf;
> >  }
> > 
> 

-- 

- Arnaldo

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] perf tools: Add arm64 version of get_cpuid()
@ 2020-02-12 13:35     ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 13+ messages in thread
From: Arnaldo Carvalho de Melo @ 2020-02-12 13:35 UTC (permalink / raw)
  To: Shaokun Zhang
  Cc: mark.rutland, peterz, will, John Garry, linux-kernel, linuxarm,
	alexander.shishkin, mingo, namhyung, jolsa, linux-arm-kernel

Em Wed, Feb 12, 2020 at 05:30:56PM +0800, Shaokun Zhang escreveu:
> Hi John,
> 
> I tested this patch on my new ARM64 Kunpeng 920 server.
> [root@node1 zsk]# ./perf --version
> perf version 5.6.rc1.g2cdb955b7252
> 
> Both perf list and perf stat can work.
> 
> Tested-by: Shaokun Zhang <zhangshaokun@hisilicon.com>

Thanks for the test and for (re)bringing this patch to my attention, I'll
process it now.

Thanks!

- Arnaldo
 
> Thanks,
> Shaokun
> 
> On 2019/12/13 21:54, John Garry wrote:
> > Add an arm64 version of get_cpuid(), which is used for various annotation
> > and headers - for example, I now get the CPUID in "perf report --header",
> > as shown in this snippet:
> > 
> > # hostname : ubuntu
> > # os release : 5.5.0-rc1-dirty
> > # perf version : 5.5.rc1.gbf8a13dc9851
> > # arch : aarch64
> > # nrcpus online : 96
> > # nrcpus avail : 96
> > # cpuid : 0x00000000480fd010
> > 
> > Since much of the code to read the MIDR is already in get_cpuid_str(),
> > factor out this code.
> > 
> > Signed-off-by: John Garry <john.garry@huawei.com>
> > 
> > diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
> > index a32e4b72a98f..d730666ab95d 100644
> > --- a/tools/perf/arch/arm64/util/header.c
> > +++ b/tools/perf/arch/arm64/util/header.c
> > @@ -1,8 +1,10 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >  #include <perf/cpumap.h>
> > +#include <util/cpumap.h>
> >  #include <internal/cpumap.h>
> >  #include <api/fs/fs.h>
> > +#include <errno.h>
> >  #include "debug.h"
> >  #include "header.h"
> >  
> > @@ -12,26 +14,21 @@
> >  #define MIDR_VARIANT_SHIFT      20
> >  #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
> >  
> > -char *get_cpuid_str(struct perf_pmu *pmu)
> > +static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
> >  {
> > -	char *buf = NULL;
> > -	char path[PATH_MAX];
> >  	const char *sysfs = sysfs__mountpoint();
> > -	int cpu;
> >  	u64 midr = 0;
> > -	struct perf_cpu_map *cpus;
> > -	FILE *file;
> > +	int cpu;
> >  
> > -	if (!sysfs || !pmu || !pmu->cpus)
> > -		return NULL;
> > +	if (!sysfs || sz < MIDR_SIZE)
> > +		return EINVAL;
> >  
> > -	buf = malloc(MIDR_SIZE);
> > -	if (!buf)
> > -		return NULL;
> > +	cpus = perf_cpu_map__get(cpus);
> >  
> > -	/* read midr from list of cpus mapped to this pmu */
> > -	cpus = perf_cpu_map__get(pmu->cpus);
> >  	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
> > +		char path[PATH_MAX];
> > +		FILE *file;
> > +
> >  		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
> >  				sysfs, cpus->map[cpu]);
> >  
> > @@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
> >  		break;
> >  	}
> >  
> > -	if (!midr) {
> > +	perf_cpu_map__put(cpus);
> > +
> > +	if (!midr)
> > +		return EINVAL;
> > +
> > +	return 0;
> > +}
> > +
> > +int get_cpuid(char *buf, size_t sz)
> > +{
> > +	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
> > +	int ret;
> > +
> > +	if (!cpus)
> > +		return EINVAL;
> > +
> > +	ret = _get_cpuid(buf, sz, cpus);
> > +
> > +	perf_cpu_map__put(cpus);
> > +
> > +	return ret;
> > +}
> > +
> > +char *get_cpuid_str(struct perf_pmu *pmu)
> > +{
> > +	char *buf = NULL;
> > +	int res;
> > +
> > +	if (!pmu || !pmu->cpus)
> > +		return NULL;
> > +
> > +	buf = malloc(MIDR_SIZE);
> > +	if (!buf)
> > +		return NULL;
> > +
> > +	/* read midr from list of cpus mapped to this pmu */
> > +	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
> > +	if (res) {
> >  		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
> >  		free(buf);
> >  		buf = NULL;
> >  	}
> >  
> > -	perf_cpu_map__put(cpus);
> >  	return buf;
> >  }
> > 
> 

-- 

- Arnaldo

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] perf tools: Add arm64 version of get_cpuid()
  2020-01-07  9:13   ` John Garry
@ 2020-02-12 13:40     ` Arnaldo Carvalho de Melo
  -1 siblings, 0 replies; 13+ messages in thread
From: Arnaldo Carvalho de Melo @ 2020-02-12 13:40 UTC (permalink / raw)
  To: John Garry
  Cc: peterz, mingo, mark.rutland, alexander.shishkin, jolsa, namhyung,
	linux-kernel, will, linux-arm-kernel, linuxarm

Em Tue, Jan 07, 2020 at 09:13:43AM +0000, John Garry escreveu:
> On 13/12/2019 13:54, John Garry wrote:
> 
> Hi Arnaldo,
> 
> Do we need some reviews on this? Or was it missed/still catching up?

Got lost in the holidays, devconf.cz, vacations, sorry, picking it up
now, together with a Tested-by by Shaokun Zhang, some issues with the
formatting of the patch:

- Avoid starting lines with '#' as those will vanish when I use 'git am'

- Separate the commit log message from the diff using a '---' at the
  begining of the line, otherwise 'git am' fails

I fixed those up now, will test with my build containers, thanks.

- Arnaldo
 
> Cheers,
> John
> 
> > Add an arm64 version of get_cpuid(), which is used for various annotation
> > and headers - for example, I now get the CPUID in "perf report --header",
> > as shown in this snippet:
> > 
> > # hostname : ubuntu
> > # os release : 5.5.0-rc1-dirty
> > # perf version : 5.5.rc1.gbf8a13dc9851
> > # arch : aarch64
> > # nrcpus online : 96
> > # nrcpus avail : 96
> > # cpuid : 0x00000000480fd010
> > 
> > Since much of the code to read the MIDR is already in get_cpuid_str(),
> > factor out this code.
> > 
> > Signed-off-by: John Garry <john.garry@huawei.com>
> > 
> > diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
> > index a32e4b72a98f..d730666ab95d 100644
> > --- a/tools/perf/arch/arm64/util/header.c
> > +++ b/tools/perf/arch/arm64/util/header.c
> > @@ -1,8 +1,10 @@
> >   #include <stdio.h>
> >   #include <stdlib.h>
> >   #include <perf/cpumap.h>
> > +#include <util/cpumap.h>
> >   #include <internal/cpumap.h>
> >   #include <api/fs/fs.h>
> > +#include <errno.h>
> >   #include "debug.h"
> >   #include "header.h"
> > @@ -12,26 +14,21 @@
> >   #define MIDR_VARIANT_SHIFT      20
> >   #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
> > -char *get_cpuid_str(struct perf_pmu *pmu)
> > +static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
> >   {
> > -	char *buf = NULL;
> > -	char path[PATH_MAX];
> >   	const char *sysfs = sysfs__mountpoint();
> > -	int cpu;
> >   	u64 midr = 0;
> > -	struct perf_cpu_map *cpus;
> > -	FILE *file;
> > +	int cpu;
> > -	if (!sysfs || !pmu || !pmu->cpus)
> > -		return NULL;
> > +	if (!sysfs || sz < MIDR_SIZE)
> > +		return EINVAL;
> > -	buf = malloc(MIDR_SIZE);
> > -	if (!buf)
> > -		return NULL;
> > +	cpus = perf_cpu_map__get(cpus);
> > -	/* read midr from list of cpus mapped to this pmu */
> > -	cpus = perf_cpu_map__get(pmu->cpus);
> >   	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
> > +		char path[PATH_MAX];
> > +		FILE *file;
> > +
> >   		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
> >   				sysfs, cpus->map[cpu]);
> > @@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
> >   		break;
> >   	}
> > -	if (!midr) {
> > +	perf_cpu_map__put(cpus);
> > +
> > +	if (!midr)
> > +		return EINVAL;
> > +
> > +	return 0;
> > +}
> > +
> > +int get_cpuid(char *buf, size_t sz)
> > +{
> > +	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
> > +	int ret;
> > +
> > +	if (!cpus)
> > +		return EINVAL;
> > +
> > +	ret = _get_cpuid(buf, sz, cpus);
> > +
> > +	perf_cpu_map__put(cpus);
> > +
> > +	return ret;
> > +}
> > +
> > +char *get_cpuid_str(struct perf_pmu *pmu)
> > +{
> > +	char *buf = NULL;
> > +	int res;
> > +
> > +	if (!pmu || !pmu->cpus)
> > +		return NULL;
> > +
> > +	buf = malloc(MIDR_SIZE);
> > +	if (!buf)
> > +		return NULL;
> > +
> > +	/* read midr from list of cpus mapped to this pmu */
> > +	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
> > +	if (res) {
> >   		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
> >   		free(buf);
> >   		buf = NULL;
> >   	}
> > -	perf_cpu_map__put(cpus);
> >   	return buf;
> >   }
> > 
> 

-- 

- Arnaldo

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] perf tools: Add arm64 version of get_cpuid()
@ 2020-02-12 13:40     ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 13+ messages in thread
From: Arnaldo Carvalho de Melo @ 2020-02-12 13:40 UTC (permalink / raw)
  To: John Garry
  Cc: mark.rutland, peterz, will, linux-kernel, linuxarm,
	alexander.shishkin, mingo, namhyung, jolsa, linux-arm-kernel

Em Tue, Jan 07, 2020 at 09:13:43AM +0000, John Garry escreveu:
> On 13/12/2019 13:54, John Garry wrote:
> 
> Hi Arnaldo,
> 
> Do we need some reviews on this? Or was it missed/still catching up?

Got lost in the holidays, devconf.cz, vacations, sorry, picking it up
now, together with a Tested-by by Shaokun Zhang, some issues with the
formatting of the patch:

- Avoid starting lines with '#' as those will vanish when I use 'git am'

- Separate the commit log message from the diff using a '---' at the
  begining of the line, otherwise 'git am' fails

I fixed those up now, will test with my build containers, thanks.

- Arnaldo
 
> Cheers,
> John
> 
> > Add an arm64 version of get_cpuid(), which is used for various annotation
> > and headers - for example, I now get the CPUID in "perf report --header",
> > as shown in this snippet:
> > 
> > # hostname : ubuntu
> > # os release : 5.5.0-rc1-dirty
> > # perf version : 5.5.rc1.gbf8a13dc9851
> > # arch : aarch64
> > # nrcpus online : 96
> > # nrcpus avail : 96
> > # cpuid : 0x00000000480fd010
> > 
> > Since much of the code to read the MIDR is already in get_cpuid_str(),
> > factor out this code.
> > 
> > Signed-off-by: John Garry <john.garry@huawei.com>
> > 
> > diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
> > index a32e4b72a98f..d730666ab95d 100644
> > --- a/tools/perf/arch/arm64/util/header.c
> > +++ b/tools/perf/arch/arm64/util/header.c
> > @@ -1,8 +1,10 @@
> >   #include <stdio.h>
> >   #include <stdlib.h>
> >   #include <perf/cpumap.h>
> > +#include <util/cpumap.h>
> >   #include <internal/cpumap.h>
> >   #include <api/fs/fs.h>
> > +#include <errno.h>
> >   #include "debug.h"
> >   #include "header.h"
> > @@ -12,26 +14,21 @@
> >   #define MIDR_VARIANT_SHIFT      20
> >   #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
> > -char *get_cpuid_str(struct perf_pmu *pmu)
> > +static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
> >   {
> > -	char *buf = NULL;
> > -	char path[PATH_MAX];
> >   	const char *sysfs = sysfs__mountpoint();
> > -	int cpu;
> >   	u64 midr = 0;
> > -	struct perf_cpu_map *cpus;
> > -	FILE *file;
> > +	int cpu;
> > -	if (!sysfs || !pmu || !pmu->cpus)
> > -		return NULL;
> > +	if (!sysfs || sz < MIDR_SIZE)
> > +		return EINVAL;
> > -	buf = malloc(MIDR_SIZE);
> > -	if (!buf)
> > -		return NULL;
> > +	cpus = perf_cpu_map__get(cpus);
> > -	/* read midr from list of cpus mapped to this pmu */
> > -	cpus = perf_cpu_map__get(pmu->cpus);
> >   	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
> > +		char path[PATH_MAX];
> > +		FILE *file;
> > +
> >   		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
> >   				sysfs, cpus->map[cpu]);
> > @@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
> >   		break;
> >   	}
> > -	if (!midr) {
> > +	perf_cpu_map__put(cpus);
> > +
> > +	if (!midr)
> > +		return EINVAL;
> > +
> > +	return 0;
> > +}
> > +
> > +int get_cpuid(char *buf, size_t sz)
> > +{
> > +	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
> > +	int ret;
> > +
> > +	if (!cpus)
> > +		return EINVAL;
> > +
> > +	ret = _get_cpuid(buf, sz, cpus);
> > +
> > +	perf_cpu_map__put(cpus);
> > +
> > +	return ret;
> > +}
> > +
> > +char *get_cpuid_str(struct perf_pmu *pmu)
> > +{
> > +	char *buf = NULL;
> > +	int res;
> > +
> > +	if (!pmu || !pmu->cpus)
> > +		return NULL;
> > +
> > +	buf = malloc(MIDR_SIZE);
> > +	if (!buf)
> > +		return NULL;
> > +
> > +	/* read midr from list of cpus mapped to this pmu */
> > +	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
> > +	if (res) {
> >   		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
> >   		free(buf);
> >   		buf = NULL;
> >   	}
> > -	perf_cpu_map__put(cpus);
> >   	return buf;
> >   }
> > 
> 

-- 

- Arnaldo

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] perf tools: Add arm64 version of get_cpuid()
  2020-02-12 13:40     ` Arnaldo Carvalho de Melo
@ 2020-02-12 15:49       ` John Garry
  -1 siblings, 0 replies; 13+ messages in thread
From: John Garry @ 2020-02-12 15:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: peterz, mingo, mark.rutland, alexander.shishkin, jolsa, namhyung,
	linux-kernel, will, linux-arm-kernel, linuxarm

On 12/02/2020 13:40, Arnaldo Carvalho de Melo wrote:
> Em Tue, Jan 07, 2020 at 09:13:43AM +0000, John Garry escreveu:
>> On 13/12/2019 13:54, John Garry wrote:
>>
>> Hi Arnaldo,
>>
>> Do we need some reviews on this? Or was it missed/still catching up?
> 
> Got lost in the holidays, devconf.cz, vacations, sorry, picking it up
> now, together with a Tested-by by Shaokun Zhang, some issues with the
> formatting of the patch:
> 
> - Avoid starting lines with '#' as those will vanish when I use 'git am'

ah, so this must be why people use, for example, '/include "..."' in 
commit logs

> 
> - Separate the commit log message from the diff using a '---' at the
>    begining of the line, otherwise 'git am' fails

apologizes, I must have cut that by mistake

> 
> I fixed those up now, will test with my build containers, thanks.
> 

Thanks

> - Arnaldo
>   
>> Cheers,
>> John
>>
>>> Add an arm64 version of get_cpuid(), which is used for various annotation
>>> and headers - for example, I now get the CPUID in "perf report --header",
>>> as shown in this snippet:
>>>
>>> # hostname : ubuntu
>>> # os release : 5.5.0-rc1-dirty
>>> # perf version : 5.5.rc1.gbf8a13dc9851
>>> # arch : aarch64
>>> # nrcpus online : 96
>>> # nrcpus avail : 96
>>> # cpuid : 0x00000000480fd010
>>>
>>> Since much of the code to read the MIDR is already in get_cpuid_str(),
>>> factor out this code.
>>>
>>> Signed-off-by: John Garry <john.garry@huawei.com>
>>>
>>> diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
>>> index a32e4b72a98f..d730666ab95d 100644
>>> --- a/tools/perf/arch/arm64/util/header.c
>>> +++ b/tools/perf/arch/arm64/util/header.c
>>> @@ -1,8 +1,10 @@
>>>    #include <stdio.h>
>>>    #include <stdlib.h>
>>>    #include <perf/cpumap.h>
>>> +#include <util/cpumap.h>
>>>    #include <internal/cpumap.h>
>>>    #include <api/fs/fs.h>
>>> +#include <errno.h>
>>>    #include "debug.h"
>>>    #include "header.h"
>>> @@ -12,26 +14,21 @@
>>>    #define MIDR_VARIANT_SHIFT      20
>>>    #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
>>> -char *get_cpuid_str(struct perf_pmu *pmu)
>>> +static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
>>>    {
>>> -	char *buf = NULL;
>>> -	char path[PATH_MAX];
>>>    	const char *sysfs = sysfs__mountpoint();
>>> -	int cpu;
>>>    	u64 midr = 0;
>>> -	struct perf_cpu_map *cpus;
>>> -	FILE *file;
>>> +	int cpu;
>>> -	if (!sysfs || !pmu || !pmu->cpus)
>>> -		return NULL;
>>> +	if (!sysfs || sz < MIDR_SIZE)
>>> +		return EINVAL;
>>> -	buf = malloc(MIDR_SIZE);
>>> -	if (!buf)
>>> -		return NULL;
>>> +	cpus = perf_cpu_map__get(cpus);
>>> -	/* read midr from list of cpus mapped to this pmu */
>>> -	cpus = perf_cpu_map__get(pmu->cpus);
>>>    	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
>>> +		char path[PATH_MAX];
>>> +		FILE *file;
>>> +
>>>    		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
>>>    				sysfs, cpus->map[cpu]);
>>> @@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
>>>    		break;
>>>    	}
>>> -	if (!midr) {
>>> +	perf_cpu_map__put(cpus);
>>> +
>>> +	if (!midr)
>>> +		return EINVAL;
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +int get_cpuid(char *buf, size_t sz)
>>> +{
>>> +	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
>>> +	int ret;
>>> +
>>> +	if (!cpus)
>>> +		return EINVAL;
>>> +
>>> +	ret = _get_cpuid(buf, sz, cpus);
>>> +
>>> +	perf_cpu_map__put(cpus);
>>> +
>>> +	return ret;
>>> +}
>>> +
>>> +char *get_cpuid_str(struct perf_pmu *pmu)
>>> +{
>>> +	char *buf = NULL;
>>> +	int res;
>>> +
>>> +	if (!pmu || !pmu->cpus)
>>> +		return NULL;
>>> +
>>> +	buf = malloc(MIDR_SIZE);
>>> +	if (!buf)
>>> +		return NULL;
>>> +
>>> +	/* read midr from list of cpus mapped to this pmu */
>>> +	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
>>> +	if (res) {
>>>    		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
>>>    		free(buf);
>>>    		buf = NULL;
>>>    	}
>>> -	perf_cpu_map__put(cpus);
>>>    	return buf;
>>>    }
>>>
>>
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] perf tools: Add arm64 version of get_cpuid()
@ 2020-02-12 15:49       ` John Garry
  0 siblings, 0 replies; 13+ messages in thread
From: John Garry @ 2020-02-12 15:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: mark.rutland, peterz, will, linux-kernel, linuxarm,
	alexander.shishkin, mingo, namhyung, jolsa, linux-arm-kernel

On 12/02/2020 13:40, Arnaldo Carvalho de Melo wrote:
> Em Tue, Jan 07, 2020 at 09:13:43AM +0000, John Garry escreveu:
>> On 13/12/2019 13:54, John Garry wrote:
>>
>> Hi Arnaldo,
>>
>> Do we need some reviews on this? Or was it missed/still catching up?
> 
> Got lost in the holidays, devconf.cz, vacations, sorry, picking it up
> now, together with a Tested-by by Shaokun Zhang, some issues with the
> formatting of the patch:
> 
> - Avoid starting lines with '#' as those will vanish when I use 'git am'

ah, so this must be why people use, for example, '/include "..."' in 
commit logs

> 
> - Separate the commit log message from the diff using a '---' at the
>    begining of the line, otherwise 'git am' fails

apologizes, I must have cut that by mistake

> 
> I fixed those up now, will test with my build containers, thanks.
> 

Thanks

> - Arnaldo
>   
>> Cheers,
>> John
>>
>>> Add an arm64 version of get_cpuid(), which is used for various annotation
>>> and headers - for example, I now get the CPUID in "perf report --header",
>>> as shown in this snippet:
>>>
>>> # hostname : ubuntu
>>> # os release : 5.5.0-rc1-dirty
>>> # perf version : 5.5.rc1.gbf8a13dc9851
>>> # arch : aarch64
>>> # nrcpus online : 96
>>> # nrcpus avail : 96
>>> # cpuid : 0x00000000480fd010
>>>
>>> Since much of the code to read the MIDR is already in get_cpuid_str(),
>>> factor out this code.
>>>
>>> Signed-off-by: John Garry <john.garry@huawei.com>
>>>
>>> diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
>>> index a32e4b72a98f..d730666ab95d 100644
>>> --- a/tools/perf/arch/arm64/util/header.c
>>> +++ b/tools/perf/arch/arm64/util/header.c
>>> @@ -1,8 +1,10 @@
>>>    #include <stdio.h>
>>>    #include <stdlib.h>
>>>    #include <perf/cpumap.h>
>>> +#include <util/cpumap.h>
>>>    #include <internal/cpumap.h>
>>>    #include <api/fs/fs.h>
>>> +#include <errno.h>
>>>    #include "debug.h"
>>>    #include "header.h"
>>> @@ -12,26 +14,21 @@
>>>    #define MIDR_VARIANT_SHIFT      20
>>>    #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
>>> -char *get_cpuid_str(struct perf_pmu *pmu)
>>> +static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
>>>    {
>>> -	char *buf = NULL;
>>> -	char path[PATH_MAX];
>>>    	const char *sysfs = sysfs__mountpoint();
>>> -	int cpu;
>>>    	u64 midr = 0;
>>> -	struct perf_cpu_map *cpus;
>>> -	FILE *file;
>>> +	int cpu;
>>> -	if (!sysfs || !pmu || !pmu->cpus)
>>> -		return NULL;
>>> +	if (!sysfs || sz < MIDR_SIZE)
>>> +		return EINVAL;
>>> -	buf = malloc(MIDR_SIZE);
>>> -	if (!buf)
>>> -		return NULL;
>>> +	cpus = perf_cpu_map__get(cpus);
>>> -	/* read midr from list of cpus mapped to this pmu */
>>> -	cpus = perf_cpu_map__get(pmu->cpus);
>>>    	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
>>> +		char path[PATH_MAX];
>>> +		FILE *file;
>>> +
>>>    		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
>>>    				sysfs, cpus->map[cpu]);
>>> @@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
>>>    		break;
>>>    	}
>>> -	if (!midr) {
>>> +	perf_cpu_map__put(cpus);
>>> +
>>> +	if (!midr)
>>> +		return EINVAL;
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +int get_cpuid(char *buf, size_t sz)
>>> +{
>>> +	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
>>> +	int ret;
>>> +
>>> +	if (!cpus)
>>> +		return EINVAL;
>>> +
>>> +	ret = _get_cpuid(buf, sz, cpus);
>>> +
>>> +	perf_cpu_map__put(cpus);
>>> +
>>> +	return ret;
>>> +}
>>> +
>>> +char *get_cpuid_str(struct perf_pmu *pmu)
>>> +{
>>> +	char *buf = NULL;
>>> +	int res;
>>> +
>>> +	if (!pmu || !pmu->cpus)
>>> +		return NULL;
>>> +
>>> +	buf = malloc(MIDR_SIZE);
>>> +	if (!buf)
>>> +		return NULL;
>>> +
>>> +	/* read midr from list of cpus mapped to this pmu */
>>> +	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
>>> +	if (res) {
>>>    		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
>>>    		free(buf);
>>>    		buf = NULL;
>>>    	}
>>> -	perf_cpu_map__put(cpus);
>>>    	return buf;
>>>    }
>>>
>>
> 


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [tip: perf/urgent] perf tools: Add arm64 version of get_cpuid()
  2019-12-13 13:54 ` John Garry
                   ` (2 preceding siblings ...)
  (?)
@ 2020-02-15  8:41 ` tip-bot2 for John Garry
  -1 siblings, 0 replies; 13+ messages in thread
From: tip-bot2 for John Garry @ 2020-02-15  8:41 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: John Garry, Shaokun Zhang, Alexander Shishkin, Jiri Olsa,
	Mark Rutland, Namhyung Kim, Peter Zijlstra, Will Deacon,
	linux-arm-kernel, linuxarm, Arnaldo Carvalho de Melo, x86, LKML

The following commit has been merged into the perf/urgent branch of tip:

Commit-ID:     df5a5f3cf24608457bb5e57297dd9f0d528be58f
Gitweb:        https://git.kernel.org/tip/df5a5f3cf24608457bb5e57297dd9f0d528be58f
Author:        John Garry <john.garry@huawei.com>
AuthorDate:    Fri, 13 Dec 2019 21:54:15 +08:00
Committer:     Arnaldo Carvalho de Melo <acme@redhat.com>
CommitterDate: Wed, 12 Feb 2020 10:36:51 -03:00

perf tools: Add arm64 version of get_cpuid()

Add an arm64 version of get_cpuid(), which is used for various annotation
and headers - for example, I now get the CPUID in "perf report --header",
as shown in this snippet:

  # hostname : ubuntu
  # os release : 5.5.0-rc1-dirty
  # perf version : 5.5.rc1.gbf8a13dc9851
  # arch : aarch64
  # nrcpus online : 96
  # nrcpus avail : 96
  # cpuid : 0x00000000480fd010

Since much of the code to read the MIDR is already in get_cpuid_str(),
factor out this code.

Tester notes:

I tested this patch on my new ARM64 Kunpeng 920 server.
[root@node1 zsk]# ./perf --version
perf version 5.6.rc1.g2cdb955b7252

Both perf list and perf stat can work.

Signed-off-by: John Garry <john.garry@huawei.com>
Tested-by: Shaokun Zhang <zhangshaokun@hisilicon.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linuxarm@huawei.com
Link: http://lore.kernel.org/lkml/1576245255-210926-1-git-send-email-john.garry@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/arch/arm64/util/header.c | 63 +++++++++++++++++++++-------
 1 file changed, 48 insertions(+), 15 deletions(-)

diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
index a32e4b7..d730666 100644
--- a/tools/perf/arch/arm64/util/header.c
+++ b/tools/perf/arch/arm64/util/header.c
@@ -1,8 +1,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <perf/cpumap.h>
+#include <util/cpumap.h>
 #include <internal/cpumap.h>
 #include <api/fs/fs.h>
+#include <errno.h>
 #include "debug.h"
 #include "header.h"
 
@@ -12,26 +14,21 @@
 #define MIDR_VARIANT_SHIFT      20
 #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
 
-char *get_cpuid_str(struct perf_pmu *pmu)
+static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
 {
-	char *buf = NULL;
-	char path[PATH_MAX];
 	const char *sysfs = sysfs__mountpoint();
-	int cpu;
 	u64 midr = 0;
-	struct perf_cpu_map *cpus;
-	FILE *file;
+	int cpu;
 
-	if (!sysfs || !pmu || !pmu->cpus)
-		return NULL;
+	if (!sysfs || sz < MIDR_SIZE)
+		return EINVAL;
 
-	buf = malloc(MIDR_SIZE);
-	if (!buf)
-		return NULL;
+	cpus = perf_cpu_map__get(cpus);
 
-	/* read midr from list of cpus mapped to this pmu */
-	cpus = perf_cpu_map__get(pmu->cpus);
 	for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
+		char path[PATH_MAX];
+		FILE *file;
+
 		scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
 				sysfs, cpus->map[cpu]);
 
@@ -57,12 +54,48 @@ char *get_cpuid_str(struct perf_pmu *pmu)
 		break;
 	}
 
-	if (!midr) {
+	perf_cpu_map__put(cpus);
+
+	if (!midr)
+		return EINVAL;
+
+	return 0;
+}
+
+int get_cpuid(char *buf, size_t sz)
+{
+	struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
+	int ret;
+
+	if (!cpus)
+		return EINVAL;
+
+	ret = _get_cpuid(buf, sz, cpus);
+
+	perf_cpu_map__put(cpus);
+
+	return ret;
+}
+
+char *get_cpuid_str(struct perf_pmu *pmu)
+{
+	char *buf = NULL;
+	int res;
+
+	if (!pmu || !pmu->cpus)
+		return NULL;
+
+	buf = malloc(MIDR_SIZE);
+	if (!buf)
+		return NULL;
+
+	/* read midr from list of cpus mapped to this pmu */
+	res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
+	if (res) {
 		pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
 		free(buf);
 		buf = NULL;
 	}
 
-	perf_cpu_map__put(cpus);
 	return buf;
 }

^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2020-02-15  8:42 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-13 13:54 [PATCH] perf tools: Add arm64 version of get_cpuid() John Garry
2019-12-13 13:54 ` John Garry
2020-01-07  9:13 ` John Garry
2020-01-07  9:13   ` John Garry
2020-02-12 13:40   ` Arnaldo Carvalho de Melo
2020-02-12 13:40     ` Arnaldo Carvalho de Melo
2020-02-12 15:49     ` John Garry
2020-02-12 15:49       ` John Garry
2020-02-12  9:30 ` Shaokun Zhang
2020-02-12  9:30   ` Shaokun Zhang
2020-02-12 13:35   ` Arnaldo Carvalho de Melo
2020-02-12 13:35     ` Arnaldo Carvalho de Melo
2020-02-15  8:41 ` [tip: perf/urgent] " tip-bot2 for John Garry

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.