Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 31 Mar 2012 20:34:04 +0000 (13:34 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 31 Mar 2012 20:34:04 +0000 (13:34 -0700)
Pull perf updates and fixes from Ingo Molnar:
 "It's mostly fixes, but there's also two late items:

   - preliminary GTK GUI support for perf report
   - PMU raw event format descriptors in sysfs, to be parsed by tooling

  The raw event format in sysfs is a new ABI.  For example for the 'CPU'
  PMU we have:

    aldebaran:~> ll /sys/bus/event_source/devices/cpu/format/*
    -r--r--r--. 1 root root 4096 Mar 31 10:29 /sys/bus/event_source/devices/cpu/format/any
    -r--r--r--. 1 root root 4096 Mar 31 10:29 /sys/bus/event_source/devices/cpu/format/cmask
    -r--r--r--. 1 root root 4096 Mar 31 10:29 /sys/bus/event_source/devices/cpu/format/edge
    -r--r--r--. 1 root root 4096 Mar 31 10:29 /sys/bus/event_source/devices/cpu/format/event
    -r--r--r--. 1 root root 4096 Mar 31 10:29 /sys/bus/event_source/devices/cpu/format/inv
    -r--r--r--. 1 root root 4096 Mar 31 10:29 /sys/bus/event_source/devices/cpu/format/offcore_rsp
    -r--r--r--. 1 root root 4096 Mar 31 10:29 /sys/bus/event_source/devices/cpu/format/pc
    -r--r--r--. 1 root root 4096 Mar 31 10:29 /sys/bus/event_source/devices/cpu/format/umask

  those lists of fields contain a specific format:

    aldebaran:~> cat /sys/bus/event_source/devices/cpu/format/offcore_rsp
    config1:0-63

  So, those who wish to specify raw events can now use the following
  event format:

    -e cpu/cmask=1,event=2,umask=3

  Most people will not want to specify any events (let alone raw
  events), they'll just use whatever default event the tools use.

  But for more obscure PMU events that have no cross-architecture
  generic events the above syntax is more usable and a bit more
  structured than specifying hex numbers."

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (41 commits)
  perf tools: Remove auto-generated bison/flex files
  perf annotate: Fix off by one symbol hist size allocation and hit accounting
  perf tools: Add missing ref-cycles event back to event parser
  perf annotate: addr2line wants addresses in same format as objdump
  perf probe: Finder fails to resolve function name to address
  tracing: Fix ent_size in trace output
  perf symbols: Handle NULL dso in dso__name_len
  perf symbols: Do not include libgen.h
  perf tools: Fix bug in raw sample parsing
  perf tools: Fix display of first level of callchains
  perf tools: Switch module.h into export.h
  perf: Move mmap page data_head offset assertion out of header
  perf: Fix mmap_page capabilities and docs
  perf diff: Fix to work with new hists design
  perf tools: Fix modifier to be applied on correct events
  perf tools: Fix various casting issues for 32 bits
  perf tools: Simplify event_read_id exit path
  tracing: Fix ftrace stack trace entries
  tracing: Move the tracing_on/off() declarations into CONFIG_TRACING
  perf report: Add a simple GTK2-based 'perf report' browser
  ...

1  2 
arch/x86/kernel/cpu/perf_event.c
include/linux/kernel.h

index 40883ffe2da9261b4f34c2997d2b5e533df25648,f02672a6617e38b5cfe6cda366a66b021a49620a..bb8e03407e183fa24be61cf6c9432c7a7ffe68c9
@@@ -29,6 -29,7 +29,6 @@@
  #include <asm/apic.h>
  #include <asm/stacktrace.h>
  #include <asm/nmi.h>
 -#include <asm/compat.h>
  #include <asm/smp.h>
  #include <asm/alternative.h>
  #include <asm/timer.h>
@@@ -1313,6 -1314,11 +1313,11 @@@ static void __init pmu_check_apic(void
        pr_info("no hardware sampling interrupt available.\n");
  }
  
+ static struct attribute_group x86_pmu_format_group = {
+       .name = "format",
+       .attrs = NULL,
+ };
  static int __init init_hw_perf_events(void)
  {
        struct x86_pmu_quirk *quirk;
        }
  
        x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */
+       x86_pmu_format_group.attrs = x86_pmu.format_attrs;
  
        pr_info("... version:                %d\n",     x86_pmu.version);
        pr_info("... bit width:              %d\n",     x86_pmu.cntval_bits);
@@@ -1615,6 -1622,9 +1621,9 @@@ static int x86_pmu_event_idx(struct per
  {
        int idx = event->hw.idx;
  
+       if (!x86_pmu.attr_rdpmc)
+               return 0;
        if (x86_pmu.num_counters_fixed && idx >= X86_PMC_IDX_FIXED) {
                idx -= X86_PMC_IDX_FIXED;
                idx |= 1 << 30;
@@@ -1667,6 -1677,7 +1676,7 @@@ static struct attribute_group x86_pmu_a
  
  static const struct attribute_group *x86_pmu_attr_groups[] = {
        &x86_pmu_attr_group,
+       &x86_pmu_format_group,
        NULL,
  };
  
@@@ -1698,14 -1709,19 +1708,19 @@@ static struct pmu pmu = 
        .flush_branch_stack     = x86_pmu_flush_branch_stack,
  };
  
- void perf_update_user_clock(struct perf_event_mmap_page *userpg, u64 now)
+ void arch_perf_update_userpage(struct perf_event_mmap_page *userpg, u64 now)
  {
+       userpg->cap_usr_time = 0;
+       userpg->cap_usr_rdpmc = x86_pmu.attr_rdpmc;
+       userpg->pmc_width = x86_pmu.cntval_bits;
        if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
                return;
  
        if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
                return;
  
+       userpg->cap_usr_time = 1;
        userpg->time_mult = this_cpu_read(cyc2ns);
        userpg->time_shift = CYC2NS_SCALE_FACTOR;
        userpg->time_offset = this_cpu_read(cyc2ns_offset) - now;
@@@ -1747,9 -1763,6 +1762,9 @@@ perf_callchain_kernel(struct perf_callc
  }
  
  #ifdef CONFIG_COMPAT
 +
 +#include <asm/compat.h>
 +
  static inline int
  perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry *entry)
  {
diff --combined include/linux/kernel.h
index a5375e7f3feac423fa6325280276e17dcf5351f6,92c10262d34607102defc5d156ef1d42b0feea83..645231c373c8a5b5684e806a9d13647d1eb3300e
@@@ -1,8 -1,6 +1,8 @@@
  #ifndef _LINUX_KERNEL_H
  #define _LINUX_KERNEL_H
  
 +#include <linux/sysinfo.h>
 +
  /*
   * 'kernel.h' contains some often-used function prototypes etc
   */
@@@ -430,16 -428,10 +430,10 @@@ extern int __must_check hex2bin(u8 *dst
   * Most likely, you want to use tracing_on/tracing_off.
   */
  #ifdef CONFIG_RING_BUFFER
- void tracing_on(void);
- void tracing_off(void);
  /* trace_off_permanent stops recording with no way to bring it back */
  void tracing_off_permanent(void);
- int tracing_is_on(void);
  #else
- static inline void tracing_on(void) { }
- static inline void tracing_off(void) { }
  static inline void tracing_off_permanent(void) { }
- static inline int tracing_is_on(void) { return 0; }
  #endif
  
  enum ftrace_dump_mode {
  };
  
  #ifdef CONFIG_TRACING
+ void tracing_on(void);
+ void tracing_off(void);
+ int tracing_is_on(void);
  extern void tracing_start(void);
  extern void tracing_stop(void);
  extern void ftrace_off_permanent(void);
@@@ -533,6 -529,11 +531,11 @@@ static inline void tracing_start(void) 
  static inline void tracing_stop(void) { }
  static inline void ftrace_off_permanent(void) { }
  static inline void trace_dump_stack(void) { }
+ static inline void tracing_on(void) { }
+ static inline void tracing_off(void) { }
+ static inline int tracing_is_on(void) { return 0; }
  static inline int
  trace_printk(const char *fmt, ...)
  {
@@@ -700,8 -701,27 +703,8 @@@ static inline void ftrace_dump(enum ftr
  # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD
  #endif
  
 -struct sysinfo;
  extern int do_sysinfo(struct sysinfo *info);
  
  #endif /* __KERNEL__ */
  
 -#define SI_LOAD_SHIFT 16
 -struct sysinfo {
 -      long uptime;                    /* Seconds since boot */
 -      unsigned long loads[3];         /* 1, 5, and 15 minute load averages */
 -      unsigned long totalram;         /* Total usable main memory size */
 -      unsigned long freeram;          /* Available memory size */
 -      unsigned long sharedram;        /* Amount of shared memory */
 -      unsigned long bufferram;        /* Memory used by buffers */
 -      unsigned long totalswap;        /* Total swap space size */
 -      unsigned long freeswap;         /* swap space still available */
 -      unsigned short procs;           /* Number of current processes */
 -      unsigned short pad;             /* explicit padding for m68k */
 -      unsigned long totalhigh;        /* Total high memory size */
 -      unsigned long freehigh;         /* Available high memory size */
 -      unsigned int mem_unit;          /* Memory unit size in bytes */
 -      char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
 -};
 -
  #endif