Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
Linus Torvalds [Wed, 26 Oct 2011 15:03:38 +0000 (17:03 +0200)]
* 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (121 commits)
  perf symbols: Increase symbol KSYM_NAME_LEN size
  perf hists browser: Refuse 'a' hotkey on non symbolic views
  perf ui browser: Use libslang to read keys
  perf tools: Fix tracing info recording
  perf hists browser: Elide DSO column when it is set to just one DSO, ditto for threads
  perf hists: Don't consider filtered entries when calculating column widths
  perf hists: Don't decay total_period for filtered entries
  perf hists browser: Honour symbol_conf.show_{nr_samples,total_period}
  perf hists browser: Do not exit on tab key with single event
  perf annotate browser: Don't change selection line when returning from callq
  perf tools: handle endianness of feature bitmap
  perf tools: Add prelink suggestion to dso update message
  perf script: Fix unknown feature comment
  perf hists browser: Apply the dso and thread filters when merging new batches
  perf hists: Move the dso and thread filters from hist_browser
  perf ui browser: Honour the xterm colors
  perf top tui: Give color hints just on the percentage, like on --stdio
  perf ui browser: Make the colors configurable and change the defaults
  perf tui: Remove unneeded call to newtCls on startup
  perf hists: Don't format the percentage on hist_entry__snprintf
  ...

Fix up conflicts in arch/x86/kernel/kprobes.c manually.

Ingo's tree did the insane "add volatile to const array", which just
doesn't make sense ("volatile const"?).  But we could remove the const
*and* make the array volatile to make doubly sure that gcc doesn't
optimize it away..

Also fix up kernel/trace/ring_buffer.c non-data-conflicts manually: the
reader_lock has been turned into a raw lock by the core locking merge,
and there was a new user of it introduced in this perf core merge.  Make
sure that new use also uses the raw accessor functions.

1  2 
arch/x86/kernel/kprobes.c
arch/x86/kernel/process_32.c
arch/x86/oprofile/nmi_int.c
kernel/trace/Makefile
kernel/trace/ring_buffer.c
kernel/trace/trace.c
kernel/trace/trace_irqsoff.c

@@@ -75,10 -75,10 +75,11 @@@ DEFINE_PER_CPU(struct kprobe_ctlblk, kp
        /*
         * Undefined/reserved opcodes, conditional jump, Opcode Extension
         * Groups, and some special opcodes can not boost.
-        * This is non-const to keep gcc from statically optimizing it out, as
-        * variable_test_bit makes gcc think only *(unsigned long*) is used.
 -       * This is volatile to keep gcc from statically optimizing it out, as
 -       * variable_test_bit makes gcc think only *(unsigned long*) is used.
++       * This is non-const and volatile to keep gcc from statically
++       * optimizing it out, as variable_test_bit makes gcc think only
++       * *(unsigned long*) is used. 
         */
- static u32 twobyte_is_boostable[256 / 32] = {
 -static volatile const u32 twobyte_is_boostable[256 / 32] = {
++static volatile u32 twobyte_is_boostable[256 / 32] = {
        /*      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f          */
        /*      ----------------------------------------------          */
        W(0x00, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0) | /* 00 */
Simple merge
Simple merge
Simple merge
@@@ -2661,6 -2674,58 +2674,58 @@@ rb_num_of_entries(struct ring_buffer_pe
  }
  
  /**
+  * ring_buffer_oldest_event_ts - get the oldest event timestamp from the buffer
+  * @buffer: The ring buffer
+  * @cpu: The per CPU buffer to read from.
+  */
+ unsigned long ring_buffer_oldest_event_ts(struct ring_buffer *buffer, int cpu)
+ {
+       unsigned long flags;
+       struct ring_buffer_per_cpu *cpu_buffer;
+       struct buffer_page *bpage;
+       unsigned long ret;
+       if (!cpumask_test_cpu(cpu, buffer->cpumask))
+               return 0;
+       cpu_buffer = buffer->buffers[cpu];
 -      spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
++      raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
+       /*
+        * if the tail is on reader_page, oldest time stamp is on the reader
+        * page
+        */
+       if (cpu_buffer->tail_page == cpu_buffer->reader_page)
+               bpage = cpu_buffer->reader_page;
+       else
+               bpage = rb_set_head_page(cpu_buffer);
+       ret = bpage->page->time_stamp;
 -      spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
++      raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(ring_buffer_oldest_event_ts);
+ /**
+  * ring_buffer_bytes_cpu - get the number of bytes consumed in a cpu buffer
+  * @buffer: The ring buffer
+  * @cpu: The per CPU buffer to read from.
+  */
+ unsigned long ring_buffer_bytes_cpu(struct ring_buffer *buffer, int cpu)
+ {
+       struct ring_buffer_per_cpu *cpu_buffer;
+       unsigned long ret;
+       if (!cpumask_test_cpu(cpu, buffer->cpumask))
+               return 0;
+       cpu_buffer = buffer->buffers[cpu];
+       ret = local_read(&cpu_buffer->entries_bytes) - cpu_buffer->read_bytes;
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(ring_buffer_bytes_cpu);
+ /**
   * ring_buffer_entries_cpu - get the number of entries in a cpu buffer
   * @buffer: The ring buffer
   * @cpu: The per CPU buffer to get the entries from.
Simple merge
Simple merge