Commit 7fbddf40 authored by Kajol Jain's avatar Kajol Jain Committed by Arnaldo Carvalho de Melo
Browse files

tools headers UAPI: Add new macros for mem_hops field to perf_event.h



Add new macros for mem_hops field which can be used to represent
remote-node, socket and board level details.

Currently the code had macro for HOPS_0 which, corresponds to data
coming from another core but same node.  Add new macros for HOPS_1 to
HOPS_3 to represent remote-node, socket and board level data.

Also add corresponding strings in the mem_hops array to represent
mem_hop field data in perf_mem__lvl_scnprintf function

Incase mem_hops field is used, PERF_MEM_LVLNUM field also need to be set
inorder to represent the data source. Hence printing data source via
PERF_MEM_LVL field can be skip in that scenario.

For ex: Encodings for mem_hops fields with L2 cache:

  L2                      - local L2
  L2 | REMOTE | HOPS_0    - remote core, same node L2
  L2 | REMOTE | HOPS_1    - remote node, same socket L2
  L2 | REMOTE | HOPS_2    - remote socket, same board L2
  L2 | REMOTE | HOPS_3    - remote board L2

Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nageswara R Sastry <rnsastry@linux.ibm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: linuxppc-dev@lists.ozlabs.org
Link: http://lore.kernel.org/lkml/20211206091749.87585-3-kjain@linux.ibm.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent bb516937
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1332,7 +1332,10 @@ union perf_mem_data_src {

/* hop level */
#define PERF_MEM_HOPS_0		0x01 /* remote core, same node */
/* 2-7 available */
#define PERF_MEM_HOPS_1         0x02 /* remote node, same socket */
#define PERF_MEM_HOPS_2         0x03 /* remote socket, same board */
#define PERF_MEM_HOPS_3         0x04 /* remote board */
/* 5-7 available */
#define PERF_MEM_HOPS_SHIFT	43

#define PERF_MEM_S(a, s) \
+18 −11
Original line number Diff line number Diff line
@@ -309,6 +309,9 @@ static const char * const mem_hops[] = {
	 * to be set with mem_hops field.
	 */
	"core, same node",
	"node, same socket",
	"socket, same board",
	"board",
};

int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
@@ -316,7 +319,7 @@ int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
	size_t i, l = 0;
	u64 m =  PERF_MEM_LVL_NA;
	u64 hit, miss;
	int printed;
	int printed = 0;

	if (mem_info)
		m  = mem_info->data_src.mem_lvl;
@@ -335,10 +338,13 @@ int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
		l += 7;
	}

	if (mem_info && mem_info->data_src.mem_hops)
	/*
	 * Incase mem_hops field is set, we can skip printing data source via
	 * PERF_MEM_LVL namespace.
	 */
	if (mem_info && mem_info->data_src.mem_hops) {
		l += scnprintf(out + l, sz - l, "%s ", mem_hops[mem_info->data_src.mem_hops]);

	printed = 0;
	} else {
		for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
			if (!(m & 0x1))
				continue;
@@ -348,6 +354,7 @@ int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
			}
			l += scnprintf(out + l, sz - l, mem_lvl[i]);
		}
	}

	if (mem_info && mem_info->data_src.mem_lvl_num) {
		int lvl = mem_info->data_src.mem_lvl_num;