perf/core improvements and fixes
Jiri Olsa
reviewerhi Ingo,
please consider pulling
thanks,
jirka
The following changes since commit 3e46d21285577a8c9e4c37f9b1002e567c440b28:
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf into perf/core (2014-05-05 19:37:51 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git tags/perf-core-for-mingo
for you to fetch changes up to 13ce34df11833482cd698331fdbb3f8ced06340d:
perf tools: Use tid for finding thread (2014-05-12 11:09:50 +0200)
----------------------------------------------------------------
perf/core improvements and fixes:
. Propagate exit status of a command line workload for
record command (Namhyung Kim)
. Use tid for finding thread (Namhyung Kim)
. Clarify the output of perf sched map plus small sched
command fixies (Dongsheng Yang)
----------------------------------------------------------------
Dongsheng (3):
perf tools: Add missing event for perf sched record.
perf tools: Adapt the TASK_STATE_TO_CHAR_STR to new value in kernel space. perf tools: Clarify the output of perf sched map.
Namhyung Kim (3):
perf record: Propagate exit status of a command line workload perf tools: Get rid of on_exit() feature test
perf tools: Use tid for finding thread
tools/perf/builtin-inject.c | 2 +- tools/perf/builtin-kmem.c | 2 +- tools/perf/builtin-record.c | 158 +++++++++--------------- tools/perf/builtin-sched.c | 38 +++--- tools/perf/config/Makefile | 8 -- tools/perf/config/feature-checks/Makefile | 4 - tools/perf/config/feature-checks/test-all.c | 5 - tools/perf/config/feature-checks/test-on-exit.c | 16 --- tools/perf/tests/code-reading.c | 2 +- tools/perf/tests/hists_filter.c | 1 + tools/perf/tests/hists_link.c | 2 + tools/perf/util/build-id.c | 2 +- tools/perf/util/event.c | 2 +- 13 files changed, 90 insertions(+), 152 deletions(-) delete mode 100644 tools/perf/config/feature-checks/test-on-exit.c
Jiri Olsa
reviewerPATCH 1/6 perf tools: Add missing event for perf sched record.
From: Dongsheng <[email protected]>
We should record and process sched:sched_wakeup_new event in perf sched tool, but currently, there is the process function for it, without recording it in record subcommand.
This patch add -e sched:sched_wakeup_new to perf sched record.
--- tools/perf/builtin-sched.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/builtin-sched.c +1 -0
@@ -1635,6 +1635,7 @@ static int __cmd_record(int argc, const char **argv)"-e" ,"sched:sched_stat_runtime" ,"-e" ,"sched:sched_process_fork" ,"-e" ,"sched:sched_wakeup" , +"-e" ,"sched:sched_wakeup_new" , "-e", "sched:sched_migrate_task", };
Signature · 1 line
1.8.3.1
Jiri Olsa
reviewerPATCH 2/6 perf tools: Adapt the TASK_STATE_TO_CHAR_STR to new value in kernel space.
In reply to Jiri OlsaFrom: Dongsheng <[email protected]>
Currently, TASK_STATE_TO_CHAR_STR in kernel space is already expanded to RSDTtZXxKWP, but it is still RSDTtZX in perf sched tool.
This patch update TASK_STATE_TO_CHAR_STR to the new value in kernel space.
--- tools/perf/builtin-sched.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-sched.c +1 -1
@@ -66,7 +66,7 @@ struct sched_atom {struct task_desc *wakee; }; -#define TASK_STATE_TO_CHAR_STR "RSDTtZX" +#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKWP"enum thread_state {THREAD_SLEEPING =0 ,
Signature · 1 line
1.8.3.1
Jiri Olsa
reviewerPATCH 3/6 perf tools: Clarify the output of perf sched map.
In reply to Jiri OlsaFrom: Dongsheng <[email protected]>
In output of perf sched map, any shortname of thread will be explained at the first time when it appear.
Example:
*A0 228836.978985 secs A0 => perf:23032
*. A0 228836.979016 secs B0 => swapper:0
. *C0 228836.979099 secs C0 => migration/3:22
*A0 . C0 228836.979115 secs
A0 . *. 228836.979115 secsBut B0, which is explained as swapper:0 did not appear in the left part of output. Instead, we use '.' as the shortname of swapper:0. So the comment of "B0 => swapper:0" is not easy to understand.
This patch clarify the output of perf sched map with not allocating one letter-number shortname for swapper:0 and print ". => swapper:0" as the explanation for swapper:0.
Example:
*A0 228836.978985 secs A0 => perf:23032
* . A0 228836.979016 secs . => swapper:0
. *B0 228836.979099 secs B0 => migration/3:22
*A0 . B0 228836.979115 secs
A0 . * . 228836.979115 secs
A0 *C0 . 228836.979225 secs C0 => ksoftirqd/2:18
A0 *D0 . 228836.979236 secs D0 => rcu_sched:7--- tools/perf/builtin-sched.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-)
tools/perf/builtin-sched.c +20 -15
@@ -1300,17 +1300,25 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel, new_shortname =0 ;if (!sched_in->shortname[0 ]) { - sched_in->shortname[0 ] = sched->next_shortname1; - sched_in->shortname[1 ] = sched->next_shortname2; - -if (sched->next_shortname1 <'Z' ) { - sched->next_shortname1++; +if (!strcmp (thread__comm_str (sched_in),"swapper" )) { +/* +* Don't allocate a letter-number for swapper:0 +* as a shortname. Instead, we use '.' for it. +*/ + sched_in->shortname[0 ] ='.' ; + sched_in->shortname[1 ] =' ' ; }else { - sched->next_shortname1='A' ; -if (sched->next_shortname2 <'9' ) { - sched->next_shortname2++; + sched_in->shortname[0 ] = sched->next_shortname1; + sched_in->shortname[1 ] = sched->next_shortname2; + +if (sched->next_shortname1 <'Z' ) { + sched->next_shortname1++; }else { - sched->next_shortname2='0' ; + sched->next_shortname1 ='A' ; +if (sched->next_shortname2 <'9' ) + sched->next_shortname2++; +else + sched->next_shortname2 ='0' ; } } new_shortname =1 ;
@@ -1322,12 +1330,9 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel,else printf ("*" ); -if (sched->curr_thread[cpu]) { -if (sched->curr_thread[cpu]->tid) -printf ("%2s " , sched->curr_thread[cpu]->shortname); -else -printf (". " ); - }else +if (sched->curr_thread[cpu]) +printf ("%2s " , sched->curr_thread[cpu]->shortname); +else printf (" " ); }
Signature · 1 line
1.8.3.1
Jiri Olsa
reviewerPATCH 4/6 perf record: Propagate exit status of a command line workload
In reply to Jiri OlsaFrom: Namhyung Kim <[email protected]>
Currently perf record doesn't propagate the exit status of a workload given by the command line. But sometimes it'd useful if it's propagated so that a monitoring script can handle errors appropriately.
To do that, it moves most of logic out of the exit handlers and run them directly in the __cmd_record(). The only thing needs to be done in the handler is propagating terminating signal so that the shell can terminate its loop properly when Ctrl-C was pressed. Also it cleaned up the resource management code in record__exit().
With this change, perf record returns the child exit status in case of normal termination and send signal to itself when terminated by signal.
Example run of Stephane's case:
$ perf record true && echo yes || echo no [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.013 MB perf.data (~589 samples) ] yes
$ perf record false && echo yes || echo no [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.013 MB perf.data (~589 samples) ] no
Jiri's case (error in parent):
$ perf record -m 10G true && echo yes || echo no rounding mmap pages size to 17179869184 bytes (4194304 pages) failed to mmap with 12 (Cannot allocate memory) no
$ ulimit -n 6 $ perf record sleep 1 && echo yes || echo no failed to create 'go' pipe: Too many open files Couldn't run the workload! no
And Peter's case (interrupted by signal):
$ while :; do perf record sleep 1; done ^C[ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.014 MB perf.data (~593 samples) ]
--- tools/perf/builtin-record.c | 127 +++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 67 deletions(-)
tools/perf/builtin-record.c +60 -67
@@ -147,29 +147,19 @@ static void sig_handler(int sig) {if (sig ==SIGCHLD ) child_finished =1 ; +else + signr = sig; done =1 ; - signr = sig; } -static void record__sig_exit (int exit_status__maybe_unused ,void *arg) +static void record__sig_exit (void ) { -struct record *rec = arg; -int status; - -if (rec->evlist->workload.pid >0 ) { -if (!child_finished) -kill (rec->evlist->workload.pid,SIGTERM ); - -wait (&status); -if (WIFSIGNALED (status)) -psignal (WTERMSIG (status), rec->progname); - } - -if (signr ==-1 || signr ==SIGUSR1 ) +if (signr ==-1 )return ;signal (signr,SIG_DFL ); +raise (signr); }static int record__open (struct record *rec)
@@ -243,27 +233,6 @@ static int process_buildids(struct record *rec) size, &build_id__mark_dso_hit_ops); } -static void record__exit (int status,void *arg) -{ -struct record *rec = arg; -struct perf_data_file *file = &rec->file; - -if (status !=0 ) -return ; - -if (!file->is_pipe) { - rec->session->header.data_size += rec->bytes_written; - -if (!rec->no_buildid) -process_buildids (rec); -perf_session__write_header (rec->session, rec->evlist, - file->fd, true); -perf_session__delete (rec->session); -perf_evlist__delete (rec->evlist); -symbol__exit (); - } -} -static void perf_event__synthesize_guest_os (struct machine *machine,void *data) {int err;
@@ -344,18 +313,19 @@ static volatile int workload_exec_errno;* if the fork fails, since we asked by setting its * want_signal to true. */ -static void workload_exec_failed_signal (int signo,siginfo_t *info, +static void workload_exec_failed_signal (int signo__maybe_unused , +siginfo_t *info,void *ucontext__maybe_unused ) { workload_exec_errno = info->si_value.sival_int; done =1 ; - signr = signo; child_finished =1 ; }static int __cmd_record (struct record *rec,int argc,const char **argv) {int err; +int status =0 ;unsigned long waking =0 ;const bool forks = argc >0 ;struct machine *machine;
@@ -367,7 +337,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) rec->progname = argv[0 ]; -on_exit (record__sig_exit, rec); +atexit (record__sig_exit);signal (SIGCHLD , sig_handler);signal (SIGINT , sig_handler);signal (SIGTERM , sig_handler);
@@ -388,32 +358,28 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) workload_exec_failed_signal);if (err <0 ) {pr_err ("Couldn't run the workload!\n" ); + status = err; goto out_delete_session; } }if (record__open (rec) !=0 ) { err =-1 ; - goto out_delete_session; + goto out_child; }if (!rec->evlist->nr_groups)perf_header__clear_feat (&session->header,HEADER_GROUP_DESC ); -/* -* perf_session__delete(session) will be called at record__exit() -*/ -on_exit (record__exit, rec); -if (file->is_pipe) { err =perf_header__write_pipe (file->fd);if (err <0 ) - goto out_delete_session; + goto out_child; }else { err =perf_session__write_header (session, rec->evlist, file->fd, false);if (err <0 ) - goto out_delete_session; + goto out_child; } if (!rec->no_buildid
@@ -421,7 +387,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)pr_err ("Couldn't generate buildids. " "Use --no-buildid to profile anyway.\n" ); err =-1 ; - goto out_delete_session; + goto out_child; } machine = &session->machines.host;
@@ -431,7 +397,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) process_synthesized_event);if (err <0 ) {pr_err ("Couldn't synthesize attrs.\n" ); - goto out_delete_session; + goto out_child; }if (have_tracepoints (&rec->evlist->entries)) {
@@ -447,7 +413,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) process_synthesized_event);if (err <=0 ) {pr_err ("Couldn't record tracing data.\n" ); - goto out_delete_session; + goto out_child; } rec->bytes_written += err; }
@@ -475,7 +441,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) err =__machine__synthesize_threads (machine, tool, &opts->target, rec->evlist->threads, process_synthesized_event, opts->sample_address);if (err !=0 ) - goto out_delete_session; + goto out_child;if (rec->realtime_prio) {struct sched_param param;
@@ -484,7 +450,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)if (sched_setscheduler (0 ,SCHED_FIFO , ¶m)) {pr_err ("Could not set realtime priority.\n" ); err =-1 ; - goto out_delete_session; + goto out_child; } }
@@ -512,13 +478,15 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)if (record__mmap_read_all (rec) <0 ) { err =-1 ; - goto out_delete_session; + goto out_child; }if (hits == rec->samples) {if (done)break ; err =poll (rec->evlist->pollfd, rec->evlist->nr_fds,-1 ); +if (err <0 && errno ==EINTR ) + err =0 ; waking++; }
@@ -538,28 +506,52 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)const char *emsg =strerror_r (workload_exec_errno, msg,sizeof (msg));pr_err ("Workload failed: %s\n" , emsg); err =-1 ; - goto out_delete_session; + goto out_child; } -if (quiet || signr ==SIGUSR1 ) -return 0 ; +if (!quiet) { +fprintf (stderr,"[ perf record: Woken up %ld times to write data ]\n" , waking); -fprintf (stderr,"[ perf record: Woken up %ld times to write data ]\n" , waking); +/* +* Approximate RIP event size: 24 bytes. +*/ +fprintf (stderr, +"[ perf record: Captured and wrote %.3f MB %s (~%" PRIu64" samples) ]\n" , + (double )rec->bytes_written /1024.0 /1024.0 , + file->path, + rec->bytes_written /24 ); + } -/* -* Approximate RIP event size: 24 bytes. -*/ -fprintf (stderr, -"[ perf record: Captured and wrote %.3f MB %s (~%" PRIu64" samples) ]\n" , - (double )rec->bytes_written /1024.0 /1024.0 , - file->path, - rec->bytes_written /24 ); +out_child: +if (forks) { +int exit_status; -return 0 ; +if (!child_finished) +kill (rec->evlist->workload.pid,SIGTERM ); + +wait (&exit_status); + +if (err <0 ) + status = err; +else if (WIFEXITED (exit_status)) + status =WEXITSTATUS (exit_status); +else if (WIFSIGNALED (exit_status)) + signr =WTERMSIG (exit_status); + }else + status = err; + +if (!err && !file->is_pipe) { + rec->session->header.data_size += rec->bytes_written; + +if (!rec->no_buildid) +process_buildids (rec); +perf_session__write_header (rec->session, rec->evlist, + file->fd, true); + } out_delete_session:perf_session__delete (session); -return err; +return status; }#define BRANCH_OPT (n, m) \
@@ -988,6 +980,7 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused) err =__cmd_record (&record, argc, argv); out_symbol_exit: +perf_evlist__delete (rec->evlist);symbol__exit ();return err; }
Signature · 1 line
1.8.3.1
Jiri Olsa
reviewerPATCH 5/6 perf tools: Get rid of on_exit() feature test
In reply to Jiri OlsaFrom: Namhyung Kim <[email protected]>
The on_exit() function was only used in perf record but it's gone in previous patch.
--- tools/perf/builtin-record.c | 31 ------------------------- tools/perf/config/Makefile | 8 ------- tools/perf/config/feature-checks/Makefile | 4 ---- tools/perf/config/feature-checks/test-all.c | 5 ---- tools/perf/config/feature-checks/test-on-exit.c | 16 ------------- 5 files changed, 64 deletions(-) delete mode 100644 tools/perf/config/feature-checks/test-on-exit.c
tools/perf/builtin-record.c +0 -31
@@ -30,37 +30,6 @@#include <sched.h> #include <sys/mman.h> -#ifndef HAVE_ON_EXIT_SUPPORT -#ifndef ATEXIT_MAX -#define ATEXIT_MAX 32 -#endif -static int __on_exit_count =0 ; -typedef void (*on_exit_func_t ) (int ,void *); -static on_exit_func_t __on_exit_funcs[ATEXIT_MAX ]; -static void *__on_exit_args[ATEXIT_MAX ]; -static int __exitcode =0 ; -static void __handle_on_exit_funcs (void ); -static int on_exit (on_exit_func_t function,void *arg); -#define exit (x) (exit)(__exitcode = (x)) - -static int on_exit (on_exit_func_t function,void *arg) -{ -if (__on_exit_count ==ATEXIT_MAX ) -return -ENOMEM ; -else if (__on_exit_count ==0 ) -atexit (__handle_on_exit_funcs); - __on_exit_funcs[__on_exit_count] = function; - __on_exit_args[__on_exit_count++] = arg; -return 0 ; -} - -static void __handle_on_exit_funcs (void ) -{ -int i; -for (i =0 ; i < __on_exit_count; i++) - __on_exit_funcs[i] (__exitcode, __on_exit_args[i]); -} -#endif struct record {struct perf_tool tool;
tools/perf/config/Makefile +0 -8
@@ -174,7 +174,6 @@ CORE_FEATURE_TESTS = \ libpython-version \ libslang \ libunwind \ - on-exit \ stackprotector-all \ timerfd \ libdw-dwarf-unwind
@@ -200,7 +199,6 @@ VF_FEATURE_TESTS = \ libelf-getphdrnum \ libelf-mmap \ libpython-version \ - on-exit \ stackprotector-all \ timerfd \ libunwind-debug-frame \
@@ -571,12 +569,6 @@ ifneq ($(filter -lbfd,$(EXTLIBS)),) CFLAGS += -DHAVE_LIBBFD_SUPPORT endif -ifndef NO_ON_EXIT - ifeq ($(feature-on-exit), 1) - CFLAGS += -DHAVE_ON_EXIT_SUPPORT - endif -endif - ifndef NO_BACKTRACE ifeq ($(feature-backtrace), 1) CFLAGS += -DHAVE_BACKTRACE_SUPPORT
tools/perf/config/feature-checks/Makefile +0 -4
@@ -24,7 +24,6 @@ FILES= \ test-libslang.bin \ test-libunwind.bin \ test-libunwind-debug-frame.bin \ - test-on-exit.bin \ test-stackprotector-all.bin \ test-timerfd.bin \ test-libdw-dwarf-unwind.bin
@@ -133,9 +132,6 @@ test-liberty-z.bin: test-cplus-demangle.bin: $(BUILD) -liberty -test-on-exit.bin: - $(BUILD) - test-backtrace.bin: $(BUILD)
tools/perf/config/feature-checks/test-all.c +0 -5
@@ -69,10 +69,6 @@# include "test-libbfd.c" #undef main -#define main main_test_on_exit -# include "test-on-exit.c" -#undef main -#define main main_test_backtrace# include "test-backtrace.c" #undef main
@@ -110,7 +106,6 @@ int main(int argc, char *argv[])main_test_gtk2 (argc, argv);main_test_gtk2_infobar (argc, argv);main_test_libbfd (); -main_test_on_exit ();main_test_backtrace ();main_test_libnuma ();main_test_timerfd ();
tools/perf/config/feature-checks/test-on-exit.c deleted +0 -16
@@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -static void exit_fn (int status,void *__data) -{ -printf ("exit status: %d, data: %d\n" , status, *(int *)__data); -} - -static int data =123 ; - -int main (void ) -{ -on_exit (exit_fn, &data); - -return 321 ; -}
Signature · 1 line
1.8.3.1
Jiri Olsa
reviewerPATCH 6/6 perf tools: Use tid for finding thread
In reply to Jiri OlsaFrom: Namhyung Kim <[email protected]>
I believe that passing pid (instead of tid) as the 3rd arg of the machine__find*_thread() was to find a main thread so that it can search proper map group for symbols. However with the map sharing patch applied, it now can do it in any thread.
It fixes a bug when each thread has different name, it only reports a main thread for samples in other threads.
--- tools/perf/builtin-inject.c | 2 +- tools/perf/builtin-kmem.c | 2 +- tools/perf/tests/code-reading.c | 2 +- tools/perf/tests/hists_filter.c | 1 + tools/perf/tests/hists_link.c | 2 ++ tools/perf/util/build-id.c | 2 +- tools/perf/util/event.c | 2 +- 7 files changed, 8 insertions(+), 5 deletions(-)
tools/perf/builtin-inject.c +1 -1
@@ -209,7 +209,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool, cpumode = event->header.misc &PERF_RECORD_MISC_CPUMODE_MASK ; - thread =machine__findnew_thread (machine, sample->pid, sample->pid); + thread =machine__findnew_thread (machine, sample->pid, sample->tid);if (thread ==NULL ) {pr_err ("problem processing %d event, skipping it.\n" , event->header.type);
tools/perf/builtin-kmem.c +1 -1
@@ -235,7 +235,7 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused, struct machine *machine) {struct thread *thread =machine__findnew_thread (machine, sample->pid, - sample->pid); + sample->tid);if (thread ==NULL ) { pr_debug("problem processing %d event, skipping it.\n",
tools/perf/tests/code-reading.c +1 -1
@@ -256,7 +256,7 @@ static int process_sample_event(struct machine *machine,return -1 ; } - thread =machine__findnew_thread (machine, sample.pid, sample.pid); + thread =machine__findnew_thread (machine, sample.pid, sample.tid);if (!thread) {pr_debug ("machine__findnew_thread failed\n" );return -1 ;
tools/perf/tests/hists_filter.c +1 -0
@@ -69,6 +69,7 @@ static int add_hist_entries(struct perf_evlist *evlist, struct machine *machine) evsel->hists.symbol_filter_str =NULL ; sample.pid = fake_samples[i].pid; + sample.tid = fake_samples[i].pid; sample.ip = fake_samples[i].ip; if (perf_event__preprocess_sample(&event, machine, &al,
tools/perf/tests/hists_link.c +2 -0
@@ -81,6 +81,7 @@ static int add_hist_entries(struct perf_evlist *evlist, struct machine *machine) }; sample.pid = fake_common_samples[k].pid; + sample.tid = fake_common_samples[k].pid; sample.ip = fake_common_samples[k].ip;if (perf_event__preprocess_sample (&event, machine, &al, &sample) <0 )
@@ -104,6 +105,7 @@ static int add_hist_entries(struct perf_evlist *evlist, struct machine *machine) }; sample.pid = fake_samples[i][k].pid; + sample.tid = fake_samples[i][k].pid; sample.ip = fake_samples[i][k].ip;if (perf_event__preprocess_sample (&event, machine, &al, &sample) <0 )
tools/perf/util/build-id.c +1 -1
@@ -25,7 +25,7 @@ int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused,struct addr_location al;u8 cpumode = event->header.misc &PERF_RECORD_MISC_CPUMODE_MASK ;struct thread *thread =machine__findnew_thread (machine, sample->pid, - sample->pid); + sample->tid);if (thread ==NULL ) { pr_err("problem processing %d event, skipping it.\n",
tools/perf/util/event.c +1 -1
@@ -788,7 +788,7 @@ int perf_event__preprocess_sample(const union perf_event *event, {u8 cpumode = event->header.misc &PERF_RECORD_MISC_CPUMODE_MASK ;struct thread *thread =machine__findnew_thread (machine, sample->pid, - sample->pid); + sample->tid);if (thread ==NULL )return -1 ;
Signature · 1 line
1.8.3.1
Quoted 44 lines · Jiri Olsa
hi Ingo,
please consider pullingthanks,
jirkaThe following changes since commit
3e46d21285577a8c9e4c37f9b1002e567c440b28:Merge tag 'perf-core-for-mingo' of
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perfinto perf/core (2014-05-05 19:37:51 +0200)are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.gittags/perf-core-for-mingofor you to fetch changes up to
13ce34df11833482cd698331fdbb3f8ced06340d:perf tools: Use tid for finding thread (2014-05-12 11:09:50 +0200)
----------------------------------------------------------------
perf/core improvements and fixes:. Propagate exit status of a command line workload for
record command (Namhyung Kim). Use tid for finding thread (Namhyung Kim)
. Clarify the output of perf sched map plus small sched
command fixies (Dongsheng Yang)Signed-off-by Jiri Olsa <[email protected]>----------------------------------------------------------------
Dongsheng (3):
perf tools: Add missing event for perf sched record.
perf tools: Adapt theTASK_STATE_TO_CHAR_STRto new value in kernel space. perf tools: Clarify the output of perf sched map.Namhyung Kim (3):
perf record: Propagate exit status of a command line workload perf tools: Get rid ofon_exit()feature test
perf tools: Use tid for finding thread
Quoted 15 lines
tools/perf/builtin-inject.c | 2 +- tools/perf/builtin-kmem.c | 2 +- tools/perf/builtin-record.c | 158 +++++++++--------------- tools/perf/builtin-sched.c | 38 +++--- tools/perf/config/Makefile | 8 -- tools/perf/config/feature-checks/Makefile | 4 - tools/perf/config/feature-checks/test-all.c | 5 - tools/perf/config/feature-checks/test-on-exit.c | 16 --- tools/perf/tests/code-reading.c | 2 +- tools/perf/tests/hists_filter.c | 1 + tools/perf/tests/hists_link.c | 2 + tools/perf/util/build-id.c | 2 +- tools/perf/util/event.c | 2 +- 13 files changed, 90 insertions(+), 152 deletions(-) delete mode 100644 tools/perf/config/feature-checks/test-on-exit.c
Pulled, thanks a lot Jiri!
Ingo