linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V6 0/8] perf: Expand perf_branch_entry
@ 2022-06-10  3:50 Anshuman Khandual
  2022-06-10  3:50 ` [PATCH V6 1/8] perf: Add system error and not in transaction branch types Anshuman Khandual
                   ` (10 more replies)
  0 siblings, 11 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-10  3:50 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Anshuman Khandual, Robin Murphy, Suzuki Poulose, James Clark,
	Ingo Molnar, Mark Rutland, Namhyung Kim, Thomas Gleixner,
	Will Deacon, linux-arm-kernel

Branch Record Buffer Extension (BRBE) implementation on arm64 captures more
branch type classification which cannot be accommodated in the current perf
branch record format via perf_branch_entry.type element (4 bit field). Also
it captures privilege information which does not have a corresponding slot
in perf_branch_entry. This series expands struct perf_branch_entry, to meet
both these requirements without breaking the existing user space ABI for
perf tools.

All architecture specific branch types added via perf_branch_entry.new_type
field in [PATCH 3/4] will be used in BRBE implementation on arm64 platform
later on with the following map.

#ifdef CONFIG_ARM64
#define PERF_BR_FIQ		PERF_BR_NEW_ARCH_1
#define PERF_BR_DEBUG_HALT	PERF_BR_NEW_ARCH_2
#define PERF_BR_DEBUG_EXIT	PERF_BR_NEW_ARCH_3
#define PERF_BR_DEBUG_INST	PERF_BR_NEW_ARCH_4
#define PERF_BR_DEBUG_DATA	PERF_BR_NEW_ARCH_5
#endif

This series applies on v5.19-rc1

perf API

The series being applied

- Clean : tools/perf/check-headers.sh
- Clean : diff -u tools/include/uapi/linux/perf_event.h include/uapi/linux/perf_event.h

References

- BRBE captured branch record information

https://developer.arm.com/documentation/ddi0601/2021-12/AArch64-Registers/BRBINF-n--EL1--Branch-Record-Buffer-Information-Register--n-?lang=en

- BRBE based perf branch stack implementation on arm64 platform

https://lore.kernel.org/all/1642998653-21377-1-git-send-email-anshuman.khandual@arm.com/

Changes in V6:

- Process PERF_BR_EXTEND_ABI in perf tools and fetch from perf_branch_entry.new_type
- Modified the commit message for [PATCH 1/8]

Changes in V5:

https://lore.kernel.org/linux-arm-kernel/20220404045046.634522-1-anshuman.khandual@arm.com/

- Dropped patches [PATCH 1/10] and [PATCH 6/10] related to PERF_BR_[RET|IRQ] - merged
  via the commit cedd3614e5d9c809 ("perf: Add irq and exception return branch types")

- Rebased series on v5.18-rc1

Changes in V4:

https://lore.kernel.org/all/20220315053516.431515-1-anshuman.khandual@arm.com/

- Modified the struct branch_flags as required
- Dropped CONFIG_ARM64 from perf header file to avoid build problem
- Renamed PERF_BR_NEW_<BRANCH_TYPE> as PERF_BR_ARM64_<BRANCH_TYPE>

Changes in V3:

https://lore.kernel.org/all/20220314055857.125421-1-anshuman.khandual@arm.com/

- Fixed small typo s/privillege/privilege in include/uapi/linux/perf_event.h
- Added PRIV_SHIFT in __p_branch_sample_type()
- Added arm64 platform override of the new arch specific branch types
- Renamed s/PERF_BR_XXX/PERF_BR_PRIV_XXX/ for privilege level branch types
- Added PERF_BR_PRIV_UNKNOWN as the starting value
- Expanded perf_branch_entry.priv into a 3 bits field 

Changes in V2:

https://lore.kernel.org/all/20220309033642.144769-1-anshuman.khandual@arm.com/

Cc: Robin Murphy <robin.murphy@arm.com> 
Cc: Suzuki Poulose <suzuki.poulose@arm.com>
Cc: James Clark <james.clark@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-perf-users@vger.kernel.org
Cc: linux-kernel@vger.kernel.org

Anshuman Khandual (8):
  perf: Add system error and not in transaction branch types
  perf: Extend branch type classification
  perf: Capture branch privilege information
  perf: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform
  perf/tools: Add system error and not in transaction branch types
  perf/tools: Extend branch type classification
  perf/tools: Add branch privilege information request flag
  perf/tools: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform

 arch/x86/events/intel/lbr.c               |  2 +-
 include/uapi/linux/perf_event.h           | 36 +++++++++++-
 tools/include/uapi/linux/perf_event.h     | 36 +++++++++++-
 tools/perf/Documentation/perf-record.txt  |  1 +
 tools/perf/builtin-script.c               |  2 +-
 tools/perf/util/branch.c                  | 69 ++++++++++++++++++++++-
 tools/perf/util/branch.h                  |  7 ++-
 tools/perf/util/parse-branch-options.c    |  1 +
 tools/perf/util/perf_event_attr_fprintf.c |  2 +-
 tools/perf/util/session.c                 |  2 +-
 10 files changed, 149 insertions(+), 9 deletions(-)

-- 
2.25.1


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

* [PATCH V6 1/8] perf: Add system error and not in transaction branch types
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
@ 2022-06-10  3:50 ` Anshuman Khandual
  2022-06-10  3:50 ` [PATCH V6 2/8] perf: Extend branch type classification Anshuman Khandual
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-10  3:50 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Anshuman Khandual, Robin Murphy, Suzuki Poulose, James Clark,
	Ingo Molnar, Mark Rutland, Namhyung Kim, Thomas Gleixner,
	Will Deacon, linux-arm-kernel

This expands generic branch type classification by adding two more entries
there in i.e system error and not in transaction. This also updates the x86
implementation to process X86_BR_NO_TX records as appropriate. This changes
branch types reported to user space on x86 platform but it should not be a
problem. The possible scenarios and impacts are enumerated here.

--------------------------------------------------------------------------
| kernel | perf tool |                     Impact                        |
--------------------------------------------------------------------------
|   old  |    old    |  Works as before                                  |
--------------------------------------------------------------------------
|   old  |    new    |  PERF_BR_UNKNOWN is processed                     |
--------------------------------------------------------------------------
|   new  |    old    |  PERF_BR_NO_TX is blocked via old PERF_BR_MAX     |
--------------------------------------------------------------------------
|   new  |    new    |  PERF_BR_NO_TX is recognized                      |
--------------------------------------------------------------------------

When PERF_BR_NO_TX is blocked via old PERF_BR_MAX (new kernel with old perf
tool) the user space might throw up an warning complaining about an
unrecognized branch types being reported, but it's expected. PERF_BR_SERROR
& PERF_BR_NO_TX branch types will be used for BRBE implementation on arm64
platform.

PERF_BR_NO_TX complements 'abort' and 'in_tx' elements in perf_branch_entry
which represent other transaction states for a given branch record. Because
this completes the transaction state classification.

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-perf-users@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
 arch/x86/events/intel/lbr.c     | 2 +-
 include/uapi/linux/perf_event.h | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/x86/events/intel/lbr.c b/arch/x86/events/intel/lbr.c
