perf events: Change perf parameter --pid to process-wide collection instead of thread-wide
Subsystems (2)
PATCH 3/3 perf events: Change perf parameter --pid to process-wide collection instead of thread-wide
From: Zhang, Yanmin <[email protected]>
Parameter --pid (or -p) of perf currently means a thread-wide collection. For exmaple, if a process whose id is 8888 has 10 threads, 'perf top -p 8888' just collects the main thread statistics. That's misleading. Users are used to attach a whole process when debugging a process by gdb. To follow normal usage style, the patch change --pid to process-wide collection and add --tid (-t) to mean a thread-wide collection.
Usage example is:
#perf top -p 8888
#perf record -p 8888 -f sleep 10
#perf stat -p 8888 -f sleep 10
Above commands collect the statistics of all threads of process 8888.
---
tools/perf/builtin-record.c +156 -98
@@ -27,7 +27,7 @@#include <unistd.h> #include <sched.h> -static int fd[MAX_NR_CPUS ][MAX_COUNTERS ]; +static int *fd[MAX_NR_CPUS ][MAX_COUNTERS ];static long default_interval =0 ;
@@ -43,6 +43,9 @@ static int raw_samples = 0;static int system_wide =0 ;static int profile_cpu =-1 ;static pid_t target_pid =-1 ; +static pid_t target_tid =-1 ; +static pid_t *all_tids =NULL ; +static int thread_num =0 ;static pid_t child_pid =-1 ;static int inherit =1 ;static int force =0 ;
@@ -60,7 +63,7 @@ static struct timeval this_read;static u64 bytes_written =0 ; -static struct pollfd event_array[MAX_NR_CPUS *MAX_COUNTERS ]; +static struct pollfd *event_array;static int nr_poll =0 ;static int nr_cpu =0 ;
@@ -77,7 +80,7 @@ struct mmap_data {unsigned int prev; }; -static struct mmap_data mmap_array[MAX_NR_CPUS ][MAX_COUNTERS ]; +static struct mmap_data *mmap_array[MAX_NR_CPUS ][MAX_COUNTERS ];static unsigned long mmap_read_head (struct mmap_data *md) {
@@ -225,12 +228,13 @@ static struct perf_header_attr *get_headreturn h_attr; } -static void create_counter (int counter,int cpu,pid_t pid) +static void create_counter (int counter,int cpu) {char *filter = filters[counter];struct perf_event_attr *attr = attrs + counter;struct perf_header_attr *h_attr;int track = !counter;/* only the first counter needs these */ +int thread_index;int ret;struct {u64 count;
@@ -280,115 +284,124 @@ static void create_counter(int counter, attr->enable_on_exec =1 ; } +for (thread_index =0 ; thread_index < thread_num; thread_index++) { try_again: - fd[nr_cpu][counter] =sys_perf_event_open (attr, pid, cpu, group_fd,0 ); + fd[nr_cpu][counter][thread_index] =sys_perf_event_open (attr, + all_tids[thread_index], cpu, group_fd,0 ); -if (fd[nr_cpu][counter] <0 ) { -int err = errno; +if (fd[nr_cpu][counter][thread_index] <0 ) { +int err = errno; -if (err ==EPERM || err ==EACCES ) -die ("Permission error - are you root?\n" -"\t Consider tweaking /proc/sys/kernel/perf_event_paranoid.\n" ); -else if (err ==ENODEV && profile_cpu !=-1 ) -die ("No such device - did you specify an out-of-range profile CPU?\n" ); +if (err ==EPERM || err ==EACCES ) +die ("Permission error - are you root?\n" +"\t Consider tweaking" +" /proc/sys/kernel/perf_event_paranoid.\n" ); +else if (err ==ENODEV && profile_cpu !=-1 ) { +die ("No such device - did you specify" +" an out-of-range profile CPU?\n" ); + } -/* -* If it's cycles then fall back to hrtimer -* based cpu-clock-tick sw counter, which -* is always available even if no PMU support: -*/ -if (attr->type ==PERF_TYPE_HARDWARE - && attr->config ==PERF_COUNT_HW_CPU_CYCLES ) { +/* +* If it's cycles then fall back to hrtimer +* based cpu-clock-tick sw counter, which +* is always available even if no PMU support: +*/ +if (attr->type ==PERF_TYPE_HARDWARE + && attr->config ==PERF_COUNT_HW_CPU_CYCLES ) { -if (verbose) -warning (" ... trying to fall back to cpu-clock-ticks\n" ); - attr->type =PERF_TYPE_SOFTWARE ; - attr->config =PERF_COUNT_SW_CPU_CLOCK ; - goto try_again; - } -printf ("\n" ); -error ("perfcounter syscall returned with %d (%s)\n" , - fd[nr_cpu][counter],strerror (err)); +if (verbose) +warning (" ... trying to fall back to cpu-clock-ticks\n" ); + attr->type =PERF_TYPE_SOFTWARE ; + attr->config =PERF_COUNT_SW_CPU_CLOCK ; + goto try_again; + } +printf ("\n" ); +error ("perfcounter syscall returned with %d (%s)\n" , + fd[nr_cpu][counter][thread_index],strerror (err));#if defined(__i386__) || defined(__x86_64__) -if (attr->type ==PERF_TYPE_HARDWARE && err ==EOPNOTSUPP ) -die ("No hardware sampling interrupt available. No APIC? If so then you can boot the kernel with the \"lapic\" boot parameter to force-enable it.\n" ); +if (attr->type ==PERF_TYPE_HARDWARE && err ==EOPNOTSUPP ) +die ("No hardware sampling interrupt available." +" No APIC? If so then you can boot the kernel" +" with the \"lapic\" boot parameter to" +" force-enable it.\n" );#endif -die ("No CONFIG_PERF_EVENTS=y kernel support configured?\n" ); -exit (-1 ); - } +die ("No CONFIG_PERF_EVENTS=y kernel support configured?\n" ); +exit (-1 ); + } - h_attr =get_header_attr (attr, counter); -if (h_attr ==NULL ) -die ("nomem\n" ); + h_attr =get_header_attr (attr, counter); +if (h_attr ==NULL ) +die ("nomem\n" ); + +if (!file_new) { +if (memcmp (&h_attr->attr, attr,sizeof (*attr))) { +fprintf (stderr,"incompatible append\n" ); +exit (-1 ); + } + } -if (!file_new) { -if (memcmp (&h_attr->attr, attr,sizeof (*attr))) { -fprintf (stderr,"incompatible append\n" ); +if (read (fd[nr_cpu][counter][thread_index], &read_data,sizeof (read_data)) ==-1 ) { +perror ("Unable to read perf file descriptor\n" );exit (-1 ); } - } - -if (read (fd[nr_cpu][counter], &read_data,sizeof (read_data)) ==-1 ) { -perror ("Unable to read perf file descriptor\n" ); -exit (-1 ); - } -if (perf_header_attr__add_id (h_attr, read_data.id) <0 ) { -pr_warning ("Not enough memory to add id\n" ); -exit (-1 ); - } +if (perf_header_attr__add_id (h_attr, read_data.id) <0 ) { +pr_warning ("Not enough memory to add id\n" ); +exit (-1 ); + } -assert (fd[nr_cpu][counter] >=0 ); -fcntl (fd[nr_cpu][counter],F_SETFL ,O_NONBLOCK ); +assert (fd[nr_cpu][counter][thread_index] >=0 ); +fcntl (fd[nr_cpu][counter][thread_index],F_SETFL ,O_NONBLOCK ); -/* -* First counter acts as the group leader: -*/ -if (group && group_fd ==-1 ) - group_fd = fd[nr_cpu][counter]; -if (multiplex && multiplex_fd ==-1 ) - multiplex_fd = fd[nr_cpu][counter]; +/* +* First counter acts as the group leader: +*/ +if (group && group_fd ==-1 ) + group_fd = fd[nr_cpu][counter][thread_index]; +if (multiplex && multiplex_fd ==-1 ) + multiplex_fd = fd[nr_cpu][counter][thread_index]; -if (multiplex && fd[nr_cpu][counter] != multiplex_fd) { +if (multiplex && fd[nr_cpu][counter][thread_index] != multiplex_fd) { - ret =ioctl (fd[nr_cpu][counter],PERF_EVENT_IOC_SET_OUTPUT , multiplex_fd); -assert (ret !=-1 ); - }else { - event_array[nr_poll].fd = fd[nr_cpu][counter]; - event_array[nr_poll].events =POLLIN ; - nr_poll++; - - mmap_array[nr_cpu][counter].counter = counter; - mmap_array[nr_cpu][counter].prev =0 ; - mmap_array[nr_cpu][counter].mask = mmap_pages*page_size -1 ; - mmap_array[nr_cpu][counter].base =mmap (NULL , (mmap_pages+1 )*page_size, -PROT_READ |PROT_WRITE ,MAP_SHARED , fd[nr_cpu][counter],0 ); -if (mmap_array[nr_cpu][counter].base ==MAP_FAILED ) { -error ("failed to mmap with %d (%s)\n" , errno,strerror (errno)); -exit (-1 ); + ret =ioctl (fd[nr_cpu][counter][thread_index],PERF_EVENT_IOC_SET_OUTPUT , multiplex_fd); +assert (ret !=-1 ); + }else { + event_array[nr_poll].fd = fd[nr_cpu][counter][thread_index]; + event_array[nr_poll].events =POLLIN ; + nr_poll++; + + mmap_array[nr_cpu][counter][thread_index].counter = counter; + mmap_array[nr_cpu][counter][thread_index].prev =0 ; + mmap_array[nr_cpu][counter][thread_index].mask = mmap_pages*page_size -1 ; + mmap_array[nr_cpu][counter][thread_index].base =mmap (NULL , (mmap_pages+1 )*page_size, +PROT_READ |PROT_WRITE ,MAP_SHARED , fd[nr_cpu][counter][thread_index],0 ); +if (mmap_array[nr_cpu][counter][thread_index].base ==MAP_FAILED ) { +error ("failed to mmap with %d (%s)\n" , errno,strerror (errno)); +exit (-1 ); + } } - } -if (filter !=NULL ) { - ret =ioctl (fd[nr_cpu][counter], -PERF_EVENT_IOC_SET_FILTER , filter); -if (ret) { -error ("failed to set filter with %d (%s)\n" , errno, -strerror (errno)); -exit (-1 ); +if (filter !=NULL ) { + ret =ioctl (fd[nr_cpu][counter][thread_index], +PERF_EVENT_IOC_SET_FILTER , filter); +if (ret) { +error ("failed to set filter with %d (%s)\n" , errno, +strerror (errno)); +exit (-1 ); + } } } } -static void open_counters (int cpu,pid_t pid) +static void open_counters (int cpu) {int counter; group_fd =-1 ;for (counter =0 ; counter < nr_counters; counter++) -create_counter (counter, cpu, pid); +create_counter (counter, cpu); nr_cpu++; }
@@ -529,6 +542,9 @@ static int __cmd_record(int argc, constexit (-1 ); } +if (!system_wide && target_tid ==-1 && target_pid ==-1 ) + all_tids[0 ] = child_pid; +close (child_ready_pipe[1 ]);close (go_pipe[0 ]);/*
@@ -541,17 +557,12 @@ static int __cmd_record(int argc, constclose (child_ready_pipe[0 ]); } -if (forks && target_pid ==-1 && !system_wide) - pid = child_pid; -else - pid = target_pid; -if ((!system_wide && !inherit) || profile_cpu !=-1 ) { -open_counters (profile_cpu, pid); +open_counters (profile_cpu); }else { nr_cpus =read_cpu_map ();for (i =0 ; i < nr_cpus; i++) -open_counters (cpumap[i], pid); +open_counters (cpumap[i]); }if (file_new) {
@@ -576,7 +587,7 @@ static int __cmd_record(int argc, const }if (!system_wide && profile_cpu ==-1 ) -event__synthesize_thread (target_pid, process_synthesized_event, +event__synthesize_thread (target_tid, process_synthesized_event, session);else event__synthesize_threads (process_synthesized_event, session);
@@ -599,11 +610,16 @@ static int __cmd_record(int argc, constfor (;;) {int hits = samples; +int thread;for (i =0 ; i < nr_cpu; i++) {for (counter =0 ; counter < nr_counters; counter++) { -if (mmap_array[i][counter].base) -mmap_read (&mmap_array[i][counter]); +for (thread =0 ; + thread < thread_num; thread++) { +if (mmap_array[i][counter][thread].base) +mmap_read (&mmap_array[i][counter][thread]); + } + } }
@@ -616,8 +632,15 @@ static int __cmd_record(int argc, constif (done) {for (i =0 ; i < nr_cpu; i++) { -for (counter =0 ; counter < nr_counters; counter++) -ioctl (fd[i][counter],PERF_EVENT_IOC_DISABLE ); +for (counter =0 ; + counter < nr_counters; + counter++) { +for (thread =0 ; + thread < thread_num; + thread++) +ioctl (fd[i][counter][thread], +PERF_EVENT_IOC_DISABLE ); + } } } }
@@ -649,7 +672,9 @@ static const struct option options[] = {OPT_CALLBACK (0 ,"filter" ,NULL ,"filter" ,"event filter" , parse_filter),OPT_INTEGER ('p' ,"pid" , &target_pid, -"record events on existing pid" ), +"record events on existing process id" ), +OPT_INTEGER ('t' ,"tid" , &target_tid, +"record events on existing thread id" ),OPT_INTEGER ('r' ,"realtime" , &realtime_prio,"collect data with this RT SCHED_FIFO priority" ), OPT_BOOLEAN('R', "raw-samples", &raw_samples,
@@ -690,10 +715,12 @@ static const struct option options[] = {int cmd_record (int argc,const char **argv,const char *prefix__used ) {int counter; +int i,j; argc =parse_options (argc, argv, options, record_usage,PARSE_OPT_STOP_AT_NON_OPTION ); -if (!argc && target_pid ==-1 && !system_wide && profile_cpu ==-1 ) +if (!argc && target_pid ==-1 && target_tid ==-1 && + !system_wide && profile_cpu ==-1 )usage_with_options (record_usage, options);symbol__init ();
@@ -704,6 +731,37 @@ int cmd_record(int argc, const char **ar attrs[0 ].config =PERF_COUNT_HW_CPU_CYCLES ; } +if (target_pid !=-1 ) { + target_tid = target_pid; + thread_num =find_all_tid (target_pid, &all_tids); +if (thread_num <=0 ) { +fprintf (stderr,"Can't find all threads of pid %d\n" , + target_pid); +usage_with_options (record_usage, options); + } + }else { + all_tids=malloc (sizeof (pid_t)); +if (!all_tids) +return -ENOMEM ; + + all_tids[0 ] = target_tid; + thread_num =1 ; + } + +for (i =0 ; i <MAX_NR_CPUS ; i++) { +for (j =0 ; j <MAX_COUNTERS ; j++) { + fd[i][j] =malloc (sizeof (int )*thread_num); + mmap_array[i][j] =malloc ( +sizeof (struct mmap_data )*thread_num); +if (!fd[i][j] || !mmap_array[i][j]) +return -ENOMEM ; + } + } + event_array =malloc ( +sizeof (struct pollfd )*MAX_NR_CPUS *MAX_COUNTERS *thread_num); +if (!event_array) +return -ENOMEM ; +/* * User specified count overrides default frequency. */
tools/perf/builtin-stat.c +75 -35
206 lines not on this page · raw message
tools/perf/builtin-top.c +103 -55
252 lines not on this page · raw message
tools/perf/util/thread.c +32 -0
@@ -7,6 +7,37 @@#include "util.h" #include "debug.h" +int find_all_tid (int pid,pid_t ** all_tid) +{ +char name[256 ]; +int items; +struct dirent **namelist =NULL ; +int ret =0 ; +int i; + +sprintf (name,"/proc/%d/task" , pid); + items =scandir (name, &namelist,NULL ,NULL ); +if (items <=0 ) +return -ENOENT ; + *all_tid =malloc (sizeof (pid_t) * items); +if (!*all_tid) { + ret = -ENOMEM ; + goto failure; + } + +for (i =0 ; i < items; i++) + (*all_tid)[i] =atoi (namelist[i]->d_name); + + ret = items; + +failure: +for (i=0 ; i<items; i++) +free (namelist[i]); +free (namelist); + +return ret; +} +void map_groups__init (struct map_groups *self) {int i;
@@ -348,3 +379,4 @@ struct symbol *map_groups__find_symbol(sreturn NULL ; } +
tools/perf/util/thread.h +1 -0
@@ -23,6 +23,7 @@ struct thread {int comm_len; }; +int find_all_tid (int pid,pid_t ** all_tid);void map_groups__init (struct map_groups *self);int thread__set_comm (struct thread *self,const char *comm);int thread__comm_len (struct thread *self);
Em Thu, Mar 18, 2010 at 05:31:06PM +0800, Zhang, Yanmin escreveu:
Quoted 9 lines
From: Zhang, Yanmin <[email protected]>
Parameter --pid (or -p) of perf currently means a thread-wide collection. For exmaple, if a process whose id is 8888 has 10 threads, 'perf top -p 8888' just collects the main thread statistics. That's misleading. Users are used to attach a whole process when debugging a process by gdb. To follow normal usage style, the patch change --pid to process-wide collection and add --tid (-t) to mean a thread-wide collection.
Quoted 7 lines
Usage example is:
#perf top -p 8888
#perf record -p 8888 -f sleep 10
#perf stat -p 8888 -f sleep 10
Above commands collect the statistics of all threads of process 8888.Signed-off-by Zhang Yanmin <[email protected]>
Just did visual inspection of the three patches, all sane, except for some coding style nits, don't worry right now for that, I'll fix them up myself, but please take those into account int the future, highlight below.
tools/perf/builtin-record.c static void create_counter(int counter, · line 378
Quoted 7 lines
---
diff -Nraup
linux-2.6_tip0317_statrecord/tools/perf/builtin-record.clinux-2.6_tip0317_statrecordpid/tools/perf/builtin-record.ctools/perf/builtin-record.c +2
-0+ mmap_array[nr_cpu][counter][thread_index].mask = mmap_pages*page_size -1 ; + mmap_array[nr_cpu][counter][thread_index].base = mmap(NULL, (mmap_pages+1)*page_size,
Spaces around +, *, etc
tools/perf/builtin-record.c static void create_counter(int counter,
Quoted 7 lines
tools/perf/builtin-record.c +7
-0+ PROT_READ|PROT_WRITE, MAP_SHARED, fd[nr_cpu][counter][thread_index], 0); +if (mmap_array[nr_cpu][counter][thread_index].base ==MAP_FAILED ) { +error ("failed to mmap with %d (%s)\n" , errno,strerror (errno)); +exit (-1 ); + } + }else { + all_tids=malloc (sizeof (pid_t));
Ditto here for =
tools/perf/builtin-record.c int cmd_record(int argc, const char **ar · line 755
Quoted 12 lines
tools/perf/builtin-record.c +12
-0+if (!all_tids) +return -ENOMEM ; + + all_tids[0 ] = target_tid; + thread_num =1 ; + } + +for (i =0 ; i <MAX_NR_CPUS ; i++) { +for (j =0 ; j <MAX_COUNTERS ; j++) { + fd[i][j] =malloc (sizeof (int )*thread_num); + mmap_array[i][j] =malloc ( +sizeof (struct mmap_data )*thread_num);
Ditto
tools/perf/builtin-record.c int cmd_record(int argc, const char **ar · line 761
Quoted 6 lines
tools/perf/builtin-record.c +6
-0+if (!fd[i][j] || !mmap_array[i][j]) +return -ENOMEM ; + } + } + event_array =malloc ( +sizeof (struct pollfd )*MAX_NR_CPUS *MAX_COUNTERS *thread_num);
Ditto
Should be, I suggest:
event_array = malloc((sizeof(struct pollfd) * MAX_NR_CPUS * MAX_COUNTERS * thread_num));
Anyway, I'll fix some of these while merging, now.
- Arnaldo
Em Thu, Mar 18, 2010 at 10:35:48AM -0300, Arnaldo Carvalho de Melo escreveu:
Quoted 16 lines
Em Thu, Mar 18, 2010 at 05:31:06PM +0800, Zhang, Yanmin escreveu:
Quoted 15 lines
From: Zhang, Yanmin <[email protected]>
Parameter --pid (or -p) of perf currently means a thread-wide collection. For exmaple, if a process whose id is 8888 has 10 threads, 'perf top -p 8888' just collects the main thread statistics. That's misleading. Users are used to attach a whole process when debugging a process by gdb. To follow normal usage style, the patch change --pid to process-wide collection and add --tid (-t) to mean a thread-wide collection.
Usage example is:
#perf top -p 8888
#perf record -p 8888 -f sleep 10
#perf stat -p 8888 -f sleep 10
Above commands collect the statistics of all threads of process 8888.
Quoted 4 lines
Quoted 1 line
Signed-off-by Zhang Yanmin <[email protected]>Just did visual inspection of the three patches, all sane, except for some coding style nits, don't worry right now for that, I'll fix them up
Nah, didn't fix them up, left it for some followup patch to avoid risking introducing problems, applied as is, did some testing and pushed to Ingo, thanks!
Quoted 2 lines
myself, but please take those into account int the future, highlight below.
- Arnaldo
Quoted 9 lines · Yanmin
From: Zhang, Yanmin <[email protected]>
Parameter --pid (or -p) of perf currently means a thread-wide collection. For exmaple, if a process whose id is 8888 has 10 threads, 'perf top -p 8888' just collects the main thread statistics. That's misleading. Users are used to attach a whole process when debugging a process by gdb. To follow normal usage style, the patch change --pid to process-wide collection and add --tid (-t) to mean a thread-wide collection.
Quoted 8 lines
Usage example is:
#perf top -p 8888
#perf record -p 8888 -f sleep 10
#perf stat -p 8888 -f sleep 10
Above commands collect the statistics of all threads of process 8888.Signed-off-by Zhang Yanmin <[email protected]>
Seems this patch causes seg faults:
# ./perf sched record Segmentation fault # ./perf kmem record Segmentation fault # ./perf timechart record Segmentation fault
Quoted 19 lines · Li Zefan
Quoted 9 lines · Yanmin
From: Zhang, Yanmin <[email protected]>
Parameter --pid (or -p) of perf currently means a thread-wide collection. For exmaple, if a process whose id is 8888 has 10 threads, 'perf top -p 8888' just collects the main thread statistics. That's misleading. Users are used to attach a whole process when debugging a process by gdb. To follow normal usage style, the patch change --pid to process-wide collection and add --tid (-t) to mean a thread-wide collection.
Quoted 8 lines
Usage example is:
#perf top -p 8888
#perf record -p 8888 -f sleep 10
#perf stat -p 8888 -f sleep 10
Above commands collect the statistics of all threads of process 8888.Signed-off-by Zhang Yanmin <[email protected]>
Quoted 8 lines
Seems this patch causes seg faults:
# ./perf sched record Segmentation fault # ./perf kmem record Segmentation fault # ./perf timechart record Segmentation fault
Thanks for reporting it. Arnaldo, could you pick up below patch? Zefan, Could you try it?
mmap_array[][][] is not reset to 0 after malloc. Below patch against tip/master of March 24th fixes it with a zalloc.
---
tools/perf/builtin-record.c +1 -1
@@ -751,7 +751,7 @@ int cmd_record(int argc, const char **arfor (i =0 ; i <MAX_NR_CPUS ; i++) {for (j =0 ; j <MAX_COUNTERS ; j++) { fd[i][j] =malloc (sizeof (int )*thread_num); - mmap_array[i][j] =malloc ( + mmap_array[i][j] =zalloc (sizeof (struct mmap_data )*thread_num);if (!fd[i][j] || !mmap_array[i][j])return -ENOMEM ;
tools/perf/builtin-top.c +1 -1
@@ -1371,7 +1371,7 @@ int cmd_top(int argc, const char **argv,for (i =0 ; i <MAX_NR_CPUS ; i++) {for (j =0 ; j <MAX_COUNTERS ; j++) { fd[i][j] =malloc (sizeof (int )*thread_num); - mmap_array[i][j] =malloc ( + mmap_array[i][j] =zalloc (sizeof (struct mmap_data )*thread_num);if (!fd[i][j] || !mmap_array[i][j])return -ENOMEM ;
Quoted 24 lines
Quoted 15 lines
Quoted 7 lines
Parameter --pid (or -p) of perf currently means a thread-wide collection. For exmaple, if a process whose id is 8888 has 10 threads, 'perf top -p 8888' just collects the main thread statistics. That's misleading. Users are used to attach a whole process when debugging a process by gdb. To follow normal usage style, the patch change --pid to process-wide collection and add --tid (-t) to mean a thread-wide collection.
Quoted 8 lines
Usage example is:
#perf top -p 8888
#perf record -p 8888 -f sleep 10
#perf stat -p 8888 -f sleep 10
Above commands collect the statistics of all threads of process 8888.Signed-off-by Zhang Yanmin <[email protected]>Quoted 8 lines
Seems this patch causes seg faults:
# ./perf sched record Segmentation fault # ./perf kmem record Segmentation fault # ./perf timechart record Segmentation fault
Quoted 3 lines
Thanks for reporting it. Arnaldo, could you pick up below patch? Zefan, Could you try it?
The fix works. Thanks!
Quoted 6 lines
mmap_array[][][] is not reset to 0 after malloc. Below patch against tip/master of March 24th fixes it with a zalloc.
Reported-by Li Zefan <[email protected]>Signed-off-by Zhang Yanmin <[email protected]>
Em Thu, Mar 25, 2010 at 04:47:44PM +0800, Zhang, Yanmin escreveu:
Quoted 3 lines · Li Zefan
Thanks for reporting it. Arnaldo, could you pick up below patch? Zefan, Could you try it?
Sure thing, will stash them in today's push to Ingo, thanks!
- Arnaldo