perf fixes
Subsystems (2)
Linus,
Please pull the latest perf-fixes-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git perf-fixes-for-linus
Thanks,
Ingo
------------------>
Arnaldo Carvalho de Melo (2):
perf tools: Honour the cpu list parameter when also monitoring a thread list perf evlist: Fix per thread mmap setup
Jiri Olsa (1):
kprobes, x86: Disable irqs during optimized callback
arch/x86/kernel/kprobes.c | 5 +- tools/perf/builtin-record.c | 2 +- tools/perf/builtin-test.c | 2 +- tools/perf/builtin-top.c | 8 +- tools/perf/util/evlist.c | 153 ++++++++++++++++++++++++++++++------------- tools/perf/util/evlist.h | 3 +- tools/perf/util/python.c | 2 +- 7 files changed, 119 insertions(+), 56 deletions(-)
arch/x86/kernel/kprobes.c +3 -2
@@ -1183,12 +1183,13 @@ static void __kprobes optimized_callback(struct optimized_kprobe *op, struct pt_regs *regs) {struct kprobe_ctlblk *kcb =get_kprobe_ctlblk (); +unsigned long flags;/* This is possible if op is under delayed unoptimizing */ if (kprobe_disabled (&op->kp))return ; -preempt_disable (); +local_irq_save (flags);if (kprobe_running ()) {kprobes_inc_nmissed_count (&op->kp); }else {
@@ -1207,7 +1208,7 @@ static void __kprobes optimized_callback(struct optimized_kprobe *op,opt_pre_handler (&op->kp, regs);__this_cpu_write (current_kprobe,NULL ); } -preempt_enable_no_resched (); +local_irq_restore (flags); }static int __kprobes copy_optimized_instructions (u8 *dest,u8 *src)
tools/perf/builtin-record.c +1 -1
@@ -427,7 +427,7 @@ static void mmap_read_all(void) {int i; -for (i =0 ; i < evsel_list->cpus->nr; i++) { +for (i =0 ; i < evsel_list->nr_mmaps; i++) {if (evsel_list->mmap[i].base)mmap_read (&evsel_list->mmap[i]); }
tools/perf/builtin-test.c +1 -1
@@ -549,7 +549,7 @@ static int test__basic_mmap(void) ++foo; } -while ((event =perf_evlist__read_on_cpu (evlist,0 )) !=NULL ) { +while ((event =perf_evlist__mmap_read (evlist,0 )) !=NULL ) {struct perf_sample sample;if (event->header.type !=PERF_RECORD_SAMPLE ) {
tools/perf/builtin-top.c +4 -4
@@ -801,12 +801,12 @@ static void perf_event__process_sample(const union perf_event *event, } } -static void perf_session__mmap_read_cpu (struct perf_session *self,int cpu) +static void perf_session__mmap_read_idx (struct perf_session *self,int idx) {struct perf_sample sample;union perf_event *event; -while ((event =perf_evlist__read_on_cpu (top.evlist, cpu)) !=NULL ) { +while ((event =perf_evlist__mmap_read (top.evlist, idx)) !=NULL ) {perf_session__parse_sample (self, event, &sample);if (event->header.type ==PERF_RECORD_SAMPLE )
@@ -820,8 +820,8 @@ static void perf_session__mmap_read(struct perf_session *self) {int i; -for (i =0 ; i < top.evlist->cpus->nr; i++) -perf_session__mmap_read_cpu (self, i); +for (i =0 ; i < top.evlist->nr_mmaps; i++) +perf_session__mmap_read_idx (self, i); }static void start_counters (struct perf_evlist *evlist)
tools/perf/util/evlist.c +107 -46
216 lines not on this page · raw message
tools/perf/util/evlist.h +2 -1
@@ -17,6 +17,7 @@ struct perf_evlist {struct hlist_head heads[PERF_EVLIST__HLIST_SIZE ];int nr_entries;int nr_fds; +int nr_mmaps;int mmap_len;bool overwrite;union perf_event event_copy;
@@ -46,7 +47,7 @@ void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd);struct perf_evsel *perf_evlist__id2evsel (struct perf_evlist *evlist,u64 id); -union perf_event *perf_evlist__read_on_cpu (struct perf_evlist *self,int cpu); +union perf_event *perf_evlist__mmap_read (struct perf_evlist *self,int idx);int perf_evlist__alloc_mmap (struct perf_evlist *evlist);int perf_evlist__mmap (struct perf_evlist *evlist,int pages,bool overwrite);
tools/perf/util/python.c +1 -1
@@ -680,7 +680,7 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, &cpu, &sample_id_all))return NULL ; - event =perf_evlist__read_on_cpu (evlist, cpu); + event =perf_evlist__mmap_read (evlist, cpu);if (event !=NULL ) {struct perf_evsel *first;PyObject *pyevent =pyrf_event__new (event);