Message ID | 1594996707-3727-13-git-send-email-atrajeev@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | powerpc/perf: Add support for power10 PMU Hardware | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch powerpc/merge (c27fe454aff795023d2f3f90f41eb1a3104e614f) |
snowpatch_ozlabs/checkpatch | warning | total: 0 errors, 2 warnings, 0 checks, 126 lines checked |
snowpatch_ozlabs/needsstable | success | Patch has no Fixes tags |
Hi Athira, Thank you for the patch! Yet something to improve: [auto build test ERROR on powerpc/next] [also build test ERROR on tip/perf/core v5.8-rc5 next-20200717] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Athira-Rajeev/powerpc-perf-Add-support-for-power10-PMU-Hardware/20200717-224353 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next config: powerpc64-randconfig-r024-20200719 (attached as .config) compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project ed6b578040a85977026c93bf4188f996148f3218) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install powerpc64 cross compiling tool for clang build # apt-get install binutils-powerpc64-linux-gnu # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=powerpc64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): arch/powerpc/include/asm/io-defs.h:45:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] DEF_PCI_AC_NORET(insw, (unsigned long p, void *b, unsigned long c), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET' __do_##name al; \ ^~~~~~~~~~~~~~ <scratch space>:221:1: note: expanded from here __do_insw ^ arch/powerpc/include/asm/io.h:542:56: note: expanded from macro '__do_insw' #define __do_insw(p, b, n) readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n)) ~~~~~~~~~~~~~~~~~~~~~^ In file included from arch/powerpc/perf/perf_regs.c:10: In file included from include/linux/perf_event.h:57: In file included from include/linux/cgroup.h:26: In file included from include/linux/kernel_stat.h:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:10: In file included from arch/powerpc/include/asm/hardirq.h:6: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/powerpc/include/asm/io.h:604: arch/powerpc/include/asm/io-defs.h:47:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] DEF_PCI_AC_NORET(insl, (unsigned long p, void *b, unsigned long c), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET' __do_##name al; \ ^~~~~~~~~~~~~~ <scratch space>:223:1: note: expanded from here __do_insl ^ arch/powerpc/include/asm/io.h:543:56: note: expanded from macro '__do_insl' #define __do_insl(p, b, n) readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n)) ~~~~~~~~~~~~~~~~~~~~~^ In file included from arch/powerpc/perf/perf_regs.c:10: In file included from include/linux/perf_event.h:57: In file included from include/linux/cgroup.h:26: In file included from include/linux/kernel_stat.h:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:10: In file included from arch/powerpc/include/asm/hardirq.h:6: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/powerpc/include/asm/io.h:604: arch/powerpc/include/asm/io-defs.h:49:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] DEF_PCI_AC_NORET(outsb, (unsigned long p, const void *b, unsigned long c), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET' __do_##name al; \ ^~~~~~~~~~~~~~ <scratch space>:225:1: note: expanded from here __do_outsb ^ arch/powerpc/include/asm/io.h:544:58: note: expanded from macro '__do_outsb' #define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n)) ~~~~~~~~~~~~~~~~~~~~~^ In file included from arch/powerpc/perf/perf_regs.c:10: In file included from include/linux/perf_event.h:57: In file included from include/linux/cgroup.h:26: In file included from include/linux/kernel_stat.h:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:10: In file included from arch/powerpc/include/asm/hardirq.h:6: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/powerpc/include/asm/io.h:604: arch/powerpc/include/asm/io-defs.h:51:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] DEF_PCI_AC_NORET(outsw, (unsigned long p, const void *b, unsigned long c), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET' __do_##name al; \ ^~~~~~~~~~~~~~ <scratch space>:227:1: note: expanded from here __do_outsw ^ arch/powerpc/include/asm/io.h:545:58: note: expanded from macro '__do_outsw' #define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n)) ~~~~~~~~~~~~~~~~~~~~~^ In file included from arch/powerpc/perf/perf_regs.c:10: In file included from include/linux/perf_event.h:57: In file included from include/linux/cgroup.h:26: In file included from include/linux/kernel_stat.h:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:10: In file included from arch/powerpc/include/asm/hardirq.h:6: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/powerpc/include/asm/io.h:604: arch/powerpc/include/asm/io-defs.h:53:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] DEF_PCI_AC_NORET(outsl, (unsigned long p, const void *b, unsigned long c), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET' __do_##name al; \ ^~~~~~~~~~~~~~ <scratch space>:229:1: note: expanded from here __do_outsl ^ arch/powerpc/include/asm/io.h:546:58: note: expanded from macro '__do_outsl' #define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n)) ~~~~~~~~~~~~~~~~~~~~~^ >> arch/powerpc/perf/perf_regs.c:16:5: error: expected identifier or '(' u64 PERF_REG_EXTENDED_MASK; ^ include/linux/perf_regs.h:16:32: note: expanded from macro 'PERF_REG_EXTENDED_MASK' #define PERF_REG_EXTENDED_MASK 0 ^ 12 warnings and 1 error generated. vim +16 arch/powerpc/perf/perf_regs.c 15 > 16 u64 PERF_REG_EXTENDED_MASK; 17 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
> On 19-Jul-2020, at 4:47 PM, kernel test robot <lkp@intel.com> wrote: > > Hi Athira, > > Thank you for the patch! Yet something to improve: > > [auto build test ERROR on powerpc/next] > [also build test ERROR on tip/perf/core v5.8-rc5 next-20200717] > [If your patch is applied to the wrong git tree, kindly drop us a note. > And when submitting patch, we suggest to use '--base' as documented in > https://git-scm.com/docs/git-format-patch] > > url: https://github.com/0day-ci/linux/commits/Athira-Rajeev/powerpc-perf-Add-support-for-power10-PMU-Hardware/20200717-224353 > base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next > config: powerpc64-randconfig-r024-20200719 (attached as .config) > compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project ed6b578040a85977026c93bf4188f996148f3218) > reproduce (this is a W=1 build): > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > # install powerpc64 cross compiling tool for clang build > # apt-get install binutils-powerpc64-linux-gnu > # save the attached .config to linux build tree > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=powerpc64 > > If you fix the issue, kindly add following tag as appropriate > Reported-by: kernel test robot <lkp@intel.com> > > All errors (new ones prefixed by >>): > > arch/powerpc/include/asm/io-defs.h:45:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > DEF_PCI_AC_NORET(insw, (unsigned long p, void *b, unsigned long c), > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET' > __do_##name al; \ > ^~~~~~~~~~~~~~ > <scratch space>:221:1: note: expanded from here > __do_insw > ^ > arch/powerpc/include/asm/io.h:542:56: note: expanded from macro '__do_insw' > #define __do_insw(p, b, n) readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n)) > ~~~~~~~~~~~~~~~~~~~~~^ > In file included from arch/powerpc/perf/perf_regs.c:10: > In file included from include/linux/perf_event.h:57: > In file included from include/linux/cgroup.h:26: > In file included from include/linux/kernel_stat.h:9: > In file included from include/linux/interrupt.h:11: > In file included from include/linux/hardirq.h:10: > In file included from arch/powerpc/include/asm/hardirq.h:6: > In file included from include/linux/irq.h:20: > In file included from include/linux/io.h:13: > In file included from arch/powerpc/include/asm/io.h:604: > arch/powerpc/include/asm/io-defs.h:47:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > DEF_PCI_AC_NORET(insl, (unsigned long p, void *b, unsigned long c), > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET' > __do_##name al; \ > ^~~~~~~~~~~~~~ > <scratch space>:223:1: note: expanded from here > __do_insl > ^ > arch/powerpc/include/asm/io.h:543:56: note: expanded from macro '__do_insl' > #define __do_insl(p, b, n) readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n)) > ~~~~~~~~~~~~~~~~~~~~~^ > In file included from arch/powerpc/perf/perf_regs.c:10: > In file included from include/linux/perf_event.h:57: > In file included from include/linux/cgroup.h:26: > In file included from include/linux/kernel_stat.h:9: > In file included from include/linux/interrupt.h:11: > In file included from include/linux/hardirq.h:10: > In file included from arch/powerpc/include/asm/hardirq.h:6: > In file included from include/linux/irq.h:20: > In file included from include/linux/io.h:13: > In file included from arch/powerpc/include/asm/io.h:604: > arch/powerpc/include/asm/io-defs.h:49:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > DEF_PCI_AC_NORET(outsb, (unsigned long p, const void *b, unsigned long c), > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET' > __do_##name al; \ > ^~~~~~~~~~~~~~ > <scratch space>:225:1: note: expanded from here > __do_outsb > ^ > arch/powerpc/include/asm/io.h:544:58: note: expanded from macro '__do_outsb' > #define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n)) > ~~~~~~~~~~~~~~~~~~~~~^ > In file included from arch/powerpc/perf/perf_regs.c:10: > In file included from include/linux/perf_event.h:57: > In file included from include/linux/cgroup.h:26: > In file included from include/linux/kernel_stat.h:9: > In file included from include/linux/interrupt.h:11: > In file included from include/linux/hardirq.h:10: > In file included from arch/powerpc/include/asm/hardirq.h:6: > In file included from include/linux/irq.h:20: > In file included from include/linux/io.h:13: > In file included from arch/powerpc/include/asm/io.h:604: > arch/powerpc/include/asm/io-defs.h:51:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > DEF_PCI_AC_NORET(outsw, (unsigned long p, const void *b, unsigned long c), > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET' > __do_##name al; \ > ^~~~~~~~~~~~~~ > <scratch space>:227:1: note: expanded from here > __do_outsw > ^ > arch/powerpc/include/asm/io.h:545:58: note: expanded from macro '__do_outsw' > #define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n)) > ~~~~~~~~~~~~~~~~~~~~~^ > In file included from arch/powerpc/perf/perf_regs.c:10: > In file included from include/linux/perf_event.h:57: > In file included from include/linux/cgroup.h:26: > In file included from include/linux/kernel_stat.h:9: > In file included from include/linux/interrupt.h:11: > In file included from include/linux/hardirq.h:10: > In file included from arch/powerpc/include/asm/hardirq.h:6: > In file included from include/linux/irq.h:20: > In file included from include/linux/io.h:13: > In file included from arch/powerpc/include/asm/io.h:604: > arch/powerpc/include/asm/io-defs.h:53:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > DEF_PCI_AC_NORET(outsl, (unsigned long p, const void *b, unsigned long c), > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET' > __do_##name al; \ > ^~~~~~~~~~~~~~ > <scratch space>:229:1: note: expanded from here > __do_outsl > ^ > arch/powerpc/include/asm/io.h:546:58: note: expanded from macro '__do_outsl' > #define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n)) > ~~~~~~~~~~~~~~~~~~~~~^ >>> arch/powerpc/perf/perf_regs.c:16:5: error: expected identifier or '(' > u64 PERF_REG_EXTENDED_MASK; > ^ > include/linux/perf_regs.h:16:32: note: expanded from macro 'PERF_REG_EXTENDED_MASK' > #define PERF_REG_EXTENDED_MASK 0 > ^ > 12 warnings and 1 error generated. > > vim +16 arch/powerpc/perf/perf_regs.c > > 15 >> 16 u64 PERF_REG_EXTENDED_MASK; > 17 Hi, This patch defines PERF_REG_EXTENDED_MASK in arch/powerpc/include/asm/perf_event_server.h and this header file is included conditionally based on CONFIG_PPC_PERF_CTRS in arch/powerpc/include/asm/perf_event.h. So build breaks happens with config having CONFIG_PERF_EVENTS set and without CONFIG_PPC_PERF_CTRS. This will be fixed by defining PERF_REG_EXTENDED_MASK in perf_event.h as below: — diff --git a/arch/powerpc/include/asm/perf_event.h b/arch/powerpc/include/asm/perf_event.h index eed3954082fa..b1c3a91aa6fa 100644 --- a/arch/powerpc/include/asm/perf_event.h +++ b/arch/powerpc/include/asm/perf_event.h @@ -38,4 +38,6 @@ /* To support perf_regs sier update */ extern bool is_sier_available(void); +extern u64 PERF_REG_EXTENDED_MASK; +#define PERF_REG_EXTENDED_MASK PERF_REG_EXTENDED_MASK #endif diff --git a/arch/powerpc/include/asm/perf_event_server.h b/arch/powerpc/include/asm/perf_event_server.h index bf85d1a0b59e..5d368e81445f 100644 --- a/arch/powerpc/include/asm/perf_event_server.h +++ b/arch/powerpc/include/asm/perf_event_server.h @@ -15,9 +15,6 @@ #define MAX_EVENT_ALTERNATIVES 8 #define MAX_LIMITED_HWCOUNTERS 2 -extern u64 PERF_REG_EXTENDED_MASK; -#define PERF_REG_EXTENDED_MASK PERF_REG_EXTENDED_MASK - struct perf_event; struct mmcr_regs { — We also need this patch by Madhavan Sirinivasan : https://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=183203 to solve similar build break with `is_sier_available` Thanks Athira > > --- > 0-DAY CI Kernel Test Service, Intel Corporation > https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org > <.config.gz>
On 7/17/20 8:08 PM, Athira Rajeev wrote: > From: Anju T Sudhakar <anju@linux.vnet.ibm.com> > > Add support for perf extended register capability in powerpc. > The capability flag PERF_PMU_CAP_EXTENDED_REGS, is used to indicate the > PMU which support extended registers. The generic code define the mask > of extended registers as 0 for non supported architectures. > > Patch adds extended regs support for power9 platform by > exposing MMCR0, MMCR1 and MMCR2 registers. > > REG_RESERVED mask needs update to include extended regs. > `PERF_REG_EXTENDED_MASK`, contains mask value of the supported registers, > is defined at runtime in the kernel based on platform since the supported > registers may differ from one processor version to another and hence the > MASK value. > > with patch > ---------- > > available registers: r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 > r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 > r27 r28 r29 r30 r31 nip msr orig_r3 ctr link xer ccr softe > trap dar dsisr sier mmcra mmcr0 mmcr1 mmcr2 > > PERF_RECORD_SAMPLE(IP, 0x1): 4784/4784: 0 period: 1 addr: 0 > ... intr regs: mask 0xffffffffffff ABI 64-bit > .... r0 0xc00000000012b77c > .... r1 0xc000003fe5e03930 > .... r2 0xc000000001b0e000 > .... r3 0xc000003fdcddf800 > .... r4 0xc000003fc7880000 > .... r5 0x9c422724be > .... r6 0xc000003fe5e03908 > .... r7 0xffffff63bddc8706 > .... r8 0x9e4 > .... r9 0x0 > .... r10 0x1 > .... r11 0x0 > .... r12 0xc0000000001299c0 > .... r13 0xc000003ffffc4800 > .... r14 0x0 > .... r15 0x7fffdd8b8b00 > .... r16 0x0 > .... r17 0x7fffdd8be6b8 > .... r18 0x7e7076607730 > .... r19 0x2f > .... r20 0xc00000001fc26c68 > .... r21 0xc0002041e4227e00 > .... r22 0xc00000002018fb60 > .... r23 0x1 > .... r24 0xc000003ffec4d900 > .... r25 0x80000000 > .... r26 0x0 > .... r27 0x1 > .... r28 0x1 > .... r29 0xc000000001be1260 > .... r30 0x6008010 > .... r31 0xc000003ffebb7218 > .... nip 0xc00000000012b910 > .... msr 0x9000000000009033 > .... orig_r3 0xc00000000012b86c > .... ctr 0xc0000000001299c0 > .... link 0xc00000000012b77c > .... xer 0x0 > .... ccr 0x28002222 > .... softe 0x1 > .... trap 0xf00 > .... dar 0x0 > .... dsisr 0x80000000000 > .... sier 0x0 > .... mmcra 0x80000000000 > .... mmcr0 0x82008090 > .... mmcr1 0x1e000000 > .... mmcr2 0x0 > ... thread: perf:4784 > > Signed-off-by: Anju T Sudhakar <anju@linux.vnet.ibm.com> > [Defined PERF_REG_EXTENDED_MASK at run time to add support for different platforms ] > Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com> > Reviewed-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> > --- Patch looks good to me. Reviewed-by: Kajol Jain <kjain@linux.ibm.com> Thanks, Kajol Jain > arch/powerpc/include/asm/perf_event_server.h | 8 +++++++ > arch/powerpc/include/uapi/asm/perf_regs.h | 14 +++++++++++- > arch/powerpc/perf/core-book3s.c | 1 + > arch/powerpc/perf/perf_regs.c | 34 +++++++++++++++++++++++++--- > arch/powerpc/perf/power9-pmu.c | 6 +++++ > 5 files changed, 59 insertions(+), 4 deletions(-) > > diff --git a/arch/powerpc/include/asm/perf_event_server.h b/arch/powerpc/include/asm/perf_event_server.h > index 832450a..bf85d1a 100644 > --- a/arch/powerpc/include/asm/perf_event_server.h > +++ b/arch/powerpc/include/asm/perf_event_server.h > @@ -15,6 +15,9 @@ > #define MAX_EVENT_ALTERNATIVES 8 > #define MAX_LIMITED_HWCOUNTERS 2 > > +extern u64 PERF_REG_EXTENDED_MASK; > +#define PERF_REG_EXTENDED_MASK PERF_REG_EXTENDED_MASK > + > struct perf_event; > > struct mmcr_regs { > @@ -62,6 +65,11 @@ struct power_pmu { > int *blacklist_ev; > /* BHRB entries in the PMU */ > int bhrb_nr; > + /* > + * set this flag with `PERF_PMU_CAP_EXTENDED_REGS` if > + * the pmu supports extended perf regs capability > + */ > + int capabilities; > }; > > /* > diff --git a/arch/powerpc/include/uapi/asm/perf_regs.h b/arch/powerpc/include/uapi/asm/perf_regs.h > index f599064..225c64c 100644 > --- a/arch/powerpc/include/uapi/asm/perf_regs.h > +++ b/arch/powerpc/include/uapi/asm/perf_regs.h > @@ -48,6 +48,18 @@ enum perf_event_powerpc_regs { > PERF_REG_POWERPC_DSISR, > PERF_REG_POWERPC_SIER, > PERF_REG_POWERPC_MMCRA, > - PERF_REG_POWERPC_MAX, > + /* Extended registers */ > + PERF_REG_POWERPC_MMCR0, > + PERF_REG_POWERPC_MMCR1, > + PERF_REG_POWERPC_MMCR2, > + /* Max regs without the extended regs */ > + PERF_REG_POWERPC_MAX = PERF_REG_POWERPC_MMCRA + 1, > }; > + > +#define PERF_REG_PMU_MASK ((1ULL << PERF_REG_POWERPC_MAX) - 1) > + > +/* PERF_REG_EXTENDED_MASK value for CPU_FTR_ARCH_300 */ > +#define PERF_REG_PMU_MASK_300 (((1ULL << (PERF_REG_POWERPC_MMCR2 + 1)) - 1) - PERF_REG_PMU_MASK) > + > +#define PERF_REG_MAX_ISA_300 (PERF_REG_POWERPC_MMCR2 + 1) > #endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */ > diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c > index 31c0535..d5a9529 100644 > --- a/arch/powerpc/perf/core-book3s.c > +++ b/arch/powerpc/perf/core-book3s.c > @@ -2316,6 +2316,7 @@ int register_power_pmu(struct power_pmu *pmu) > pmu->name); > > power_pmu.attr_groups = ppmu->attr_groups; > + power_pmu.capabilities |= (ppmu->capabilities & PERF_PMU_CAP_EXTENDED_REGS); > > #ifdef MSR_HV > /* > diff --git a/arch/powerpc/perf/perf_regs.c b/arch/powerpc/perf/perf_regs.c > index a213a0a..b0cf68f 100644 > --- a/arch/powerpc/perf/perf_regs.c > +++ b/arch/powerpc/perf/perf_regs.c > @@ -13,9 +13,11 @@ > #include <asm/ptrace.h> > #include <asm/perf_regs.h> > > +u64 PERF_REG_EXTENDED_MASK; > + > #define PT_REGS_OFFSET(id, r) [id] = offsetof(struct pt_regs, r) > > -#define REG_RESERVED (~((1ULL << PERF_REG_POWERPC_MAX) - 1)) > +#define REG_RESERVED (~(PERF_REG_EXTENDED_MASK | PERF_REG_PMU_MASK)) > > static unsigned int pt_regs_offset[PERF_REG_POWERPC_MAX] = { > PT_REGS_OFFSET(PERF_REG_POWERPC_R0, gpr[0]), > @@ -69,10 +71,26 @@ > PT_REGS_OFFSET(PERF_REG_POWERPC_MMCRA, dsisr), > }; > > +/* Function to return the extended register values */ > +static u64 get_ext_regs_value(int idx) > +{ > + switch (idx) { > + case PERF_REG_POWERPC_MMCR0: > + return mfspr(SPRN_MMCR0); > + case PERF_REG_POWERPC_MMCR1: > + return mfspr(SPRN_MMCR1); > + case PERF_REG_POWERPC_MMCR2: > + return mfspr(SPRN_MMCR2); > + default: return 0; > + } > +} > + > u64 perf_reg_value(struct pt_regs *regs, int idx) > { > - if (WARN_ON_ONCE(idx >= PERF_REG_POWERPC_MAX)) > - return 0; > + u64 PERF_REG_EXTENDED_MAX; > + > + if (cpu_has_feature(CPU_FTR_ARCH_300)) > + PERF_REG_EXTENDED_MAX = PERF_REG_MAX_ISA_300; > > if (idx == PERF_REG_POWERPC_SIER && > (IS_ENABLED(CONFIG_FSL_EMB_PERF_EVENT) || > @@ -85,6 +103,16 @@ u64 perf_reg_value(struct pt_regs *regs, int idx) > IS_ENABLED(CONFIG_PPC32))) > return 0; > > + if (idx >= PERF_REG_POWERPC_MAX && idx < PERF_REG_EXTENDED_MAX) > + return get_ext_regs_value(idx); > + > + /* > + * If the idx is referring to value beyond the > + * supported registers, return 0 with a warning > + */ > + if (WARN_ON_ONCE(idx >= PERF_REG_EXTENDED_MAX)) > + return 0; > + > return regs_get_register(regs, pt_regs_offset[idx]); > } > > diff --git a/arch/powerpc/perf/power9-pmu.c b/arch/powerpc/perf/power9-pmu.c > index 05dae38..2a57e93 100644 > --- a/arch/powerpc/perf/power9-pmu.c > +++ b/arch/powerpc/perf/power9-pmu.c > @@ -90,6 +90,8 @@ enum { > #define POWER9_MMCRA_IFM3 0x00000000C0000000UL > #define POWER9_MMCRA_BHRB_MASK 0x00000000C0000000UL > > +extern u64 PERF_REG_EXTENDED_MASK; > + > /* Nasty Power9 specific hack */ > #define PVR_POWER9_CUMULUS 0x00002000 > > @@ -434,6 +436,7 @@ static void power9_config_bhrb(u64 pmu_bhrb_filter) > .cache_events = &power9_cache_events, > .attr_groups = power9_pmu_attr_groups, > .bhrb_nr = 32, > + .capabilities = PERF_PMU_CAP_EXTENDED_REGS, > }; > > int init_power9_pmu(void) > @@ -457,6 +460,9 @@ int init_power9_pmu(void) > } > } > > + /* Set the PERF_REG_EXTENDED_MASK here */ > + PERF_REG_EXTENDED_MASK = PERF_REG_PMU_MASK_300; > + > rc = register_power_pmu(&power9_pmu); > if (rc) > return rc; >
On 7/21/20 11:32 AM, kajoljain wrote: > > > On 7/17/20 8:08 PM, Athira Rajeev wrote: >> From: Anju T Sudhakar <anju@linux.vnet.ibm.com> >> >> Add support for perf extended register capability in powerpc. >> The capability flag PERF_PMU_CAP_EXTENDED_REGS, is used to indicate the >> PMU which support extended registers. The generic code define the mask >> of extended registers as 0 for non supported architectures. >> >> Patch adds extended regs support for power9 platform by >> exposing MMCR0, MMCR1 and MMCR2 registers. >> >> REG_RESERVED mask needs update to include extended regs. >> `PERF_REG_EXTENDED_MASK`, contains mask value of the supported registers, >> is defined at runtime in the kernel based on platform since the supported >> registers may differ from one processor version to another and hence the >> MASK value. >> >> with patch >> ---------- >> >> available registers: r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 >> r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 >> r27 r28 r29 r30 r31 nip msr orig_r3 ctr link xer ccr softe >> trap dar dsisr sier mmcra mmcr0 mmcr1 mmcr2 >> >> PERF_RECORD_SAMPLE(IP, 0x1): 4784/4784: 0 period: 1 addr: 0 >> ... intr regs: mask 0xffffffffffff ABI 64-bit >> .... r0 0xc00000000012b77c >> .... r1 0xc000003fe5e03930 >> .... r2 0xc000000001b0e000 >> .... r3 0xc000003fdcddf800 >> .... r4 0xc000003fc7880000 >> .... r5 0x9c422724be >> .... r6 0xc000003fe5e03908 >> .... r7 0xffffff63bddc8706 >> .... r8 0x9e4 >> .... r9 0x0 >> .... r10 0x1 >> .... r11 0x0 >> .... r12 0xc0000000001299c0 >> .... r13 0xc000003ffffc4800 >> .... r14 0x0 >> .... r15 0x7fffdd8b8b00 >> .... r16 0x0 >> .... r17 0x7fffdd8be6b8 >> .... r18 0x7e7076607730 >> .... r19 0x2f >> .... r20 0xc00000001fc26c68 >> .... r21 0xc0002041e4227e00 >> .... r22 0xc00000002018fb60 >> .... r23 0x1 >> .... r24 0xc000003ffec4d900 >> .... r25 0x80000000 >> .... r26 0x0 >> .... r27 0x1 >> .... r28 0x1 >> .... r29 0xc000000001be1260 >> .... r30 0x6008010 >> .... r31 0xc000003ffebb7218 >> .... nip 0xc00000000012b910 >> .... msr 0x9000000000009033 >> .... orig_r3 0xc00000000012b86c >> .... ctr 0xc0000000001299c0 >> .... link 0xc00000000012b77c >> .... xer 0x0 >> .... ccr 0x28002222 >> .... softe 0x1 >> .... trap 0xf00 >> .... dar 0x0 >> .... dsisr 0x80000000000 >> .... sier 0x0 >> .... mmcra 0x80000000000 >> .... mmcr0 0x82008090 >> .... mmcr1 0x1e000000 >> .... mmcr2 0x0 >> ... thread: perf:4784 >> >> Signed-off-by: Anju T Sudhakar <anju@linux.vnet.ibm.com> >> [Defined PERF_REG_EXTENDED_MASK at run time to add support for different platforms ] >> Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com> >> Reviewed-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> >> --- > > Patch looks good to me. > > Reviewed-by: Kajol Jain <kjain@linux.ibm.com> Hi Arnaldo and Jiri, Please let me know if you have any comments on these patches. Can you pull/ack these patches if they seems fine to you. Thanks, Kajol Jain > > Thanks, > Kajol Jain > >> arch/powerpc/include/asm/perf_event_server.h | 8 +++++++ >> arch/powerpc/include/uapi/asm/perf_regs.h | 14 +++++++++++- >> arch/powerpc/perf/core-book3s.c | 1 + >> arch/powerpc/perf/perf_regs.c | 34 +++++++++++++++++++++++++--- >> arch/powerpc/perf/power9-pmu.c | 6 +++++ >> 5 files changed, 59 insertions(+), 4 deletions(-) >> >> diff --git a/arch/powerpc/include/asm/perf_event_server.h b/arch/powerpc/include/asm/perf_event_server.h >> index 832450a..bf85d1a 100644 >> --- a/arch/powerpc/include/asm/perf_event_server.h >> +++ b/arch/powerpc/include/asm/perf_event_server.h >> @@ -15,6 +15,9 @@ >> #define MAX_EVENT_ALTERNATIVES 8 >> #define MAX_LIMITED_HWCOUNTERS 2 >> >> +extern u64 PERF_REG_EXTENDED_MASK; >> +#define PERF_REG_EXTENDED_MASK PERF_REG_EXTENDED_MASK >> + >> struct perf_event; >> >> struct mmcr_regs { >> @@ -62,6 +65,11 @@ struct power_pmu { >> int *blacklist_ev; >> /* BHRB entries in the PMU */ >> int bhrb_nr; >> + /* >> + * set this flag with `PERF_PMU_CAP_EXTENDED_REGS` if >> + * the pmu supports extended perf regs capability >> + */ >> + int capabilities; >> }; >> >> /* >> diff --git a/arch/powerpc/include/uapi/asm/perf_regs.h b/arch/powerpc/include/uapi/asm/perf_regs.h >> index f599064..225c64c 100644 >> --- a/arch/powerpc/include/uapi/asm/perf_regs.h >> +++ b/arch/powerpc/include/uapi/asm/perf_regs.h >> @@ -48,6 +48,18 @@ enum perf_event_powerpc_regs { >> PERF_REG_POWERPC_DSISR, >> PERF_REG_POWERPC_SIER, >> PERF_REG_POWERPC_MMCRA, >> - PERF_REG_POWERPC_MAX, >> + /* Extended registers */ >> + PERF_REG_POWERPC_MMCR0, >> + PERF_REG_POWERPC_MMCR1, >> + PERF_REG_POWERPC_MMCR2, >> + /* Max regs without the extended regs */ >> + PERF_REG_POWERPC_MAX = PERF_REG_POWERPC_MMCRA + 1, >> }; >> + >> +#define PERF_REG_PMU_MASK ((1ULL << PERF_REG_POWERPC_MAX) - 1) >> + >> +/* PERF_REG_EXTENDED_MASK value for CPU_FTR_ARCH_300 */ >> +#define PERF_REG_PMU_MASK_300 (((1ULL << (PERF_REG_POWERPC_MMCR2 + 1)) - 1) - PERF_REG_PMU_MASK) >> + >> +#define PERF_REG_MAX_ISA_300 (PERF_REG_POWERPC_MMCR2 + 1) >> #endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */ >> diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c >> index 31c0535..d5a9529 100644 >> --- a/arch/powerpc/perf/core-book3s.c >> +++ b/arch/powerpc/perf/core-book3s.c >> @@ -2316,6 +2316,7 @@ int register_power_pmu(struct power_pmu *pmu) >> pmu->name); >> >> power_pmu.attr_groups = ppmu->attr_groups; >> + power_pmu.capabilities |= (ppmu->capabilities & PERF_PMU_CAP_EXTENDED_REGS); >> >> #ifdef MSR_HV >> /* >> diff --git a/arch/powerpc/perf/perf_regs.c b/arch/powerpc/perf/perf_regs.c >> index a213a0a..b0cf68f 100644 >> --- a/arch/powerpc/perf/perf_regs.c >> +++ b/arch/powerpc/perf/perf_regs.c >> @@ -13,9 +13,11 @@ >> #include <asm/ptrace.h> >> #include <asm/perf_regs.h> >> >> +u64 PERF_REG_EXTENDED_MASK; >> + >> #define PT_REGS_OFFSET(id, r) [id] = offsetof(struct pt_regs, r) >> >> -#define REG_RESERVED (~((1ULL << PERF_REG_POWERPC_MAX) - 1)) >> +#define REG_RESERVED (~(PERF_REG_EXTENDED_MASK | PERF_REG_PMU_MASK)) >> >> static unsigned int pt_regs_offset[PERF_REG_POWERPC_MAX] = { >> PT_REGS_OFFSET(PERF_REG_POWERPC_R0, gpr[0]), >> @@ -69,10 +71,26 @@ >> PT_REGS_OFFSET(PERF_REG_POWERPC_MMCRA, dsisr), >> }; >> >> +/* Function to return the extended register values */ >> +static u64 get_ext_regs_value(int idx) >> +{ >> + switch (idx) { >> + case PERF_REG_POWERPC_MMCR0: >> + return mfspr(SPRN_MMCR0); >> + case PERF_REG_POWERPC_MMCR1: >> + return mfspr(SPRN_MMCR1); >> + case PERF_REG_POWERPC_MMCR2: >> + return mfspr(SPRN_MMCR2); >> + default: return 0; >> + } >> +} >> + >> u64 perf_reg_value(struct pt_regs *regs, int idx) >> { >> - if (WARN_ON_ONCE(idx >= PERF_REG_POWERPC_MAX)) >> - return 0; >> + u64 PERF_REG_EXTENDED_MAX; >> + >> + if (cpu_has_feature(CPU_FTR_ARCH_300)) >> + PERF_REG_EXTENDED_MAX = PERF_REG_MAX_ISA_300; >> >> if (idx == PERF_REG_POWERPC_SIER && >> (IS_ENABLED(CONFIG_FSL_EMB_PERF_EVENT) || >> @@ -85,6 +103,16 @@ u64 perf_reg_value(struct pt_regs *regs, int idx) >> IS_ENABLED(CONFIG_PPC32))) >> return 0; >> >> + if (idx >= PERF_REG_POWERPC_MAX && idx < PERF_REG_EXTENDED_MAX) >> + return get_ext_regs_value(idx); >> + >> + /* >> + * If the idx is referring to value beyond the >> + * supported registers, return 0 with a warning >> + */ >> + if (WARN_ON_ONCE(idx >= PERF_REG_EXTENDED_MAX)) >> + return 0; >> + >> return regs_get_register(regs, pt_regs_offset[idx]); >> } >> >> diff --git a/arch/powerpc/perf/power9-pmu.c b/arch/powerpc/perf/power9-pmu.c >> index 05dae38..2a57e93 100644 >> --- a/arch/powerpc/perf/power9-pmu.c >> +++ b/arch/powerpc/perf/power9-pmu.c >> @@ -90,6 +90,8 @@ enum { >> #define POWER9_MMCRA_IFM3 0x00000000C0000000UL >> #define POWER9_MMCRA_BHRB_MASK 0x00000000C0000000UL >> >> +extern u64 PERF_REG_EXTENDED_MASK; >> + >> /* Nasty Power9 specific hack */ >> #define PVR_POWER9_CUMULUS 0x00002000 >> >> @@ -434,6 +436,7 @@ static void power9_config_bhrb(u64 pmu_bhrb_filter) >> .cache_events = &power9_cache_events, >> .attr_groups = power9_pmu_attr_groups, >> .bhrb_nr = 32, >> + .capabilities = PERF_PMU_CAP_EXTENDED_REGS, >> }; >> >> int init_power9_pmu(void) >> @@ -457,6 +460,9 @@ int init_power9_pmu(void) >> } >> } >> >> + /* Set the PERF_REG_EXTENDED_MASK here */ >> + PERF_REG_EXTENDED_MASK = PERF_REG_PMU_MASK_300; >> + >> rc = register_power_pmu(&power9_pmu); >> if (rc) >> return rc; >>
Em Thu, Jul 23, 2020 at 11:14:16AM +0530, kajoljain escreveu: > > > On 7/21/20 11:32 AM, kajoljain wrote: > > > > > > On 7/17/20 8:08 PM, Athira Rajeev wrote: > >> From: Anju T Sudhakar <anju@linux.vnet.ibm.com> > >> > >> Add support for perf extended register capability in powerpc. > >> The capability flag PERF_PMU_CAP_EXTENDED_REGS, is used to indicate the > >> PMU which support extended registers. The generic code define the mask > >> of extended registers as 0 for non supported architectures. > >> > >> Patch adds extended regs support for power9 platform by > >> exposing MMCR0, MMCR1 and MMCR2 registers. > >> > >> REG_RESERVED mask needs update to include extended regs. > >> `PERF_REG_EXTENDED_MASK`, contains mask value of the supported registers, > >> is defined at runtime in the kernel based on platform since the supported > >> registers may differ from one processor version to another and hence the > >> MASK value. > >> > >> with patch > >> ---------- > >> > >> available registers: r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 > >> r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 > >> r27 r28 r29 r30 r31 nip msr orig_r3 ctr link xer ccr softe > >> trap dar dsisr sier mmcra mmcr0 mmcr1 mmcr2 > >> > >> PERF_RECORD_SAMPLE(IP, 0x1): 4784/4784: 0 period: 1 addr: 0 > >> ... intr regs: mask 0xffffffffffff ABI 64-bit > >> .... r0 0xc00000000012b77c > >> .... r1 0xc000003fe5e03930 > >> .... r2 0xc000000001b0e000 > >> .... r3 0xc000003fdcddf800 > >> .... r4 0xc000003fc7880000 > >> .... r5 0x9c422724be > >> .... r6 0xc000003fe5e03908 > >> .... r7 0xffffff63bddc8706 > >> .... r8 0x9e4 > >> .... r9 0x0 > >> .... r10 0x1 > >> .... r11 0x0 > >> .... r12 0xc0000000001299c0 > >> .... r13 0xc000003ffffc4800 > >> .... r14 0x0 > >> .... r15 0x7fffdd8b8b00 > >> .... r16 0x0 > >> .... r17 0x7fffdd8be6b8 > >> .... r18 0x7e7076607730 > >> .... r19 0x2f > >> .... r20 0xc00000001fc26c68 > >> .... r21 0xc0002041e4227e00 > >> .... r22 0xc00000002018fb60 > >> .... r23 0x1 > >> .... r24 0xc000003ffec4d900 > >> .... r25 0x80000000 > >> .... r26 0x0 > >> .... r27 0x1 > >> .... r28 0x1 > >> .... r29 0xc000000001be1260 > >> .... r30 0x6008010 > >> .... r31 0xc000003ffebb7218 > >> .... nip 0xc00000000012b910 > >> .... msr 0x9000000000009033 > >> .... orig_r3 0xc00000000012b86c > >> .... ctr 0xc0000000001299c0 > >> .... link 0xc00000000012b77c > >> .... xer 0x0 > >> .... ccr 0x28002222 > >> .... softe 0x1 > >> .... trap 0xf00 > >> .... dar 0x0 > >> .... dsisr 0x80000000000 > >> .... sier 0x0 > >> .... mmcra 0x80000000000 > >> .... mmcr0 0x82008090 > >> .... mmcr1 0x1e000000 > >> .... mmcr2 0x0 > >> ... thread: perf:4784 > >> > >> Signed-off-by: Anju T Sudhakar <anju@linux.vnet.ibm.com> > >> [Defined PERF_REG_EXTENDED_MASK at run time to add support for different platforms ] > >> Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com> > >> Reviewed-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> > >> --- > > > > Patch looks good to me. > > > > Reviewed-by: Kajol Jain <kjain@linux.ibm.com> > > Hi Arnaldo and Jiri, > Please let me know if you have any comments on these patches. Can you pull/ack these > patches if they seems fine to you. Can you please clarify something here, I think I saw a kernel build bot complaint followed by a fix, in these cases I think, for reviewer's sake, that this would entail a v4 patchkit? One that has no such build issues? Or have I got something wrong? - Arnaldo
> On 23-Jul-2020, at 8:26 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote: > > Em Thu, Jul 23, 2020 at 11:14:16AM +0530, kajoljain escreveu: >> >> >> On 7/21/20 11:32 AM, kajoljain wrote: >>> >>> >>> On 7/17/20 8:08 PM, Athira Rajeev wrote: >>>> From: Anju T Sudhakar <anju@linux.vnet.ibm.com> >>>> >>>> Add support for perf extended register capability in powerpc. >>>> The capability flag PERF_PMU_CAP_EXTENDED_REGS, is used to indicate the >>>> PMU which support extended registers. The generic code define the mask >>>> of extended registers as 0 for non supported architectures. >>>> >>>> Patch adds extended regs support for power9 platform by >>>> exposing MMCR0, MMCR1 and MMCR2 registers. >>>> >>>> REG_RESERVED mask needs update to include extended regs. >>>> `PERF_REG_EXTENDED_MASK`, contains mask value of the supported registers, >>>> is defined at runtime in the kernel based on platform since the supported >>>> registers may differ from one processor version to another and hence the >>>> MASK value. >>>> >>>> with patch >>>> ---------- >>>> >>>> available registers: r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 >>>> r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 >>>> r27 r28 r29 r30 r31 nip msr orig_r3 ctr link xer ccr softe >>>> trap dar dsisr sier mmcra mmcr0 mmcr1 mmcr2 >>>> >>>> PERF_RECORD_SAMPLE(IP, 0x1): 4784/4784: 0 period: 1 addr: 0 >>>> ... intr regs: mask 0xffffffffffff ABI 64-bit >>>> .... r0 0xc00000000012b77c >>>> .... r1 0xc000003fe5e03930 >>>> .... r2 0xc000000001b0e000 >>>> .... r3 0xc000003fdcddf800 >>>> .... r4 0xc000003fc7880000 >>>> .... r5 0x9c422724be >>>> .... r6 0xc000003fe5e03908 >>>> .... r7 0xffffff63bddc8706 >>>> .... r8 0x9e4 >>>> .... r9 0x0 >>>> .... r10 0x1 >>>> .... r11 0x0 >>>> .... r12 0xc0000000001299c0 >>>> .... r13 0xc000003ffffc4800 >>>> .... r14 0x0 >>>> .... r15 0x7fffdd8b8b00 >>>> .... r16 0x0 >>>> .... r17 0x7fffdd8be6b8 >>>> .... r18 0x7e7076607730 >>>> .... r19 0x2f >>>> .... r20 0xc00000001fc26c68 >>>> .... r21 0xc0002041e4227e00 >>>> .... r22 0xc00000002018fb60 >>>> .... r23 0x1 >>>> .... r24 0xc000003ffec4d900 >>>> .... r25 0x80000000 >>>> .... r26 0x0 >>>> .... r27 0x1 >>>> .... r28 0x1 >>>> .... r29 0xc000000001be1260 >>>> .... r30 0x6008010 >>>> .... r31 0xc000003ffebb7218 >>>> .... nip 0xc00000000012b910 >>>> .... msr 0x9000000000009033 >>>> .... orig_r3 0xc00000000012b86c >>>> .... ctr 0xc0000000001299c0 >>>> .... link 0xc00000000012b77c >>>> .... xer 0x0 >>>> .... ccr 0x28002222 >>>> .... softe 0x1 >>>> .... trap 0xf00 >>>> .... dar 0x0 >>>> .... dsisr 0x80000000000 >>>> .... sier 0x0 >>>> .... mmcra 0x80000000000 >>>> .... mmcr0 0x82008090 >>>> .... mmcr1 0x1e000000 >>>> .... mmcr2 0x0 >>>> ... thread: perf:4784 >>>> >>>> Signed-off-by: Anju T Sudhakar <anju@linux.vnet.ibm.com> >>>> [Defined PERF_REG_EXTENDED_MASK at run time to add support for different platforms ] >>>> Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com> >>>> Reviewed-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> >>>> --- >>> >>> Patch looks good to me. >>> >>> Reviewed-by: Kajol Jain <kjain@linux.ibm.com> >> >> Hi Arnaldo and Jiri, >> Please let me know if you have any comments on these patches. Can you pull/ack these >> patches if they seems fine to you. > > Can you please clarify something here, I think I saw a kernel build bot > complaint followed by a fix, in these cases I think, for reviewer's > sake, that this would entail a v4 patchkit? One that has no such build > issues? > > Or have I got something wrong? Hi Arnaldo, yes you are right, I will send version 4 as a new series with changes to add support for extended regs and including fix for the build issue. Thanks for your response. Athira > > - Arnaldo
Hi Athira, > +/* Function to return the extended register values */ > +static u64 get_ext_regs_value(int idx) > +{ > + switch (idx) { > + case PERF_REG_POWERPC_MMCR0: > + return mfspr(SPRN_MMCR0); > + case PERF_REG_POWERPC_MMCR1: > + return mfspr(SPRN_MMCR1); > + case PERF_REG_POWERPC_MMCR2: > + return mfspr(SPRN_MMCR2); > + default: return 0; > + } > +} > + > u64 perf_reg_value(struct pt_regs *regs, int idx) > { > - if (WARN_ON_ONCE(idx >= PERF_REG_POWERPC_MAX)) > - return 0; > + u64 PERF_REG_EXTENDED_MAX; PERF_REG_EXTENDED_MAX should be initialized. otherwise ... > + > + if (cpu_has_feature(CPU_FTR_ARCH_300)) > + PERF_REG_EXTENDED_MAX = PERF_REG_MAX_ISA_300; > > if (idx == PERF_REG_POWERPC_SIER && > (IS_ENABLED(CONFIG_FSL_EMB_PERF_EVENT) || > @@ -85,6 +103,16 @@ u64 perf_reg_value(struct pt_regs *regs, int idx) > IS_ENABLED(CONFIG_PPC32))) > return 0; > > + if (idx >= PERF_REG_POWERPC_MAX && idx < PERF_REG_EXTENDED_MAX) > + return get_ext_regs_value(idx); On non p9/p10 machine, PERF_REG_EXTENDED_MAX may contain random value which will allow user to pass this if condition unintentionally. Neat: PERF_REG_EXTENDED_MAX is a local variable so it should be in lowercase. Any specific reason to define it in capital? Ravi
> On 24-Jul-2020, at 5:56 PM, Ravi Bangoria <ravi.bangoria@linux.ibm.com> wrote: > > Hi Athira, > >> +/* Function to return the extended register values */ >> +static u64 get_ext_regs_value(int idx) >> +{ >> + switch (idx) { >> + case PERF_REG_POWERPC_MMCR0: >> + return mfspr(SPRN_MMCR0); >> + case PERF_REG_POWERPC_MMCR1: >> + return mfspr(SPRN_MMCR1); >> + case PERF_REG_POWERPC_MMCR2: >> + return mfspr(SPRN_MMCR2); >> + default: return 0; >> + } >> +} >> + >> u64 perf_reg_value(struct pt_regs *regs, int idx) >> { >> - if (WARN_ON_ONCE(idx >= PERF_REG_POWERPC_MAX)) >> - return 0; >> + u64 PERF_REG_EXTENDED_MAX; > > PERF_REG_EXTENDED_MAX should be initialized. otherwise ... > >> + >> + if (cpu_has_feature(CPU_FTR_ARCH_300)) >> + PERF_REG_EXTENDED_MAX = PERF_REG_MAX_ISA_300; >> if (idx == PERF_REG_POWERPC_SIER && >> (IS_ENABLED(CONFIG_FSL_EMB_PERF_EVENT) || >> @@ -85,6 +103,16 @@ u64 perf_reg_value(struct pt_regs *regs, int idx) >> IS_ENABLED(CONFIG_PPC32))) >> return 0; >> + if (idx >= PERF_REG_POWERPC_MAX && idx < PERF_REG_EXTENDED_MAX) >> + return get_ext_regs_value(idx); > > On non p9/p10 machine, PERF_REG_EXTENDED_MAX may contain random value which will > allow user to pass this if condition unintentionally. > > Neat: PERF_REG_EXTENDED_MAX is a local variable so it should be in lowercase. > Any specific reason to define it in capital? Hi Ravi There is no specific reason. I will include both these changes in next version Thanks Athira Rajeev > > Ravi
diff --git a/arch/powerpc/include/asm/perf_event_server.h b/arch/powerpc/include/asm/perf_event_server.h index 832450a..bf85d1a 100644 --- a/arch/powerpc/include/asm/perf_event_server.h +++ b/arch/powerpc/include/asm/perf_event_server.h @@ -15,6 +15,9 @@ #define MAX_EVENT_ALTERNATIVES 8 #define MAX_LIMITED_HWCOUNTERS 2 +extern u64 PERF_REG_EXTENDED_MASK; +#define PERF_REG_EXTENDED_MASK PERF_REG_EXTENDED_MASK + struct perf_event; struct mmcr_regs { @@ -62,6 +65,11 @@ struct power_pmu { int *blacklist_ev; /* BHRB entries in the PMU */ int bhrb_nr; + /* + * set this flag with `PERF_PMU_CAP_EXTENDED_REGS` if + * the pmu supports extended perf regs capability + */ + int capabilities; }; /* diff --git a/arch/powerpc/include/uapi/asm/perf_regs.h b/arch/powerpc/include/uapi/asm/perf_regs.h index f599064..225c64c 100644 --- a/arch/powerpc/include/uapi/asm/perf_regs.h +++ b/arch/powerpc/include/uapi/asm/perf_regs.h @@ -48,6 +48,18 @@ enum perf_event_powerpc_regs { PERF_REG_POWERPC_DSISR, PERF_REG_POWERPC_SIER, PERF_REG_POWERPC_MMCRA, - PERF_REG_POWERPC_MAX, + /* Extended registers */ + PERF_REG_POWERPC_MMCR0, + PERF_REG_POWERPC_MMCR1, + PERF_REG_POWERPC_MMCR2, + /* Max regs without the extended regs */ + PERF_REG_POWERPC_MAX = PERF_REG_POWERPC_MMCRA + 1, }; + +#define PERF_REG_PMU_MASK ((1ULL << PERF_REG_POWERPC_MAX) - 1) + +/* PERF_REG_EXTENDED_MASK value for CPU_FTR_ARCH_300 */ +#define PERF_REG_PMU_MASK_300 (((1ULL << (PERF_REG_POWERPC_MMCR2 + 1)) - 1) - PERF_REG_PMU_MASK) + +#define PERF_REG_MAX_ISA_300 (PERF_REG_POWERPC_MMCR2 + 1) #endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */ diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 31c0535..d5a9529 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c @@ -2316,6 +2316,7 @@ int register_power_pmu(struct power_pmu *pmu) pmu->name); power_pmu.attr_groups = ppmu->attr_groups; + power_pmu.capabilities |= (ppmu->capabilities & PERF_PMU_CAP_EXTENDED_REGS); #ifdef MSR_HV /* diff --git a/arch/powerpc/perf/perf_regs.c b/arch/powerpc/perf/perf_regs.c index a213a0a..b0cf68f 100644 --- a/arch/powerpc/perf/perf_regs.c +++ b/arch/powerpc/perf/perf_regs.c @@ -13,9 +13,11 @@ #include <asm/ptrace.h> #include <asm/perf_regs.h> +u64 PERF_REG_EXTENDED_MASK; + #define PT_REGS_OFFSET(id, r) [id] = offsetof(struct pt_regs, r) -#define REG_RESERVED (~((1ULL << PERF_REG_POWERPC_MAX) - 1)) +#define REG_RESERVED (~(PERF_REG_EXTENDED_MASK | PERF_REG_PMU_MASK)) static unsigned int pt_regs_offset[PERF_REG_POWERPC_MAX] = { PT_REGS_OFFSET(PERF_REG_POWERPC_R0, gpr[0]), @@ -69,10 +71,26 @@ PT_REGS_OFFSET(PERF_REG_POWERPC_MMCRA, dsisr), }; +/* Function to return the extended register values */ +static u64 get_ext_regs_value(int idx) +{ + switch (idx) { + case PERF_REG_POWERPC_MMCR0: + return mfspr(SPRN_MMCR0); + case PERF_REG_POWERPC_MMCR1: + return mfspr(SPRN_MMCR1); + case PERF_REG_POWERPC_MMCR2: + return mfspr(SPRN_MMCR2); + default: return 0; + } +} + u64 perf_reg_value(struct pt_regs *regs, int idx) { - if (WARN_ON_ONCE(idx >= PERF_REG_POWERPC_MAX)) - return 0; + u64 PERF_REG_EXTENDED_MAX; + + if (cpu_has_feature(CPU_FTR_ARCH_300)) + PERF_REG_EXTENDED_MAX = PERF_REG_MAX_ISA_300; if (idx == PERF_REG_POWERPC_SIER && (IS_ENABLED(CONFIG_FSL_EMB_PERF_EVENT) || @@ -85,6 +103,16 @@ u64 perf_reg_value(struct pt_regs *regs, int idx) IS_ENABLED(CONFIG_PPC32))) return 0; + if (idx >= PERF_REG_POWERPC_MAX && idx < PERF_REG_EXTENDED_MAX) + return get_ext_regs_value(idx); + + /* + * If the idx is referring to value beyond the + * supported registers, return 0 with a warning + */ + if (WARN_ON_ONCE(idx >= PERF_REG_EXTENDED_MAX)) + return 0; + return regs_get_register(regs, pt_regs_offset[idx]); } diff --git a/arch/powerpc/perf/power9-pmu.c b/arch/powerpc/perf/power9-pmu.c index 05dae38..2a57e93 100644 --- a/arch/powerpc/perf/power9-pmu.c +++ b/arch/powerpc/perf/power9-pmu.c @@ -90,6 +90,8 @@ enum { #define POWER9_MMCRA_IFM3 0x00000000C0000000UL #define POWER9_MMCRA_BHRB_MASK 0x00000000C0000000UL +extern u64 PERF_REG_EXTENDED_MASK; + /* Nasty Power9 specific hack */ #define PVR_POWER9_CUMULUS 0x00002000 @@ -434,6 +436,7 @@ static void power9_config_bhrb(u64 pmu_bhrb_filter) .cache_events = &power9_cache_events, .attr_groups = power9_pmu_attr_groups, .bhrb_nr = 32, + .capabilities = PERF_PMU_CAP_EXTENDED_REGS, }; int init_power9_pmu(void) @@ -457,6 +460,9 @@ int init_power9_pmu(void) } } + /* Set the PERF_REG_EXTENDED_MASK here */ + PERF_REG_EXTENDED_MASK = PERF_REG_PMU_MASK_300; + rc = register_power_pmu(&power9_pmu); if (rc) return rc;