index 13179f31fe10..0a506c85b53e 100644
--- a/arch/x86/events/intel/lbr.c
+++ b/arch/x86/events/intel/lbr.c
@@ -1334,7 +1334,7 @@ static int branch_map[X86_BR_TYPE_MAP_MAX] = {
 	PERF_BR_IND_CALL,	/* X86_BR_IND_CALL */
 	PERF_BR_UNKNOWN,	/* X86_BR_ABORT */
 	PERF_BR_UNKNOWN,	/* X86_BR_IN_TX */
-	PERF_BR_UNKNOWN,	/* X86_BR_NO_TX */
+	PERF_BR_NO_TX,		/* X86_BR_NO_TX */
 	PERF_BR_CALL,		/* X86_BR_ZERO_CALL */
 	PERF_BR_UNKNOWN,	/* X86_BR_CALL_STACK */
 	PERF_BR_IND,		/* X86_BR_IND_JMP */
diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
index d37629dbad72..26d8f0b5ac0d 100644
--- a/include/uapi/linux/perf_event.h
+++ b/include/uapi/linux/perf_event.h
@@ -253,6 +253,8 @@ enum {
 	PERF_BR_COND_RET	= 10,	/* conditional function return */
 	PERF_BR_ERET		= 11,	/* exception return */
 	PERF_BR_IRQ		= 12,	/* irq */
+	PERF_BR_SERROR		= 13,	/* system error */
+	PERF_BR_NO_TX		= 14,	/* not in transaction */
 	PERF_BR_MAX,
 };
 
-- 
2.25.1


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

* [PATCH V6 2/8] perf: Extend branch type classification
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
  2022-06-10  3:50 ` [PATCH V6 1/8] perf: Add system error and not in transaction branch types Anshuman Khandual
@ 2022-06-10  3:50 ` Anshuman Khandual
  2022-06-10  3:50 ` [PATCH V6 3/8] perf: Capture branch privilege information Anshuman Khandual
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-10  3:50 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Anshuman Khandual, Robin Murphy, Suzuki Poulose, James Clark,
	Ingo Molnar, Mark Rutland, Namhyung Kim, Thomas Gleixner,
	Will Deacon, linux-arm-kernel

branch_entry.type now has ran out of space to accommodate more branch types
classification. This will prevent perf branch stack implementation on arm64
(via BRBE) to capture all available branch types. Extending this bit field
i.e branch_entry.type [4 bits] is not an option as it will break user space
ABI both for little and big endian perf tools.

Extend branch classification with a new field branch_entry.new_type via a
new branch type PERF_BR_EXTEND_ABI in branch_entry.type. Perf tools which
could decode PERF_BR_EXTEND_ABI, will then parse branch_entry.new_type as
well.

branch_entry.new_type is a 4 bit field which can hold upto 16 branch types.
The first three branch types will hold various generic page faults followed
by five architecture specific branch types, which can be overridden by the
platform for specific use cases. These architecture specific branch types
gets overridden on arm64 platform for BRBE implementation.

New generic branch types

- PERF_BR_NEW_FAULT_ALGN
- PERF_BR_NEW_FAULT_DATA
- PERF_BR_NEW_FAULT_INST

New arch specific branch types

- PERF_BR_NEW_ARCH_1
- PERF_BR_NEW_ARCH_2
- PERF_BR_NEW_ARCH_3
- PERF_BR_NEW_ARCH_4
- PERF_BR_NEW_ARCH_5

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-perf-users@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
 include/uapi/linux/perf_event.h | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
index 26d8f0b5ac0d..d29280adc3c4 100644
--- a/include/uapi/linux/perf_event.h
+++ b/include/uapi/linux/perf_event.h
@@ -255,9 +255,22 @@ enum {
 	PERF_BR_IRQ		= 12,	/* irq */
 	PERF_BR_SERROR		= 13,	/* system error */
 	PERF_BR_NO_TX		= 14,	/* not in transaction */
+	PERF_BR_EXTEND_ABI	= 15,	/* extend ABI */
 	PERF_BR_MAX,
 };
 
+enum {
+	PERF_BR_NEW_FAULT_ALGN		= 0,    /* Alignment fault */
+	PERF_BR_NEW_FAULT_DATA		= 1,    /* Data fault */
+	PERF_BR_NEW_FAULT_INST		= 2,    /* Inst fault */
+	PERF_BR_NEW_ARCH_1		= 3,    /* Architecture specific */
+	PERF_BR_NEW_ARCH_2		= 4,    /* Architecture specific */
+	PERF_BR_NEW_ARCH_3		= 5,    /* Architecture specific */
+	PERF_BR_NEW_ARCH_4		= 6,    /* Architecture specific */
+	PERF_BR_NEW_ARCH_5		= 7,    /* Architecture specific */
+	PERF_BR_NEW_MAX,
+};
+
 #define PERF_SAMPLE_BRANCH_PLM_ALL \
 	(PERF_SAMPLE_BRANCH_USER|\
 	 PERF_SAMPLE_BRANCH_KERNEL|\
@@ -1372,7 +1385,8 @@ struct perf_branch_entry {
 		abort:1,    /* transaction abort */
 		cycles:16,  /* cycle count to last branch */
 		type:4,     /* branch type */
-		reserved:40;
+		new_type:4, /* additional branch type */
+		reserved:36;
 };
 
 union perf_sample_weight {
-- 
2.25.1


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

* [PATCH V6 3/8] perf: Capture branch privilege information
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
  2022-06-10  3:50 ` [PATCH V6 1/8] perf: Add system error and not in transaction branch types Anshuman Khandual
  2022-06-10  3:50 ` [PATCH V6 2/8] perf: Extend branch type classification Anshuman Khandual
@ 2022-06-10  3:50 ` Anshuman Khandual
  2022-06-10  3:50 ` [PATCH V6 4/8] perf: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform Anshuman Khandual
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-10  3:50 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Anshuman Khandual, Robin Murphy, Suzuki Poulose, James Clark,
	Ingo Molnar, Mark Rutland, Namhyung Kim, Thomas Gleixner,
	Will Deacon, linux-arm-kernel

Platforms like arm64 could capture privilege level information for all the
branch records. Hence this adds a new element in the struct branch_entry to
record the privilege level information, which could be requested through a
new event.attr.branch_sample_type based flag PERF_SAMPLE_BRANCH_PRIV_SAVE.
This flag helps user choose whether privilege information is captured.

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-perf-users@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Reviewed-by: James Clark <james.clark@arm.com>
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
 include/uapi/linux/perf_event.h | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
index d29280adc3c4..193dba2ecdc1 100644
--- a/include/uapi/linux/perf_event.h
+++ b/include/uapi/linux/perf_event.h
@@ -204,6 +204,8 @@ enum perf_branch_sample_type_shift {
 
 	PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT	= 17, /* save low level index of raw branch records */
 
+	PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT	= 18, /* save privilege mode */
+
 	PERF_SAMPLE_BRANCH_MAX_SHIFT		/* non-ABI */
 };
 
@@ -233,6 +235,8 @@ enum perf_branch_sample_type {
 
 	PERF_SAMPLE_BRANCH_HW_INDEX	= 1U << PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT,
 
+	PERF_SAMPLE_BRANCH_PRIV_SAVE	= 1U << PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT,
+
 	PERF_SAMPLE_BRANCH_MAX		= 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT,
 };
 
@@ -271,6 +275,13 @@ enum {
 	PERF_BR_NEW_MAX,
 };
 
+enum {
+	PERF_BR_PRIV_UNKNOWN	= 0,
+	PERF_BR_PRIV_USER	= 1,
+	PERF_BR_PRIV_KERNEL	= 2,
+	PERF_BR_PRIV_HV		= 3,
+};
+
 #define PERF_SAMPLE_BRANCH_PLM_ALL \
 	(PERF_SAMPLE_BRANCH_USER|\
 	 PERF_SAMPLE_BRANCH_KERNEL|\
@@ -1386,7 +1397,8 @@ struct perf_branch_entry {
 		cycles:16,  /* cycle count to last branch */
 		type:4,     /* branch type */
 		new_type:4, /* additional branch type */
-		reserved:36;
+		priv:3,     /* privilege level */
+		reserved:33;
 };
 
 union perf_sample_weight {
-- 
2.25.1


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

* [PATCH V6 4/8] perf: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
                   ` (2 preceding siblings ...)
  2022-06-10  3:50 ` [PATCH V6 3/8] perf: Capture branch privilege information Anshuman Khandual
@ 2022-06-10  3:50 ` Anshuman Khandual
  2022-06-10  3:50 ` [PATCH V6 5/8] perf/tools: Add system error and not in transaction branch types Anshuman Khandual
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-10  3:50 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Anshuman Khandual, Robin Murphy, Suzuki Poulose, James Clark,
	Ingo Molnar, Mark Rutland, Namhyung Kim, Thomas Gleixner,
	Will Deacon, linux-arm-kernel

BRBE captured branch types will overflow perf_branch_entry.type and generic
branch types in perf_branch_entry.new_type. So override each available arch
specific branch type in the following manner to comprehensively process all
reported branch types in BRBE.

PERF_BR_ARM64_FIQ            PERF_BR_NEW_ARCH_1
PERF_BR_ARM64_DEBUG_HALT     PERF_BR_NEW_ARCH_2
PERF_BR_ARM64_DEBUG_EXIT     PERF_BR_NEW_ARCH_3
PERF_BR_ARM64_DEBUG_INST     PERF_BR_NEW_ARCH_4
PERF_BR_ARM64_DEBUG_DATA     PERF_BR_NEW_ARCH_5

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-perf-users@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
 include/uapi/linux/perf_event.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
index 193dba2ecdc1..4cf1c8e22cab 100644
--- a/include/uapi/linux/perf_event.h
+++ b/include/uapi/linux/perf_event.h
@@ -282,6 +282,12 @@ enum {
 	PERF_BR_PRIV_HV		= 3,
 };
 
+#define PERF_BR_ARM64_FIQ		PERF_BR_NEW_ARCH_1
+#define PERF_BR_ARM64_DEBUG_HALT	PERF_BR_NEW_ARCH_2
+#define PERF_BR_ARM64_DEBUG_EXIT	PERF_BR_NEW_ARCH_3
+#define PERF_BR_ARM64_DEBUG_INST	PERF_BR_NEW_ARCH_4
+#define PERF_BR_ARM64_DEBUG_DATA	PERF_BR_NEW_ARCH_5
+
 #define PERF_SAMPLE_BRANCH_PLM_ALL \
 	(PERF_SAMPLE_BRANCH_USER|\
 	 PERF_SAMPLE_BRANCH_KERNEL|\
-- 
2.25.1


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

* [PATCH V6 5/8] perf/tools: Add system error and not in transaction branch types
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
                   ` (3 preceding siblings ...)
  2022-06-10  3:50 ` [PATCH V6 4/8] perf: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform Anshuman Khandual
@ 2022-06-10  3:50 ` Anshuman Khandual
  2022-06-10  3:50 ` [PATCH V6 6/8] perf/tools: Extend branch type classification Anshuman Khandual
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-10  3:50 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Anshuman Khandual, Robin Murphy, Suzuki Poulose, James Clark,
	Ingo Molnar, Mark Rutland, Namhyung Kim, Thomas Gleixner,
	Will Deacon, linux-arm-kernel

This updates the perf tool with generic branch type classification with two
new branch types i.e system error (PERF_BR_SERROR) and not in transaction
(PERF_BR_NO_TX) which got updated earlier in the kernel. This also updates
corresponding branch type strings in branch_type_name().

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-perf-users@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
 tools/include/uapi/linux/perf_event.h | 2 ++
 tools/perf/util/branch.c              | 4 +++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h
index d37629dbad72..26d8f0b5ac0d 100644
--- a/tools/include/uapi/linux/perf_event.h
+++ b/tools/include/uapi/linux/perf_event.h
@@ -253,6 +253,8 @@ enum {
 	PERF_BR_COND_RET	= 10,	/* conditional function return */
 	PERF_BR_ERET		= 11,	/* exception return */
 	PERF_BR_IRQ		= 12,	/* irq */
+	PERF_BR_SERROR		= 13,	/* system error */
+	PERF_BR_NO_TX		= 14,	/* not in transaction */
 	PERF_BR_MAX,
 };
 
diff --git a/tools/perf/util/branch.c b/tools/perf/util/branch.c
index a9a909db8cc7..abc673347bee 100644
--- a/tools/perf/util/branch.c
+++ b/tools/perf/util/branch.c
@@ -51,7 +51,9 @@ const char *branch_type_name(int type)
 		"COND_CALL",
 		"COND_RET",
 		"ERET",
-		"IRQ"
+		"IRQ",
+		"SERROR",
+		"NO_TX"
 	};
 
 	if (type >= 0 && type < PERF_BR_MAX)
-- 
2.25.1


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

* [PATCH V6 6/8] perf/tools: Extend branch type classification
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
                   ` (4 preceding siblings ...)
  2022-06-10  3:50 ` [PATCH V6 5/8] perf/tools: Add system error and not in transaction branch types Anshuman Khandual
@ 2022-06-10  3:50 ` Anshuman Khandual
  2022-06-14 16:53   ` German Gomez
  2022-06-10  3:51 ` [PATCH V6 7/8] perf/tools: Add branch privilege information request flag Anshuman Khandual
                   ` (4 subsequent siblings)
  10 siblings, 1 reply; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-10  3:50 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Anshuman Khandual, Robin Murphy, Suzuki Poulose, James Clark,
	Ingo Molnar, Mark Rutland, Namhyung Kim, Thomas Gleixner,
	Will Deacon, linux-arm-kernel

This updates the perf tool with generic branch type classification with new
ABI extender place holder i.e PERF_BR_EXTEND_ABI, the new 4 bit branch type
field i.e perf_branch_entry.new_type, new generic page fault related branch
types and some arch specific branch types as added earlier in the kernel.

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-perf-users@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
 tools/include/uapi/linux/perf_event.h | 16 ++++++++-
 tools/perf/builtin-script.c           |  2 +-
 tools/perf/util/branch.c              | 52 ++++++++++++++++++++++++++-
 tools/perf/util/branch.h              |  6 +++-
 tools/perf/util/session.c             |  2 +-
 5 files changed, 73 insertions(+), 5 deletions(-)

diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h
index 26d8f0b5ac0d..d29280adc3c4 100644
--- a/tools/include/uapi/linux/perf_event.h
+++ b/tools/include/uapi/linux/perf_event.h
@@ -255,9 +255,22 @@ enum {
 	PERF_BR_IRQ		= 12,	/* irq */
 	PERF_BR_SERROR		= 13,	/* system error */
 	PERF_BR_NO_TX		= 14,	/* not in transaction */
+	PERF_BR_EXTEND_ABI	= 15,	/* extend ABI */
 	PERF_BR_MAX,
 };
 
+enum {
+	PERF_BR_NEW_FAULT_ALGN		= 0,    /* Alignment fault */
+	PERF_BR_NEW_FAULT_DATA		= 1,    /* Data fault */
+	PERF_BR_NEW_FAULT_INST		= 2,    /* Inst fault */
+	PERF_BR_NEW_ARCH_1		= 3,    /* Architecture specific */
+	PERF_BR_NEW_ARCH_2		= 4,    /* Architecture specific */
+	PERF_BR_NEW_ARCH_3		= 5,    /* Architecture specific */
+	PERF_BR_NEW_ARCH_4		= 6,    /* Architecture specific */
+	PERF_BR_NEW_ARCH_5		= 7,    /* Architecture specific */
+	PERF_BR_NEW_MAX,
+};
+
 #define PERF_SAMPLE_BRANCH_PLM_ALL \
 	(PERF_SAMPLE_BRANCH_USER|\
 	 PERF_SAMPLE_BRANCH_KERNEL|\
@@ -1372,7 +1385,8 @@ struct perf_branch_entry {
 		abort:1,    /* transaction abort */
 		cycles:16,  /* cycle count to last branch */
 		type:4,     /* branch type */
-		reserved:40;
+		new_type:4, /* additional branch type */
+		reserved:36;
 };
 
 union perf_sample_weight {
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index c689054002cc..d4d581230f23 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -866,7 +866,7 @@ static int print_bstack_flags(FILE *fp, struct branch_entry *br)
 		       br->flags.in_tx ? 'X' : '-',
 		       br->flags.abort ? 'A' : '-',
 		       br->flags.cycles,
-		       br->flags.type ? branch_type_name(br->flags.type) : "-");
+		       get_branch_type(br));
 }
 
 static int perf_sample__fprintf_brstack(struct perf_sample *sample,
diff --git a/tools/perf/util/branch.c b/tools/perf/util/branch.c
index abc673347bee..6d962b0a4532 100644
--- a/tools/perf/util/branch.c
+++ b/tools/perf/util/branch.c
@@ -21,7 +21,10 @@ void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,
 	if (flags->type == PERF_BR_UNKNOWN || from == 0)
 		return;
 
-	st->counts[flags->type]++;
+	if (flags->type == PERF_BR_EXTEND_ABI)
+		st->new_counts[flags->new_type]++;
+	else
+		st->counts[flags->type]++;
 
 	if (flags->type == PERF_BR_COND) {
 		if (to > from)
@@ -36,6 +39,25 @@ void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,
 		st->cross_4k++;
 }
 
+const char *branch_new_type_name(int new_type)
+{
+	const char *branch_new_names[PERF_BR_NEW_MAX] = {
+		"FAULT_ALGN",
+		"FAULT_DATA",
+		"FAULT_INST",
+		"ARCH_1",
+		"ARCH_2",
+		"ARCH_3",
+		"ARCH_4",
+		"ARCH_5"
+	};
+
+	if (new_type >= 0 && new_type < PERF_BR_NEW_MAX)
+		return branch_new_names[new_type];
+
+	return NULL;
+}
+
 const char *branch_type_name(int type)
 {
 	const char *branch_names[PERF_BR_MAX] = {
@@ -62,6 +84,17 @@ const char *branch_type_name(int type)
 	return NULL;
 }
 
+const char *get_branch_type(struct branch_entry *e)
+{
+	if (e->flags.type == PERF_BR_UNKNOWN)
+		return "";
+
+	if (e->flags.type == PERF_BR_EXTEND_ABI)
+		return branch_new_type_name(e->flags.new_type);
+
+	return branch_type_name(e->flags.type);
+}
+
 void branch_type_stat_display(FILE *fp, struct branch_type_stat *st)
 {
 	u64 total = 0;
@@ -108,6 +141,15 @@ void branch_type_stat_display(FILE *fp, struct branch_type_stat *st)
 				100.0 *
 				(double)st->counts[i] / (double)total);
 	}
+
+	for (i = 0; i < PERF_BR_NEW_MAX; i++) {
+		if (st->new_counts[i] > 0)
+			fprintf(fp, "\n%8s: %5.1f%%",
+				branch_new_type_name(i),
+				100.0 *
+				(double)st->new_counts[i] / (double)total);
+	}
+
 }
 
 static int count_str_scnprintf(int idx, const char *str, char *bf, int size)
@@ -123,6 +165,9 @@ int branch_type_str(struct branch_type_stat *st, char *bf, int size)
 	for (i = 0; i < PERF_BR_MAX; i++)
 		total += st->counts[i];
 
+	for (i = 0; i < PERF_BR_NEW_MAX; i++)
+		total += st->new_counts[i];
+
 	if (total == 0)
 		return 0;
 
@@ -140,6 +185,11 @@ int branch_type_str(struct branch_type_stat *st, char *bf, int size)
 			printed += count_str_scnprintf(j++, branch_type_name(i), bf + printed, size - printed);
 	}
 
+	for (i = 0; i < PERF_BR_NEW_MAX; i++) {
+		if (st->new_counts[i] > 0)
+			printed += count_str_scnprintf(j++, branch_new_type_name(i), bf + printed, size - printed);
+	}
+
 	if (st->cross_4k > 0)
 		printed += count_str_scnprintf(j++, "CROSS_4K", bf + printed, size - printed);
 
diff --git a/tools/perf/util/branch.h b/tools/perf/util/branch.h
index 17b2ccc61094..8d251b35428a 100644
--- a/tools/perf/util/branch.h
+++ b/tools/perf/util/branch.h
@@ -24,7 +24,8 @@ struct branch_flags {
 			u64 abort:1;
 			u64 cycles:16;
 			u64 type:4;
-			u64 reserved:40;
+			u64 new_type:4;
+			u64 reserved:36;
 		};
 	};
 };
@@ -72,6 +73,7 @@ static inline struct branch_entry *perf_sample__branch_entries(struct perf_sampl
 struct branch_type_stat {
 	bool	branch_to;
 	u64	counts[PERF_BR_MAX];
+	u64	new_counts[PERF_BR_NEW_MAX];
 	u64	cond_fwd;
 	u64	cond_bwd;
 	u64	cross_4k;
@@ -82,6 +84,8 @@ void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,
 		       u64 from, u64 to);
 
 const char *branch_type_name(int type);
+const char *branch_new_type_name(int new_type);
+const char *get_branch_type(struct branch_entry *e);
 void branch_type_stat_display(FILE *fp, struct branch_type_stat *st);
 int branch_type_str(struct branch_type_stat *st, char *bf, int bfsize);
 
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 0aa818977d2b..136fa03364ab 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1178,7 +1178,7 @@ static void branch_stack__printf(struct perf_sample *sample, bool callstack)
 				e->flags.abort ? "A" : " ",
 				e->flags.in_tx ? "T" : " ",
 				(unsigned)e->flags.reserved,
-				e->flags.type ? branch_type_name(e->flags.type) : "");
+				get_branch_type(e));
 		} else {
 			if (i == 0) {
 				printf("..... %2"PRIu64": %016" PRIx64 "\n"
-- 
2.25.1


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

* [PATCH V6 7/8] perf/tools: Add branch privilege information request flag
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
                   ` (5 preceding siblings ...)
  2022-06-10  3:50 ` [PATCH V6 6/8] perf/tools: Extend branch type classification Anshuman Khandual
@ 2022-06-10  3:51 ` Anshuman Khandual
  2022-06-10  3:51 ` [PATCH V6 8/8] perf/tools: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform Anshuman Khandual
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-10  3:51 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Anshuman Khandual, Robin Murphy, Suzuki Poulose, James Clark,
	Ingo Molnar, Mark Rutland, Namhyung Kim, Thomas Gleixner,
	Will Deacon, linux-arm-kernel

This updates the perf tools with branch privilege information request flag
i.e PERF_SAMPLE_BRANCH_PRIV_SAVE that has been added earlier in the kernel.
This also updates 'perf record' documentation, branch_modes[], and generic
branch privilege level enumeration as added earlier in the kernel.

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-perf-users@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
 tools/include/uapi/linux/perf_event.h     | 14 +++++++++++++-
 tools/perf/Documentation/perf-record.txt  |  1 +
 tools/perf/util/branch.h                  |  3 ++-
 tools/perf/util/parse-branch-options.c    |  1 +
 tools/perf/util/perf_event_attr_fprintf.c |  2 +-
 5 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h
index d29280adc3c4..193dba2ecdc1 100644
--- a/tools/include/uapi/linux/perf_event.h
+++ b/tools/include/uapi/linux/perf_event.h
@@ -204,6 +204,8 @@ enum perf_branch_sample_type_shift {
 
 	PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT	= 17, /* save low level index of raw branch records */
 
+	PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT	= 18, /* save privilege mode */
+
 	PERF_SAMPLE_BRANCH_MAX_SHIFT		/* non-ABI */
 };
 
@@ -233,6 +235,8 @@ enum perf_branch_sample_type {
 
 	PERF_SAMPLE_BRANCH_HW_INDEX	= 1U << PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT,
 
+	PERF_SAMPLE_BRANCH_PRIV_SAVE	= 1U << PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT,
+
 	PERF_SAMPLE_BRANCH_MAX		= 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT,
 };
 
@@ -271,6 +275,13 @@ enum {
 	PERF_BR_NEW_MAX,
 };
 
+enum {
+	PERF_BR_PRIV_UNKNOWN	= 0,
+	PERF_BR_PRIV_USER	= 1,
+	PERF_BR_PRIV_KERNEL	= 2,
+	PERF_BR_PRIV_HV		= 3,
+};
+
 #define PERF_SAMPLE_BRANCH_PLM_ALL \
 	(PERF_SAMPLE_BRANCH_USER|\
 	 PERF_SAMPLE_BRANCH_KERNEL|\
@@ -1386,7 +1397,8 @@ struct perf_branch_entry {
 		cycles:16,  /* cycle count to last branch */
 		type:4,     /* branch type */
 		new_type:4, /* additional branch type */
-		reserved:36;
+		priv:3,     /* privilege level */
+		reserved:33;
 };
 
 union perf_sample_weight {
diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index cf8ad50f3de1..addd40114a29 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -387,6 +387,7 @@ following filters are defined:
 	- abort_tx: only when the target is a hardware transaction abort
 	- cond: conditional branches
 	- save_type: save branch type during sampling in case binary is not available later
+	- priv: save privilege state during sampling in case binary is not available later
 
 +
 The option requires at least one branch type among any, any_call, any_ret, ind_call, cond.
diff --git a/tools/perf/util/branch.h b/tools/perf/util/branch.h
index 8d251b35428a..f838b23db180 100644
--- a/tools/perf/util/branch.h
+++ b/tools/perf/util/branch.h
@@ -25,7 +25,8 @@ struct branch_flags {
 			u64 cycles:16;
 			u64 type:4;
 			u64 new_type:4;
-			u64 reserved:36;
+			u64 priv:3;
+			u64 reserved:33;
 		};
 	};
 };
diff --git a/tools/perf/util/parse-branch-options.c b/tools/perf/util/parse-branch-options.c
index bb4aa88c50a8..00588b9db474 100644
--- a/tools/perf/util/parse-branch-options.c
+++ b/tools/perf/util/parse-branch-options.c
@@ -32,6 +32,7 @@ static const struct branch_mode branch_modes[] = {
 	BRANCH_OPT("call", PERF_SAMPLE_BRANCH_CALL),
 	BRANCH_OPT("save_type", PERF_SAMPLE_BRANCH_TYPE_SAVE),
 	BRANCH_OPT("stack", PERF_SAMPLE_BRANCH_CALL_STACK),
+	BRANCH_OPT("priv", PERF_SAMPLE_BRANCH_PRIV_SAVE),
 	BRANCH_END
 };
 
diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c
index 98af3fa4ea35..4b0db27b7199 100644
--- a/tools/perf/util/perf_event_attr_fprintf.c
+++ b/tools/perf/util/perf_event_attr_fprintf.c
@@ -52,7 +52,7 @@ static void __p_branch_sample_type(char *buf, size_t size, u64 value)
 		bit_name(ABORT_TX), bit_name(IN_TX), bit_name(NO_TX),
 		bit_name(COND), bit_name(CALL_STACK), bit_name(IND_JUMP),
 		bit_name(CALL), bit_name(NO_FLAGS), bit_name(NO_CYCLES),
-		bit_name(TYPE_SAVE), bit_name(HW_INDEX),
+		bit_name(TYPE_SAVE), bit_name(HW_INDEX), bit_name(PRIV_SAVE),
 		{ .name = NULL, }
 	};
 #undef bit_name
-- 
2.25.1


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

* [PATCH V6 8/8] perf/tools: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
                   ` (6 preceding siblings ...)
  2022-06-10  3:51 ` [PATCH V6 7/8] perf/tools: Add branch privilege information request flag Anshuman Khandual
@ 2022-06-10  3:51 ` Anshuman Khandual
  2022-06-13  9:06 ` [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-10  3:51 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Anshuman Khandual, Robin Murphy, Suzuki Poulose, James Clark,
	Ingo Molnar, Mark Rutland, Namhyung Kim, Thomas Gleixner,
	Will Deacon, linux-arm-kernel

This updates the perf tool with arch specific branch type classification
used for BRBE on arm64 platform as added in the kernel earlier.

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-perf-users@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
 tools/include/uapi/linux/perf_event.h |  6 ++++++
 tools/perf/util/branch.c              | 13 +++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h
index 193dba2ecdc1..4cf1c8e22cab 100644
--- a/tools/include/uapi/linux/perf_event.h
+++ b/tools/include/uapi/linux/perf_event.h
@@ -282,6 +282,12 @@ enum {
 	PERF_BR_PRIV_HV		= 3,
 };
 
+#define PERF_BR_ARM64_FIQ		PERF_BR_NEW_ARCH_1
+#define PERF_BR_ARM64_DEBUG_HALT	PERF_BR_NEW_ARCH_2
+#define PERF_BR_ARM64_DEBUG_EXIT	PERF_BR_NEW_ARCH_3
+#define PERF_BR_ARM64_DEBUG_INST	PERF_BR_NEW_ARCH_4
+#define PERF_BR_ARM64_DEBUG_DATA	PERF_BR_NEW_ARCH_5
+
 #define PERF_SAMPLE_BRANCH_PLM_ALL \
 	(PERF_SAMPLE_BRANCH_USER|\
 	 PERF_SAMPLE_BRANCH_KERNEL|\
diff --git a/tools/perf/util/branch.c b/tools/perf/util/branch.c
index 6d962b0a4532..d40776c44b06 100644
--- a/tools/perf/util/branch.c
+++ b/tools/perf/util/branch.c
@@ -45,11 +45,24 @@ const char *branch_new_type_name(int new_type)
 		"FAULT_ALGN",
 		"FAULT_DATA",
 		"FAULT_INST",
+/*
+ * TODO: This switch should happen on 'session->header.env.arch'
+ * instead, because an arm64 platform perf recording could be
+ * opened for analysis on other platforms as well.
+ */
+#ifdef __aarch64__
+		"ARM64_FIQ",
+		"ARM64_DEBUG_HALT",
+		"ARM64_DEBUG_EXIT",
+		"ARM64_DEBUG_INST",
+		"ARM64_DEBUG_DATA"
+#else
 		"ARCH_1",
 		"ARCH_2",
 		"ARCH_3",
 		"ARCH_4",
 		"ARCH_5"
+#endif
 	};
 
 	if (new_type >= 0 && new_type < PERF_BR_NEW_MAX)
-- 
2.25.1


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

* Re: [PATCH V6 0/8] perf: Expand perf_branch_entry
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
                   ` (7 preceding siblings ...)
  2022-06-10  3:51 ` [PATCH V6 8/8] perf/tools: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform Anshuman Khandual
@ 2022-06-13  9:06 ` Anshuman Khandual
  2022-06-29  4:44 ` Anshuman Khandual
  2022-07-13  5:40 ` Anshuman Khandual
  10 siblings, 0 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-13  9:06 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Robin Murphy, Suzuki Poulose, James Clark, Ingo Molnar,
	Mark Rutland, Namhyung Kim, Thomas Gleixner, Will Deacon,
	linux-arm-kernel



On 6/10/22 09:20, Anshuman Khandual wrote:
> Branch Record Buffer Extension (BRBE) implementation on arm64 captures more
> branch type classification which cannot be accommodated in the current perf
> branch record format via perf_branch_entry.type element (4 bit field). Also
> it captures privilege information which does not have a corresponding slot
> in perf_branch_entry. This series expands struct perf_branch_entry, to meet
> both these requirements without breaking the existing user space ABI for
> perf tools.
> 
> All architecture specific branch types added via perf_branch_entry.new_type
> field in [PATCH 3/4] will be used in BRBE implementation on arm64 platform
> later on with the following map.
> 
> #ifdef CONFIG_ARM64
> #define PERF_BR_FIQ		PERF_BR_NEW_ARCH_1
> #define PERF_BR_DEBUG_HALT	PERF_BR_NEW_ARCH_2
> #define PERF_BR_DEBUG_EXIT	PERF_BR_NEW_ARCH_3
> #define PERF_BR_DEBUG_INST	PERF_BR_NEW_ARCH_4
> #define PERF_BR_DEBUG_DATA	PERF_BR_NEW_ARCH_5
> #endif
> 
> This series applies on v5.19-rc1
> 
> perf API
> 
> The series being applied
> 
> - Clean : tools/perf/check-headers.sh
> - Clean : diff -u tools/include/uapi/linux/perf_event.h include/uapi/linux/perf_event.h
> 
> References
> 
> - BRBE captured branch record information
> 
> https://developer.arm.com/documentation/ddi0601/2021-12/AArch64-Registers/BRBINF-n--EL1--Branch-Record-Buffer-Information-Register--n-?lang=en
> 
> - BRBE based perf branch stack implementation on arm64 platform
> 
> https://lore.kernel.org/all/1642998653-21377-1-git-send-email-anshuman.khandual@arm.com/
> 
> Changes in V6:
> 
> - Process PERF_BR_EXTEND_ABI in perf tools and fetch from perf_branch_entry.new_type
> - Modified the commit message for [PATCH 1/8]
> 
> Changes in V5:
> 
> https://lore.kernel.org/linux-arm-kernel/20220404045046.634522-1-anshuman.khandual@arm.com/
> 
> - Dropped patches [PATCH 1/10] and [PATCH 6/10] related to PERF_BR_[RET|IRQ] - merged
>   via the commit cedd3614e5d9c809 ("perf: Add irq and exception return branch types")
> 
> - Rebased series on v5.18-rc1
> 
> Changes in V4:
> 
> https://lore.kernel.org/all/20220315053516.431515-1-anshuman.khandual@arm.com/
> 
> - Modified the struct branch_flags as required
> - Dropped CONFIG_ARM64 from perf header file to avoid build problem
> - Renamed PERF_BR_NEW_<BRANCH_TYPE> as PERF_BR_ARM64_<BRANCH_TYPE>
> 
> Changes in V3:
> 
> https://lore.kernel.org/all/20220314055857.125421-1-anshuman.khandual@arm.com/
> 
> - Fixed small typo s/privillege/privilege in include/uapi/linux/perf_event.h
> - Added PRIV_SHIFT in __p_branch_sample_type()
> - Added arm64 platform override of the new arch specific branch types
> - Renamed s/PERF_BR_XXX/PERF_BR_PRIV_XXX/ for privilege level branch types
> - Added PERF_BR_PRIV_UNKNOWN as the starting value
> - Expanded perf_branch_entry.priv into a 3 bits field 
> 
> Changes in V2:
> 
> https://lore.kernel.org/all/20220309033642.144769-1-anshuman.khandual@arm.com/
> 
> Cc: Robin Murphy <robin.murphy@arm.com> 
> Cc: Suzuki Poulose <suzuki.poulose@arm.com>
> Cc: James Clark <james.clark@arm.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> Cc: Mark Rutland <mark.rutland@arm.com>
> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Cc: Jiri Olsa <jolsa@redhat.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Will Deacon <will@kernel.org>
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-perf-users@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> 
> Anshuman Khandual (8):
>   perf: Add system error and not in transaction branch types
>   perf: Extend branch type classification
>   perf: Capture branch privilege information
>   perf: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform
>   perf/tools: Add system error and not in transaction branch types
>   perf/tools: Extend branch type classification
>   perf/tools: Add branch privilege information request flag
>   perf/tools: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform

I forgot to collect all the "Reviewed-by" tags from James Clark on some
patches (1, 2, 4, 5). Will add them next time around.

- Anshuman

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

* Re: [PATCH V6 6/8] perf/tools: Extend branch type classification
  2022-06-10  3:50 ` [PATCH V6 6/8] perf/tools: Extend branch type classification Anshuman Khandual
@ 2022-06-14 16:53   ` German Gomez
  2022-06-15  3:21     ` Anshuman Khandual
  0 siblings, 1 reply; 15+ messages in thread
From: German Gomez @ 2022-06-14 16:53 UTC (permalink / raw)
  To: Anshuman Khandual, linux-kernel, linux-perf-users, peterz,
	alexander.shishkin, jolsa, acme
  Cc: Robin Murphy, Suzuki Poulose, James Clark, Ingo Molnar,
	Mark Rutland, Namhyung Kim, Thomas Gleixner, Will Deacon,
	linux-arm-kernel

Hi Anshuman,

On 10/06/2022 04:50, Anshuman Khandual wrote:
> This updates the perf tool with generic branch type classification with new
> ABI extender place holder i.e PERF_BR_EXTEND_ABI, the new 4 bit branch type
> field i.e perf_branch_entry.new_type, new generic page fault related branch
> types and some arch specific branch types as added earlier in the kernel.
>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> Cc: Mark Rutland <mark.rutland@arm.com>
> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Cc: Jiri Olsa <jolsa@redhat.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Will Deacon <will@kernel.org>
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-perf-users@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
> ---
>  tools/include/uapi/linux/perf_event.h | 16 ++++++++-
>  tools/perf/builtin-script.c           |  2 +-
>  tools/perf/util/branch.c              | 52 ++++++++++++++++++++++++++-
>  tools/perf/util/branch.h              |  6 +++-
>  tools/perf/util/session.c             |  2 +-
>  5 files changed, 73 insertions(+), 5 deletions(-)
>
> diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h
> index 26d8f0b5ac0d..d29280adc3c4 100644
> --- a/tools/include/uapi/linux/perf_event.h
> +++ b/tools/include/uapi/linux/perf_event.h
> @@ -255,9 +255,22 @@ enum {
>  	PERF_BR_IRQ		= 12,	/* irq */
>  	PERF_BR_SERROR		= 13,	/* system error */
>  	PERF_BR_NO_TX		= 14,	/* not in transaction */
> +	PERF_BR_EXTEND_ABI	= 15,	/* extend ABI */
>  	PERF_BR_MAX,
>  };
>  
> +enum {
> +	PERF_BR_NEW_FAULT_ALGN		= 0,    /* Alignment fault */
> +	PERF_BR_NEW_FAULT_DATA		= 1,    /* Data fault */
> +	PERF_BR_NEW_FAULT_INST		= 2,    /* Inst fault */
> +	PERF_BR_NEW_ARCH_1		= 3,    /* Architecture specific */
> +	PERF_BR_NEW_ARCH_2		= 4,    /* Architecture specific */
> +	PERF_BR_NEW_ARCH_3		= 5,    /* Architecture specific */
> +	PERF_BR_NEW_ARCH_4		= 6,    /* Architecture specific */
> +	PERF_BR_NEW_ARCH_5		= 7,    /* Architecture specific */
> +	PERF_BR_NEW_MAX,
> +};
> +
>  #define PERF_SAMPLE_BRANCH_PLM_ALL \
>  	(PERF_SAMPLE_BRANCH_USER|\
>  	 PERF_SAMPLE_BRANCH_KERNEL|\
> @@ -1372,7 +1385,8 @@ struct perf_branch_entry {
>  		abort:1,    /* transaction abort */
>  		cycles:16,  /* cycle count to last branch */
>  		type:4,     /* branch type */
> -		reserved:40;
> +		new_type:4, /* additional branch type */
> +		reserved:36;
>  };
>  
>  union perf_sample_weight {
> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> index c689054002cc..d4d581230f23 100644
> --- a/tools/perf/builtin-script.c
> +++ b/tools/perf/builtin-script.c
> @@ -866,7 +866,7 @@ static int print_bstack_flags(FILE *fp, struct branch_entry *br)
>  		       br->flags.in_tx ? 'X' : '-',
>  		       br->flags.abort ? 'A' : '-',
>  		       br->flags.cycles,
> -		       br->flags.type ? branch_type_name(br->flags.type) : "-");
> +		       get_branch_type(br));

(Small comment below regarding this line)

>  }
>  
>  static int perf_sample__fprintf_brstack(struct perf_sample *sample,
> diff --git a/tools/perf/util/branch.c b/tools/perf/util/branch.c
> index abc673347bee..6d962b0a4532 100644
> --- a/tools/perf/util/branch.c
> +++ b/tools/perf/util/branch.c
> @@ -21,7 +21,10 @@ void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,
>  	if (flags->type == PERF_BR_UNKNOWN || from == 0)
>  		return;
>  
> -	st->counts[flags->type]++;
> +	if (flags->type == PERF_BR_EXTEND_ABI)
> +		st->new_counts[flags->new_type]++;
> +	else
> +		st->counts[flags->type]++;
>  
>  	if (flags->type == PERF_BR_COND) {
>  		if (to > from)
> @@ -36,6 +39,25 @@ void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,
>  		st->cross_4k++;
>  }
>  
> +const char *branch_new_type_name(int new_type)
> +{
> +	const char *branch_new_names[PERF_BR_NEW_MAX] = {
> +		"FAULT_ALGN",
> +		"FAULT_DATA",
> +		"FAULT_INST",
> +		"ARCH_1",
> +		"ARCH_2",
> +		"ARCH_3",
> +		"ARCH_4",
> +		"ARCH_5"
> +	};
> +
> +	if (new_type >= 0 && new_type < PERF_BR_NEW_MAX)
> +		return branch_new_names[new_type];
> +
> +	return NULL;
> +}
> +
>  const char *branch_type_name(int type)
>  {
>  	const char *branch_names[PERF_BR_MAX] = {
> @@ -62,6 +84,17 @@ const char *branch_type_name(int type)
>  	return NULL;
>  }
>  
> +const char *get_branch_type(struct branch_entry *e)
> +{
> +	if (e->flags.type == PERF_BR_UNKNOWN)
> +		return "";

There is a small change of behavior in "perf script --field brstack".
Unknown branches were printed as "-" before but now it's an empty
string.

> +
> +	if (e->flags.type == PERF_BR_EXTEND_ABI)
> +		return branch_new_type_name(e->flags.new_type);
> +
> +	return branch_type_name(e->flags.type);
> +}
> +
>  void branch_type_stat_display(FILE *fp, struct branch_type_stat *st)
>  {
>  	u64 total = 0;
> @@ -108,6 +141,15 @@ void branch_type_stat_display(FILE *fp, struct branch_type_stat *st)
>  				100.0 *
>  				(double)st->counts[i] / (double)total);
>  	}
> +
> +	for (i = 0; i < PERF_BR_NEW_MAX; i++) {
> +		if (st->new_counts[i] > 0)
> +			fprintf(fp, "\n%8s: %5.1f%%",
> +				branch_new_type_name(i),
> +				100.0 *
> +				(double)st->new_counts[i] / (double)total);
> +	}
> +
>  }
>  
>  static int count_str_scnprintf(int idx, const char *str, char *bf, int size)
> @@ -123,6 +165,9 @@ int branch_type_str(struct branch_type_stat *st, char *bf, int size)
>  	for (i = 0; i < PERF_BR_MAX; i++)
>  		total += st->counts[i];
>  
> +	for (i = 0; i < PERF_BR_NEW_MAX; i++)
> +		total += st->new_counts[i];
> +
>  	if (total == 0)
>  		return 0;
>  
> @@ -140,6 +185,11 @@ int branch_type_str(struct branch_type_stat *st, char *bf, int size)
>  			printed += count_str_scnprintf(j++, branch_type_name(i), bf + printed, size - printed);
>  	}
>  
> +	for (i = 0; i < PERF_BR_NEW_MAX; i++) {
> +		if (st->new_counts[i] > 0)
> +			printed += count_str_scnprintf(j++, branch_new_type_name(i), bf + printed, size - printed);
> +	}
> +
>  	if (st->cross_4k > 0)
>  		printed += count_str_scnprintf(j++, "CROSS_4K", bf + printed, size - printed);
>  
> diff --git a/tools/perf/util/branch.h b/tools/perf/util/branch.h
> index 17b2ccc61094..8d251b35428a 100644
> --- a/tools/perf/util/branch.h
> +++ b/tools/perf/util/branch.h
> @@ -24,7 +24,8 @@ struct branch_flags {
>  			u64 abort:1;
>  			u64 cycles:16;
>  			u64 type:4;
> -			u64 reserved:40;
> +			u64 new_type:4;
> +			u64 reserved:36;
>  		};
>  	};
>  };
> @@ -72,6 +73,7 @@ static inline struct branch_entry *perf_sample__branch_entries(struct perf_sampl
>  struct branch_type_stat {
>  	bool	branch_to;
>  	u64	counts[PERF_BR_MAX];
> +	u64	new_counts[PERF_BR_NEW_MAX];
>  	u64	cond_fwd;
>  	u64	cond_bwd;
>  	u64	cross_4k;
> @@ -82,6 +84,8 @@ void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,
>  		       u64 from, u64 to);
>  
>  const char *branch_type_name(int type);
> +const char *branch_new_type_name(int new_type);
> +const char *get_branch_type(struct branch_entry *e);
>  void branch_type_stat_display(FILE *fp, struct branch_type_stat *st);
>  int branch_type_str(struct branch_type_stat *st, char *bf, int bfsize);
>  
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 0aa818977d2b..136fa03364ab 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -1178,7 +1178,7 @@ static void branch_stack__printf(struct perf_sample *sample, bool callstack)
>  				e->flags.abort ? "A" : " ",
>  				e->flags.in_tx ? "T" : " ",
>  				(unsigned)e->flags.reserved,
> -				e->flags.type ? branch_type_name(e->flags.type) : "");
> +				get_branch_type(e));
>  		} else {
>  			if (i == 0) {
>  				printf("..... %2"PRIu64": %016" PRIx64 "\n"

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

* Re: [PATCH V6 6/8] perf/tools: Extend branch type classification
  2022-06-14 16:53   ` German Gomez
@ 2022-06-15  3:21     ` Anshuman Khandual
  2022-06-15 13:39       ` German Gomez
  0 siblings, 1 reply; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-15  3:21 UTC (permalink / raw)
  To: German Gomez, linux-kernel, linux-perf-users, peterz,
	alexander.shishkin, jolsa, acme
  Cc: Robin Murphy, Suzuki Poulose, James Clark, Ingo Molnar,
	Mark Rutland, Namhyung Kim, Thomas Gleixner, Will Deacon,
	linux-arm-kernel



On 6/14/22 22:23, German Gomez wrote:
> Hi Anshuman,
> 
> On 10/06/2022 04:50, Anshuman Khandual wrote:
>> This updates the perf tool with generic branch type classification with new
>> ABI extender place holder i.e PERF_BR_EXTEND_ABI, the new 4 bit branch type
>> field i.e perf_branch_entry.new_type, new generic page fault related branch
>> types and some arch specific branch types as added earlier in the kernel.
>>
>> Cc: Peter Zijlstra <peterz@infradead.org>
>> Cc: Ingo Molnar <mingo@redhat.com>
>> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
>> Cc: Mark Rutland <mark.rutland@arm.com>
>> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
>> Cc: Jiri Olsa <jolsa@redhat.com>
>> Cc: Namhyung Kim <namhyung@kernel.org>
>> Cc: Thomas Gleixner <tglx@linutronix.de>
>> Cc: Will Deacon <will@kernel.org>
>> Cc: linux-arm-kernel@lists.infradead.org
>> Cc: linux-perf-users@vger.kernel.org
>> Cc: linux-kernel@vger.kernel.org
>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
>> ---
>>  tools/include/uapi/linux/perf_event.h | 16 ++++++++-
>>  tools/perf/builtin-script.c           |  2 +-
>>  tools/perf/util/branch.c              | 52 ++++++++++++++++++++++++++-
>>  tools/perf/util/branch.h              |  6 +++-
>>  tools/perf/util/session.c             |  2 +-
>>  5 files changed, 73 insertions(+), 5 deletions(-)
>>
>> diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h
>> index 26d8f0b5ac0d..d29280adc3c4 100644
>> --- a/tools/include/uapi/linux/perf_event.h
>> +++ b/tools/include/uapi/linux/perf_event.h
>> @@ -255,9 +255,22 @@ enum {
>>  	PERF_BR_IRQ		= 12,	/* irq */
>>  	PERF_BR_SERROR		= 13,	/* system error */
>>  	PERF_BR_NO_TX		= 14,	/* not in transaction */
>> +	PERF_BR_EXTEND_ABI	= 15,	/* extend ABI */
>>  	PERF_BR_MAX,
>>  };
>>  
>> +enum {
>> +	PERF_BR_NEW_FAULT_ALGN		= 0,    /* Alignment fault */
>> +	PERF_BR_NEW_FAULT_DATA		= 1,    /* Data fault */
>> +	PERF_BR_NEW_FAULT_INST		= 2,    /* Inst fault */
>> +	PERF_BR_NEW_ARCH_1		= 3,    /* Architecture specific */
>> +	PERF_BR_NEW_ARCH_2		= 4,    /* Architecture specific */
>> +	PERF_BR_NEW_ARCH_3		= 5,    /* Architecture specific */
>> +	PERF_BR_NEW_ARCH_4		= 6,    /* Architecture specific */
>> +	PERF_BR_NEW_ARCH_5		= 7,    /* Architecture specific */
>> +	PERF_BR_NEW_MAX,
>> +};
>> +
>>  #define PERF_SAMPLE_BRANCH_PLM_ALL \
>>  	(PERF_SAMPLE_BRANCH_USER|\
>>  	 PERF_SAMPLE_BRANCH_KERNEL|\
>> @@ -1372,7 +1385,8 @@ struct perf_branch_entry {
>>  		abort:1,    /* transaction abort */
>>  		cycles:16,  /* cycle count to last branch */
>>  		type:4,     /* branch type */
>> -		reserved:40;
>> +		new_type:4, /* additional branch type */
>> +		reserved:36;
>>  };
>>  
>>  union perf_sample_weight {
>> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
>> index c689054002cc..d4d581230f23 100644
>> --- a/tools/perf/builtin-script.c
>> +++ b/tools/perf/builtin-script.c
>> @@ -866,7 +866,7 @@ static int print_bstack_flags(FILE *fp, struct branch_entry *br)
>>  		       br->flags.in_tx ? 'X' : '-',
>>  		       br->flags.abort ? 'A' : '-',
>>  		       br->flags.cycles,
>> -		       br->flags.type ? branch_type_name(br->flags.type) : "-");
>> +		       get_branch_type(br));
> (Small comment below regarding this line)
> 
>>  }
>>  
>>  static int perf_sample__fprintf_brstack(struct perf_sample *sample,
>> diff --git a/tools/perf/util/branch.c b/tools/perf/util/branch.c
>> index abc673347bee..6d962b0a4532 100644
>> --- a/tools/perf/util/branch.c
>> +++ b/tools/perf/util/branch.c
>> @@ -21,7 +21,10 @@ void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,
>>  	if (flags->type == PERF_BR_UNKNOWN || from == 0)
>>  		return;
>>  
>> -	st->counts[flags->type]++;
>> +	if (flags->type == PERF_BR_EXTEND_ABI)
>> +		st->new_counts[flags->new_type]++;
>> +	else
>> +		st->counts[flags->type]++;
>>  
>>  	if (flags->type == PERF_BR_COND) {
>>  		if (to > from)
>> @@ -36,6 +39,25 @@ void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags,
>>  		st->cross_4k++;
>>  }
>>  
>> +const char *branch_new_type_name(int new_type)
>> +{
>> +	const char *branch_new_names[PERF_BR_NEW_MAX] = {
>> +		"FAULT_ALGN",
>> +		"FAULT_DATA",
>> +		"FAULT_INST",
>> +		"ARCH_1",
>> +		"ARCH_2",
>> +		"ARCH_3",
>> +		"ARCH_4",
>> +		"ARCH_5"
>> +	};
>> +
>> +	if (new_type >= 0 && new_type < PERF_BR_NEW_MAX)
>> +		return branch_new_names[new_type];
>> +
>> +	return NULL;
>> +}
>> +
>>  const char *branch_type_name(int type)
>>  {
>>  	const char *branch_names[PERF_BR_MAX] = {
>> @@ -62,6 +84,17 @@ const char *branch_type_name(int type)
>>  	return NULL;
>>  }
>>  
>> +const char *get_branch_type(struct branch_entry *e)
>> +{
>> +	if (e->flags.type == PERF_BR_UNKNOWN)
>> +		return "";
> There is a small change of behavior in "perf script --field brstack".
> Unknown branches were printed as "-" before but now it's an empty
> string.

get_branch_type() replaces print output in two different functions.
branch_stack__printf() used to print a space " " for PERF_BR_UNKNOWN,
and print_bstack_flags() used to print a "-" for PERF_BR_UNKNOWN.
When they are factorized via get_branch_type(), one of those print
formats need to be choosen.

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

* Re: [PATCH V6 6/8] perf/tools: Extend branch type classification
  2022-06-15  3:21     ` Anshuman Khandual
@ 2022-06-15 13:39       ` German Gomez
  0 siblings, 0 replies; 15+ messages in thread
From: German Gomez @ 2022-06-15 13:39 UTC (permalink / raw)
  To: Anshuman Khandual, linux-kernel, linux-perf-users, peterz,
	alexander.shishkin, jolsa, acme
  Cc: Robin Murphy, Suzuki Poulose, James Clark, Ingo Molnar,
	Mark Rutland, Namhyung Kim, Thomas Gleixner, Will Deacon,
	linux-arm-kernel


On 15/06/2022 04:21, Anshuman Khandual wrote:
> [...]
>  
> +const char *get_branch_type(struct branch_entry *e)
> +{
> +	if (e->flags.type == PERF_BR_UNKNOWN)
> +		return "";
>> There is a small change of behavior in "perf script --field brstack".
>> Unknown branches were printed as "-" before but now it's an empty
>> string.
> get_branch_type() replaces print output in two different functions.
> branch_stack__printf() used to print a space " " for PERF_BR_UNKNOWN,
> and print_bstack_flags() used to print a "-" for PERF_BR_UNKNOWN.
> When they are factorized via get_branch_type(), one of those print
> formats need to be choosen.

Thanks for clarifying, Anshuman. I only bring it up in case somebody is
parsing this line for their use case. While running on x86 I came across
some UNKNOWN branches during my runs.

I have updated and sent a generic branch stack sampling perf test that
supports both ("-" and empty string) just in case. Hope it's useful.

https://lore.kernel.org/all/20220615130901.1151397-1-german.gomez@arm.com/

Thanks,
German

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

* Re: [PATCH V6 0/8] perf: Expand perf_branch_entry
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
                   ` (8 preceding siblings ...)
  2022-06-13  9:06 ` [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
@ 2022-06-29  4:44 ` Anshuman Khandual
  2022-07-13  5:40 ` Anshuman Khandual
  10 siblings, 0 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-06-29  4:44 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Robin Murphy, Suzuki Poulose, James Clark, Ingo Molnar,
	Mark Rutland, Namhyung Kim, Thomas Gleixner, Will Deacon,
	linux-arm-kernel



On 6/10/22 09:20, Anshuman Khandual wrote:
> Branch Record Buffer Extension (BRBE) implementation on arm64 captures more
> branch type classification which cannot be accommodated in the current perf
> branch record format via perf_branch_entry.type element (4 bit field). Also
> it captures privilege information which does not have a corresponding slot
> in perf_branch_entry. This series expands struct perf_branch_entry, to meet
> both these requirements without breaking the existing user space ABI for
> perf tools.
> 
> All architecture specific branch types added via perf_branch_entry.new_type
> field in [PATCH 3/4] will be used in BRBE implementation on arm64 platform
> later on with the following map.
> 
> #ifdef CONFIG_ARM64
> #define PERF_BR_FIQ		PERF_BR_NEW_ARCH_1
> #define PERF_BR_DEBUG_HALT	PERF_BR_NEW_ARCH_2
> #define PERF_BR_DEBUG_EXIT	PERF_BR_NEW_ARCH_3
> #define PERF_BR_DEBUG_INST	PERF_BR_NEW_ARCH_4
> #define PERF_BR_DEBUG_DATA	PERF_BR_NEW_ARCH_5
> #endif
> 
> This series applies on v5.19-rc1
> 
> perf API
> 
> The series being applied
> 
> - Clean : tools/perf/check-headers.sh
> - Clean : diff -u tools/include/uapi/linux/perf_event.h include/uapi/linux/perf_event.h
> 
> References
> 
> - BRBE captured branch record information
> 
> https://developer.arm.com/documentation/ddi0601/2021-12/AArch64-Registers/BRBINF-n--EL1--Branch-Record-Buffer-Information-Register--n-?lang=en
> 
> - BRBE based perf branch stack implementation on arm64 platform
> 
> https://lore.kernel.org/all/1642998653-21377-1-git-send-email-anshuman.khandual@arm.com/
> 
> Changes in V6:
> 
> - Process PERF_BR_EXTEND_ABI in perf tools and fetch from perf_branch_entry.new_type
> - Modified the commit message for [PATCH 1/8]

Any updates on this series ?

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

* Re: [PATCH V6 0/8] perf: Expand perf_branch_entry
  2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
                   ` (9 preceding siblings ...)
  2022-06-29  4:44 ` Anshuman Khandual
@ 2022-07-13  5:40 ` Anshuman Khandual
  10 siblings, 0 replies; 15+ messages in thread
From: Anshuman Khandual @ 2022-07-13  5:40 UTC (permalink / raw)
  To: linux-kernel, linux-perf-users, peterz, alexander.shishkin, jolsa, acme
  Cc: Robin Murphy, Suzuki Poulose, James Clark, Ingo Molnar,
	Mark Rutland, Namhyung Kim, Thomas Gleixner, Will Deacon,
	linux-arm-kernel



On 6/10/22 09:20, Anshuman Khandual wrote:
> Branch Record Buffer Extension (BRBE) implementation on arm64 captures more
> branch type classification which cannot be accommodated in the current perf
> branch record format via perf_branch_entry.type element (4 bit field). Also
> it captures privilege information which does not have a corresponding slot
> in perf_branch_entry. This series expands struct perf_branch_entry, to meet
> both these requirements without breaking the existing user space ABI for
> perf tools.
> 
> All architecture specific branch types added via perf_branch_entry.new_type
> field in [PATCH 3/4] will be used in BRBE implementation on arm64 platform
> later on with the following map.
> 
> #ifdef CONFIG_ARM64
> #define PERF_BR_FIQ		PERF_BR_NEW_ARCH_1
> #define PERF_BR_DEBUG_HALT	PERF_BR_NEW_ARCH_2
> #define PERF_BR_DEBUG_EXIT	PERF_BR_NEW_ARCH_3
> #define PERF_BR_DEBUG_INST	PERF_BR_NEW_ARCH_4
> #define PERF_BR_DEBUG_DATA	PERF_BR_NEW_ARCH_5
> #endif
> 
> This series applies on v5.19-rc1
> 
> perf API
> 
> The series being applied
> 
> - Clean : tools/perf/check-headers.sh
> - Clean : diff -u tools/include/uapi/linux/perf_event.h include/uapi/linux/perf_event.h
> 
> References
> 
> - BRBE captured branch record information
> 
> https://developer.arm.com/documentation/ddi0601/2021-12/AArch64-Registers/BRBINF-n--EL1--Branch-Record-Buffer-Information-Register--n-?lang=en
> 
> - BRBE based perf branch stack implementation on arm64 platform
> 
> https://lore.kernel.org/all/1642998653-21377-1-git-send-email-anshuman.khandual@arm.com/
> 
> Changes in V6:
> 
> - Process PERF_BR_EXTEND_ABI in perf tools and fetch from perf_branch_entry.new_type
> - Modified the commit message for [PATCH 1/8]

Any updates on this series ?

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

end of thread, other threads:[~2022-07-13  5:42 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-10  3:50 [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
2022-06-10  3:50 ` [PATCH V6 1/8] perf: Add system error and not in transaction branch types Anshuman Khandual
2022-06-10  3:50 ` [PATCH V6 2/8] perf: Extend branch type classification Anshuman Khandual
2022-06-10  3:50 ` [PATCH V6 3/8] perf: Capture branch privilege information Anshuman Khandual
2022-06-10  3:50 ` [PATCH V6 4/8] perf: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform Anshuman Khandual
2022-06-10  3:50 ` [PATCH V6 5/8] perf/tools: Add system error and not in transaction branch types Anshuman Khandual
2022-06-10  3:50 ` [PATCH V6 6/8] perf/tools: Extend branch type classification Anshuman Khandual
2022-06-14 16:53   ` German Gomez
2022-06-15  3:21     ` Anshuman Khandual
2022-06-15 13:39       ` German Gomez
2022-06-10  3:51 ` [PATCH V6 7/8] perf/tools: Add branch privilege information request flag Anshuman Khandual
2022-06-10  3:51 ` [PATCH V6 8/8] perf/tools: Add PERF_BR_NEW_ARCH_[N] map for BRBE on arm64 platform Anshuman Khandual
2022-06-13  9:06 ` [PATCH V6 0/8] perf: Expand perf_branch_entry Anshuman Khandual
2022-06-29  4:44 ` Anshuman Khandual
2022-07-13  5:40 ` Anshuman Khandual

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).