diff mbox

[01/13] perf/core: Add perf_arch_regs and mask to perf_regs structure

Message ID 1472418058-28659-2-git-send-email-maddy@linux.vnet.ibm.com (mailing list archive)
State Not Applicable
Headers show

Commit Message

maddy Aug. 28, 2016, 9 p.m. UTC
It's a perennial request from hardware folks to be able to
see the raw values of the pmu registers. Partly it's so that
they can verify perf is doing what they want, and some
of it is that they're interested in some of the more obscure
info that isn't plumbed out through other perf interfaces.

Over the years internally have used various hack to get
the requested data out but this is an attempt to use a
somewhat standard mechanism (using PERF_SAMPLE_REGS_INTR).

This would also be helpful for those of us working on the perf
hardware backends, to be able to verify that we're programming
things correctly, without resorting to debug printks etc.

Mechanism proposed:

1)perf_regs structure is extended with a perf_arch_regs structure
which each arch/ can populate with their specific platform
registers to sample on each perf interrupt and an arch_regs_mask
variable, which is for perf tool to know about the perf_arch_regs
that are supported.

2)perf/core func perf_sample_regs_intr() extended to update
the perf_arch_regs structure and the perf_arch_reg_mask. Set of new
support functions added perf_get_arch_regs_mask() and
perf_get_arch_reg() to aid the updates from arch/ side.

3) perf/core funcs perf_prepare_sample() and perf_output_sample()
are extended to support the update for the perf_arch_regs_mask and
perf_arch_regs in the sample

4)perf/core func perf_output_sample_regs() extended to dump
the arch_regs to the output sample.

5)Finally, perf tool side is updated a) to include a new element
"arch_regs_mask" in the "struct regs_dump", b) event sample funcs
to updated to include "arch_regs_mask" and c) print functions
are updated.

This foundation patch just extends the perf_regs structure, defines
support function and subsequent patches completes the implimentation
for powerpc arch.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Stephane Eranian <eranian@gmail.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
---
 include/linux/perf_regs.h | 26 ++++++++++++++++++++++++++
 kernel/events/core.c      | 16 ++++++++++++++++
 2 files changed, 42 insertions(+)

Comments

kernel test robot Aug. 28, 2016, 9:22 p.m. UTC | #1
Hi Madhavan,

[auto build test ERROR on tip/perf/core]
[also build test ERROR on v4.8-rc3 next-20160825]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
[Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on]
[Check https://git-scm.com/docs/git-format-patch for more information]

url:    https://github.com/0day-ci/linux/commits/Madhavan-Srinivasan/perf-core-Add-perf_arch_regs-and-mask-to-perf_regs-structure/20160829-050443
config: sparc64-allyesconfig (attached as .config)
compiler: sparc64-linux-gnu-gcc (Debian 5.4.0-6) 5.4.0 20160609
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=sparc64 

All errors (new ones prefixed by >>):

>> kernel/events/core.c:5356:27: error: redefinition of 'perf_get_arch_regs_mask'
    u64 __attribute__((weak)) perf_get_arch_regs_mask()
                              ^
   In file included from include/linux/perf_event.h:54:0,
                    from include/linux/trace_events.h:9,
                    from include/trace/syscall.h:6,
                    from include/linux/syscalls.h:81,
                    from kernel/events/core.c:34:
   include/linux/perf_regs.h:52:5: note: previous definition of 'perf_get_arch_regs_mask' was here
    u64 perf_get_arch_regs_mask(void)
        ^
>> kernel/events/core.c:5361:46: error: redefinition of 'perf_get_arch_reg'
    struct perf_arch_regs *__attribute__((weak)) perf_get_arch_reg()
                                                 ^
   In file included from include/linux/perf_event.h:54:0,
                    from include/linux/trace_events.h:9,
                    from include/trace/syscall.h:6,
                    from include/linux/syscalls.h:81,
                    from kernel/events/core.c:34:
   include/linux/perf_regs.h:57:24: note: previous definition of 'perf_get_arch_reg' was here
    struct perf_arch_regs *perf_get_arch_reg(void)
                           ^
>> kernel/events/core.c:5366:27: error: redefinition of 'perf_arch_reg_value'
    u64 __attribute__((weak)) perf_arch_reg_value(struct perf_arch_regs *regs,
                              ^
   In file included from include/linux/perf_event.h:54:0,
                    from include/linux/trace_events.h:9,
                    from include/trace/syscall.h:6,
                    from include/linux/syscalls.h:81,
                    from kernel/events/core.c:34:
   include/linux/perf_regs.h:62:5: note: previous definition of 'perf_arch_reg_value' was here
    u64 perf_arch_reg_value(struct perf_arch_regs *regs, int idx)
        ^

vim +/perf_get_arch_regs_mask +5356 kernel/events/core.c

  5350	{
  5351		perf_guest_cbs = NULL;
  5352		return 0;
  5353	}
  5354	EXPORT_SYMBOL_GPL(perf_unregister_guest_info_callbacks);
  5355	
> 5356	u64 __attribute__((weak)) perf_get_arch_regs_mask()
  5357	{
  5358		return 0;
  5359	}
  5360	
> 5361	struct perf_arch_regs *__attribute__((weak)) perf_get_arch_reg()
  5362	{
  5363		return 0;
  5364	}
  5365	
> 5366	u64 __attribute__((weak)) perf_arch_reg_value(struct perf_arch_regs *regs,
  5367									int idx)
  5368	{
  5369		return 0;

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
kernel test robot Aug. 28, 2016, 11:41 p.m. UTC | #2
Hi Madhavan,

[auto build test WARNING on tip/perf/core]
[also build test WARNING on v4.8-rc4 next-20160825]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
[Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on]
[Check https://git-scm.com/docs/git-format-patch for more information]

url:    https://github.com/0day-ci/linux/commits/Madhavan-Srinivasan/perf-core-Add-perf_arch_regs-and-mask-to-perf_regs-structure/20160829-050443
config: frv-defconfig (attached as .config)
compiler: frv-linux-gcc (GCC) 4.9.0
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=frv 

All warnings (new ones prefixed by >>):

   kernel/sched/idle.o: In function `perf_get_arch_regs_mask':
   idle.c:(.text+0x0): multiple definition of `perf_get_arch_regs_mask'
   kernel/sched/core.o:core.c:(.text+0x310): first defined here
>> frv-linux-ld: Warning: size of symbol `perf_get_arch_regs_mask' changed from 44 in kernel/sched/core.o to 12 in kernel/sched/idle.o
   kernel/sched/idle.o: In function `perf_get_arch_reg':
   idle.c:(.text+0x10): multiple definition of `perf_get_arch_reg'
   kernel/sched/core.o:core.c:(.text+0x340): first defined here
>> frv-linux-ld: Warning: size of symbol `perf_get_arch_reg' changed from 40 in kernel/sched/core.o to 8 in kernel/sched/idle.o
   kernel/sched/idle.o: In function `perf_arch_reg_value':
   idle.c:(.text+0x20): multiple definition of `perf_arch_reg_value'
   kernel/sched/core.o:core.c:(.text+0x370): first defined here
>> frv-linux-ld: Warning: size of symbol `perf_arch_reg_value' changed from 44 in kernel/sched/core.o to 12 in kernel/sched/idle.o

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
kernel test robot Aug. 29, 2016, 12:21 a.m. UTC | #3
Hi Madhavan,

[auto build test ERROR on tip/perf/core]
[also build test ERROR on v4.8-rc4 next-20160825]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
[Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on]
[Check https://git-scm.com/docs/git-format-patch for more information]

url:    https://github.com/0day-ci/linux/commits/Madhavan-Srinivasan/perf-core-Add-perf_arch_regs-and-mask-to-perf_regs-structure/20160829-050443
config: s390-default_defconfig (attached as .config)
compiler: s390x-linux-gnu-gcc (Debian 5.4.0-6) 5.4.0 20160609
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=s390 

All errors (new ones prefixed by >>):

   security/keys/compat.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   security/keys/keyctl.o:include/linux/perf_regs.h:60: first defined here
   security/keys/compat.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   security/keys/keyctl.o:include/linux/perf_regs.h:55: first defined here
   security/keys/compat.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   security/keys/keyctl.o:include/linux/perf_regs.h:65: first defined here
--
   kernel/bpf/arraymap.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/bpf/syscall.o:include/linux/perf_regs.h:60: first defined here
   kernel/bpf/arraymap.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/bpf/syscall.o:include/linux/perf_regs.h:55: first defined here
   kernel/bpf/arraymap.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/bpf/syscall.o:include/linux/perf_regs.h:65: first defined here
   kernel/bpf/stackmap.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/bpf/syscall.o:include/linux/perf_regs.h:60: first defined here
   kernel/bpf/stackmap.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/bpf/syscall.o:include/linux/perf_regs.h:55: first defined here
   kernel/bpf/stackmap.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/bpf/syscall.o:include/linux/perf_regs.h:65: first defined here
--
   kernel/locking/rtmutex-debug.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/locking/lockdep.o:include/linux/perf_regs.h:55: first defined here
   kernel/locking/rtmutex-debug.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/locking/lockdep.o:include/linux/perf_regs.h:60: first defined here
   kernel/locking/rtmutex-debug.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/locking/lockdep.o:include/linux/perf_regs.h:65: first defined here
--
   kernel/power/process.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/power/qos.o:include/linux/perf_regs.h:60: first defined here
   kernel/power/process.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/power/qos.o:include/linux/perf_regs.h:55: first defined here
   kernel/power/process.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/power/qos.o:include/linux/perf_regs.h:65: first defined here
   kernel/power/hibernate.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/power/qos.o:include/linux/perf_regs.h:60: first defined here
   kernel/power/hibernate.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/power/qos.o:include/linux/perf_regs.h:55: first defined here
   kernel/power/hibernate.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/power/qos.o:include/linux/perf_regs.h:65: first defined here
   kernel/power/snapshot.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/power/qos.o:include/linux/perf_regs.h:60: first defined here
   kernel/power/snapshot.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/power/qos.o:include/linux/perf_regs.h:55: first defined here
   kernel/power/snapshot.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/power/qos.o:include/linux/perf_regs.h:65: first defined here
   kernel/power/user.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/power/qos.o:include/linux/perf_regs.h:60: first defined here
   kernel/power/user.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/power/qos.o:include/linux/perf_regs.h:55: first defined here
   kernel/power/user.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/power/qos.o:include/linux/perf_regs.h:65: first defined here
--
   kernel/rcu/tree.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/rcu/update.o:include/linux/perf_regs.h:60: first defined here
   kernel/rcu/tree.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/rcu/update.o:include/linux/perf_regs.h:55: first defined here
   kernel/rcu/tree.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/rcu/update.o:include/linux/perf_regs.h:65: first defined here
--
   kernel/sched/idle.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/sched/core.o:include/linux/perf_regs.h:60: first defined here
   kernel/sched/idle.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/sched/core.o:include/linux/perf_regs.h:55: first defined here
   kernel/sched/idle.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/sched/core.o:include/linux/perf_regs.h:65: first defined here
--
   kernel/time/timer.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/time/time.o:include/linux/perf_regs.h:60: first defined here
   kernel/time/timer.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/time/time.o:include/linux/perf_regs.h:55: first defined here
   kernel/time/timer.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/time/time.o:include/linux/perf_regs.h:65: first defined here
   kernel/time/hrtimer.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/time/time.o:include/linux/perf_regs.h:60: first defined here
   kernel/time/hrtimer.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/time/time.o:include/linux/perf_regs.h:55: first defined here
   kernel/time/hrtimer.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/time/time.o:include/linux/perf_regs.h:65: first defined here
   kernel/time/itimer.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/time/time.o:include/linux/perf_regs.h:60: first defined here
   kernel/time/itimer.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/time/time.o:include/linux/perf_regs.h:55: first defined here
   kernel/time/itimer.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/time/time.o:include/linux/perf_regs.h:65: first defined here
   kernel/time/posix-timers.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/time/time.o:include/linux/perf_regs.h:60: first defined here
   kernel/time/posix-timers.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/time/time.o:include/linux/perf_regs.h:55: first defined here
   kernel/time/posix-timers.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/time/time.o:include/linux/perf_regs.h:65: first defined here
   kernel/time/posix-clock.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/time/time.o:include/linux/perf_regs.h:60: first defined here
   kernel/time/posix-clock.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/time/time.o:include/linux/perf_regs.h:55: first defined here
   kernel/time/posix-clock.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/time/time.o:include/linux/perf_regs.h:65: first defined here
   kernel/time/tick-common.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/time/time.o:include/linux/perf_regs.h:60: first defined here
   kernel/time/tick-common.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/time/time.o:include/linux/perf_regs.h:55: first defined here
   kernel/time/tick-common.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/time/time.o:include/linux/perf_regs.h:65: first defined here
--
   drivers/s390/scsi/zfcp_ccw.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:60: first defined here
   drivers/s390/scsi/zfcp_ccw.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:55: first defined here
   drivers/s390/scsi/zfcp_ccw.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:65: first defined here
   drivers/s390/scsi/zfcp_dbf.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:60: first defined here
   drivers/s390/scsi/zfcp_dbf.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:55: first defined here
   drivers/s390/scsi/zfcp_dbf.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:65: first defined here
   drivers/s390/scsi/zfcp_erp.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:60: first defined here
   drivers/s390/scsi/zfcp_erp.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:55: first defined here
   drivers/s390/scsi/zfcp_erp.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:65: first defined here
   drivers/s390/scsi/zfcp_fc.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:60: first defined here
   drivers/s390/scsi/zfcp_fc.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:55: first defined here
   drivers/s390/scsi/zfcp_fc.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:65: first defined here
   drivers/s390/scsi/zfcp_fsf.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:60: first defined here
   drivers/s390/scsi/zfcp_fsf.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:55: first defined here
   drivers/s390/scsi/zfcp_fsf.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:65: first defined here
   drivers/s390/scsi/zfcp_qdio.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:60: first defined here
   drivers/s390/scsi/zfcp_qdio.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:55: first defined here
   drivers/s390/scsi/zfcp_qdio.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:65: first defined here
   drivers/s390/scsi/zfcp_scsi.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:60: first defined here
   drivers/s390/scsi/zfcp_scsi.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   drivers/s390/scsi/zfcp_aux.o:include/linux/perf_regs.h:55: first defined here
   drivers/s390/scsi/zfcp_scsi.o: In function `perf_arch_reg_value':
--
   kernel/trace/ring_buffer.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:60: first defined here
   kernel/trace/ring_buffer.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:55: first defined here
   kernel/trace/ring_buffer.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:65: first defined here
   kernel/trace/trace.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:60: first defined here
   kernel/trace/trace.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:55: first defined here
   kernel/trace/trace.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:65: first defined here
   kernel/trace/trace_output.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:60: first defined here
   kernel/trace/trace_output.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:55: first defined here
   kernel/trace/trace_output.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:65: first defined here
   kernel/trace/trace_stat.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:55: first defined here
   kernel/trace/trace_stat.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:60: first defined here
   kernel/trace/trace_stat.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:65: first defined here
   kernel/trace/trace_printk.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:60: first defined here
   kernel/trace/trace_printk.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:55: first defined here
   kernel/trace/trace_printk.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:65: first defined here
   kernel/trace/trace_sched_switch.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:55: first defined here
   kernel/trace/trace_sched_switch.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:60: first defined here
   kernel/trace/trace_sched_switch.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:65: first defined here
   kernel/trace/trace_functions.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:55: first defined here
   kernel/trace/trace_functions.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   kernel/trace/libftrace.o:include/linux/perf_regs.h:60: first defined here
   kernel/trace/trace_functions.o: In function `perf_arch_reg_value':
--
   net/core/built-in.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   net/socket.o:include/linux/perf_regs.h:60: first defined here
   net/core/built-in.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   net/socket.o:include/linux/perf_regs.h:55: first defined here
   net/core/built-in.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   net/socket.o:include/linux/perf_regs.h:65: first defined here
   net/compat.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   net/socket.o:include/linux/perf_regs.h:60: first defined here
   net/compat.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   net/socket.o:include/linux/perf_regs.h:55: first defined here
   net/compat.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   net/socket.o:include/linux/perf_regs.h:65: first defined here
--
   drivers/base/power/main.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   drivers/base/power/qos.o:include/linux/perf_regs.h:60: first defined here
   drivers/base/power/main.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   drivers/base/power/qos.o:include/linux/perf_regs.h:55: first defined here
   drivers/base/power/main.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   drivers/base/power/qos.o:include/linux/perf_regs.h:65: first defined here
   drivers/base/power/wakeup.o: In function `perf_get_arch_reg':
>> include/linux/perf_regs.h:60: multiple definition of `perf_get_arch_reg'
   drivers/base/power/qos.o:include/linux/perf_regs.h:60: first defined here
   drivers/base/power/wakeup.o: In function `perf_get_arch_regs_mask':
>> include/linux/perf_regs.h:55: multiple definition of `perf_get_arch_regs_mask'
   drivers/base/power/qos.o:include/linux/perf_regs.h:55: first defined here
   drivers/base/power/wakeup.o: In function `perf_arch_reg_value':
>> include/linux/perf_regs.h:65: multiple definition of `perf_arch_reg_value'
   drivers/base/power/qos.o:include/linux/perf_regs.h:65: first defined here
..

vim +60 include/linux/perf_regs.h

    49		regs_user->abi = perf_reg_abi(current);
    50	}
    51	
    52	u64 perf_get_arch_regs_mask(void)
    53	{
    54		return 0;
  > 55	}
    56	
    57	struct perf_arch_regs *perf_get_arch_reg(void)
    58	{
    59		return 0;
  > 60	}
    61	
    62	u64 perf_arch_reg_value(struct perf_arch_regs *regs, int idx)
    63	{
    64		return 0;
  > 65	}
    66	#endif /* CONFIG_HAVE_PERF_REGS */
    67	#endif /* _LINUX_PERF_REGS_H */

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Peter Zijlstra Sept. 1, 2016, 7:26 a.m. UTC | #4
On Mon, Aug 29, 2016 at 02:30:46AM +0530, Madhavan Srinivasan wrote:
> It's a perennial request from hardware folks to be able to
> see the raw values of the pmu registers. Partly it's so that
> they can verify perf is doing what they want, and some
> of it is that they're interested in some of the more obscure
> info that isn't plumbed out through other perf interfaces.

How much and what is that? Can't we try and get interfaces sorted?

> Over the years internally have used various hack to get
> the requested data out but this is an attempt to use a
> somewhat standard mechanism (using PERF_SAMPLE_REGS_INTR).

Not really liking that. It assumes too much and doesn't seem to cover
about half the perf use-cases.

It assumes the machine state can be captured by registers (this is false
for things like Intel DS/PT, which have state in memory), it might
assume <= 64 registers but I didn't look that closely, this too might
become somewhat restrictive.

Worse, it doesn't work for !sampling workloads, of which you also very
much want to verify programming etc.

> This would also be helpful for those of us working on the perf
> hardware backends, to be able to verify that we're programming
> things correctly, without resorting to debug printks etc.

On x86 we can trace the MSR writes. No need to add debug printk()s.
We could (and I have on occasion) added tracepoints (well trace_printk)
to the Intel DS memory stores to see what was written there.

Tracing is much more flexible for debugging this stuff.

Can't you do something along those lines?
maddy Sept. 6, 2016, 4:25 a.m. UTC | #5
On Thursday 01 September 2016 12:56 PM, Peter Zijlstra wrote:
> On Mon, Aug 29, 2016 at 02:30:46AM +0530, Madhavan Srinivasan wrote:
>> It's a perennial request from hardware folks to be able to
>> see the raw values of the pmu registers. Partly it's so that
>> they can verify perf is doing what they want, and some
>> of it is that they're interested in some of the more obscure
>> info that isn't plumbed out through other perf interfaces.
> How much and what is that? Can't we try and get interfaces sorted?

We have bunch of registers which exports information regarding the
sampled instruction like SIER/SIAR/SDAR/MMCRA. Lot of bits in these
registers are not yet architected and incase of SIER register, some of
the bits are not plumbed out and we are working on getting some these
exposed via perf.

>
>> Over the years internally have used various hack to get
>> the requested data out but this is an attempt to use a
>> somewhat standard mechanism (using PERF_SAMPLE_REGS_INTR).
> Not really liking that. It assumes too much and doesn't seem to cover
> about half the perf use-cases.
>
> It assumes the machine state can be captured by registers (this is false
> for things like Intel DS/PT, which have state in memory), it might
> assume <= 64 registers but I didn't look that closely, this too might
> become somewhat restrictive.
>
> Worse, it doesn't work for !sampling workloads, of which you also very
> much want to verify programming etc.

Yes, I agree, my bad. I did assume and implemented considering
pmu registers primarily, but we can extend with additional flags
on the content being copied. Good point that patchset not handling
!sampling case. Let me explore on this and also the tracing options.

Thanks for the comments.
Maddy

>
>> This would also be helpful for those of us working on the perf
>> hardware backends, to be able to verify that we're programming
>> things correctly, without resorting to debug printks etc.
> On x86 we can trace the MSR writes. No need to add debug printk()s.
> We could (and I have on occasion) added tracepoints (well trace_printk)
> to the Intel DS memory stores to see what was written there.
>
> Tracing is much more flexible for debugging this stuff.
>
> Can't you do something along those lines?
>
Peter Zijlstra Sept. 6, 2016, 9:10 a.m. UTC | #6
On Tue, Sep 06, 2016 at 09:55:43AM +0530, Madhavan Srinivasan wrote:
> 
> 
> On Thursday 01 September 2016 12:56 PM, Peter Zijlstra wrote:
> >On Mon, Aug 29, 2016 at 02:30:46AM +0530, Madhavan Srinivasan wrote:
> >>It's a perennial request from hardware folks to be able to
> >>see the raw values of the pmu registers. Partly it's so that
> >>they can verify perf is doing what they want, and some
> >>of it is that they're interested in some of the more obscure
> >>info that isn't plumbed out through other perf interfaces.
> >How much and what is that? Can't we try and get interfaces sorted?
> 
> We have bunch of registers which exports information regarding the
> sampled instruction like SIER/SIAR/SDAR/MMCRA. Lot of bits in these
> registers are not yet architected and incase of SIER register, some of
> the bits are not plumbed out and we are working on getting some these
> exposed via perf.

What kind of information is this? I'm not familiar with the Power PMU
all that much, so you'll have to spell it out, not just mention the
registers its stuffed in.
maddy Sept. 9, 2016, 12:44 a.m. UTC | #7
On Tuesday 06 September 2016 02:40 PM, Peter Zijlstra wrote:
> On Tue, Sep 06, 2016 at 09:55:43AM +0530, Madhavan Srinivasan wrote:
>>
>> On Thursday 01 September 2016 12:56 PM, Peter Zijlstra wrote:
>>> On Mon, Aug 29, 2016 at 02:30:46AM +0530, Madhavan Srinivasan wrote:
>>>> It's a perennial request from hardware folks to be able to
>>>> see the raw values of the pmu registers. Partly it's so that
>>>> they can verify perf is doing what they want, and some
>>>> of it is that they're interested in some of the more obscure
>>>> info that isn't plumbed out through other perf interfaces.
>>> How much and what is that? Can't we try and get interfaces sorted?
>> We have bunch of registers which exports information regarding the
>> sampled instruction like SIER/SIAR/SDAR/MMCRA. Lot of bits in these
>> registers are not yet architected and incase of SIER register, some of
>> the bits are not plumbed out and we are working on getting some these
>> exposed via perf.
> What kind of information is this? I'm not familiar with the Power PMU
> all that much, so you'll have to spell it out, not just mention the
> registers its stuffed in.


Sure. When we profile for sample events,
SIER (Sampled Instruction Event Register) provides additional
information about the sampled event when PMI occurred.

SIER [41:42] indicates whether the SIAR(Sampled instruction address 
registers)
and SDAR (Sampled data address register) are valid for the sampled event.

SIER [46:48] indicates the type of intructions,

001 Load Instruction
010 Store instruction
011 Branch Instruction
100 Floating Point Instruction other than a Load or Store instruction
101 Fixed Point Instruction other than a Load or Store instruction
110 Condition Register or System Call Instruction

SIER[49:51] gives information on the source of the sampled
instruction like instruction came from primary, secondary,
tertiary cache or beyond.

SIER[52:55] provide information on branch type instructions
Like mispredict and cause of it.

SIER[56:59] provides information on translation and also
source of translation like TLB, secondary cache, tertiary
or beyond

SIER[60:62] provides the interesting data on the storage
access like L1/l2/L3... so on.

Most of these could be plumbed out through standard mechanisms
and it's all the other bits that are more interesting, but
these are not architected and not public.

Like wise, MMCRA (Monitor Mode Control Register A) is a
configuration register for sampling and thresholding events.
Provide data on various event configuration information.

Link to the PowerISA v2.07 and Chapters 9 describes in
detail on these registers.

https://www.power.org/wp-content/uploads/2013/05/PowerISA_V2.07_PUBLIC.pdf

Maddy


>
diff mbox

Patch

diff --git a/include/linux/perf_regs.h b/include/linux/perf_regs.h
index a5f98d53d732..bd19b15703e2 100644
--- a/include/linux/perf_regs.h
+++ b/include/linux/perf_regs.h
@@ -4,8 +4,14 @@ 
 struct perf_regs {
 	__u64		abi;
 	struct pt_regs	*regs;
+	struct perf_arch_regs	*arch_regs;
+	u64		arch_regs_mask;
 };
 
+#ifndef perf_arch_regs
+struct perf_arch_regs { };
+#endif
+
 #ifdef CONFIG_HAVE_PERF_REGS
 #include <asm/perf_regs.h>
 u64 perf_reg_value(struct pt_regs *regs, int idx);
@@ -14,6 +20,11 @@  u64 perf_reg_abi(struct task_struct *task);
 void perf_get_regs_user(struct perf_regs *regs_user,
 			struct pt_regs *regs,
 			struct pt_regs *regs_user_copy);
+
+u64 perf_get_arch_regs_mask(void);
+struct perf_arch_regs *perf_get_arch_reg(void);
+u64 perf_arch_reg_value(struct perf_arch_regs *regs, int idx);
+
 #else
 static inline u64 perf_reg_value(struct pt_regs *regs, int idx)
 {
@@ -37,5 +48,20 @@  static inline void perf_get_regs_user(struct perf_regs *regs_user,
 	regs_user->regs = task_pt_regs(current);
 	regs_user->abi = perf_reg_abi(current);
 }
+
+u64 perf_get_arch_regs_mask(void)
+{
+	return 0;
+}
+
+struct perf_arch_regs *perf_get_arch_reg(void)
+{
+	return 0;
+}
+
+u64 perf_arch_reg_value(struct perf_arch_regs *regs, int idx)
+{
+	return 0;
+}
 #endif /* CONFIG_HAVE_PERF_REGS */
 #endif /* _LINUX_PERF_REGS_H */
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 3f07e6cfc1b6..2f6e6a16b117 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -5353,6 +5353,22 @@  int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs)
 }
 EXPORT_SYMBOL_GPL(perf_unregister_guest_info_callbacks);
 
+u64 __attribute__((weak)) perf_get_arch_regs_mask()
+{
+	return 0;
+}
+
+struct perf_arch_regs *__attribute__((weak)) perf_get_arch_reg()
+{
+	return 0;
+}
+
+u64 __attribute__((weak)) perf_arch_reg_value(struct perf_arch_regs *regs,
+								int idx)
+{
+	return 0;
+}
+
 static void
 perf_output_sample_regs(struct perf_output_handle *handle,
 			struct pt_regs *regs, u64 mask)