perf/core improvements and fixes
Subsystems (3)
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit cfa0bd52d0ba9b852f76c7b3f1055edd5e5c7846:
Merge tag 'perf-core-for-mingo-2' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2014-12-08 07:45:45 +0100)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo
for you to fetch changes up to e09b18d4907992d3d615b215c1abf585721b2810:
perf trace: Provide a better explanation when mmap fails (2014-12-11 18:04:10 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
User visible:
- Mark events as (x86 only) in help output for 'perf kvm stat live" (Alexander Yarygin)
- Provide a better explanation when mmap fails in 'trace' (Arnaldo Carvalho de Melo)
- Add --buildid-dir option to set cache directory, i.e. use:
$ perf --buildid-dir /path/to/dir tool --tool-options
(Jiri Olsa)
- Fix memcpy/memset 'perf bench' output (Rabin Vicent)
- Fix 'perf test' attr tests size values to cope with machine state on interrupt ABI changes (Jiri Olsa)
- Fixup callchain type parameter handling error message (Kan Liang)
Infrastructure/cleanups:
- calloc/xcalloc: Fix argument order (Arjun Sreedharan)
- Move filename__read_int from tools/perf/ to tools/lib, add sysctl__read_int there and use it in place of ad-hoc copies (Arnaldo Carvalho de Melo)
- Use single strcmp call instead of two (Jiri Olsa)
- Remove extra debugdir variables in 'perf buildid-cache' (Jiri Olsa)
- Fix -a segfault related to kcore handling in 'perf buildid-cache' (Jiri Olsa)
- Move cpumode resolve code to add_callchain_ip (Kan Liang)
- Merge memset into memcpy 'perf bench' (Rabin Vincent)
- Change print format from %lu to %PRIu64 in the hists browser (Tom Huynh)
----------------------------------------------------------------
Alexander Yarygin (1):
perf kvm stat live: Mark events as (x86 only) in help output
Arjun Sreedharan (1):
calloc/xcalloc: Fix argument order
Arnaldo Carvalho de Melo (5):
tools lib fs: Adopt filename__read_int from tools/perf/ tools lib fs: Add sysctl__read_int helper
perf tools: Use sysctl__read_int instead of ad-hoc copies perf evlist: Introduce strerror_mmap method perf trace: Provide a better explanation when mmap fails
Jiri Olsa (5):
perf tools: Use single strcmp call instead of two
perf buildid-cache: Remove extra debugdir variables
perf buildid cache: Fix -a segfault related to kcore handling
perf tools: Add --buildid-dir option to set cache directory
perf tests: Fix attr tests size values to cope with machine state on interrupt ABI changes
Kan Liang (2):
perf callchain: Fixup parameter handling error message perf callchain: Move cpumode resolve code to add_callchain_ip
Rabin Vincent (3):
perf bench: Prepare memcpy for merge
perf bench: Merge memset into memcpy
perf bench: Fix memcpy/memset output
Tom Huynh (1):
perf hists browser: Change print format from %lu to %PRIu64
scripts/kconfig/mconf.c | 4 +- tools/lib/api/fs/fs.c | 34 +++++ tools/lib/api/fs/fs.h | 3 + tools/perf/Documentation/perf.txt | 4 + tools/perf/Makefile.perf | 1 - tools/perf/bench/mem-memcpy.c | 286 ++++++++++++++++++++++++---------- tools/perf/bench/mem-memset.c | 304 ------------------------------------- tools/perf/builtin-buildid-cache.c | 13 +- tools/perf/builtin-kvm.c | 3 +- tools/perf/builtin-trace.c | 12 +- tools/perf/perf.c | 14 +- tools/perf/tests/attr/base-record | 2 +- tools/perf/tests/attr/base-stat | 2 +- tools/perf/ui/browsers/hists.c | 2 +- tools/perf/ui/hist.c | 4 +- tools/perf/util/build-id.c | 9 +- tools/perf/util/callchain.c | 2 +- tools/perf/util/config.c | 10 +- tools/perf/util/evlist.c | 23 +++ tools/perf/util/evlist.h | 1 + tools/perf/util/machine.c | 72 +++++---- tools/perf/util/record.c | 11 +- tools/perf/util/util.c | 26 +--- tools/perf/util/util.h | 3 +- tools/thermal/tmon/sysfs.c | 6 +- 25 files changed, 350 insertions(+), 501 deletions(-) delete mode 100644 tools/perf/bench/mem-memset.c
Arnaldo Carvalho de Melo
maintainerPATCH 1/18 perf bench: Prepare memcpy for merge
From: Rabin Vincent <[email protected]>
The memset benchmark is largely copy-pasted from the memcpy benchmark. Prepare the memcpy file for merge with memset by extracting out a generic function.
--- tools/perf/bench/mem-memcpy.c | 182 ++++++++++++++++++++++++------------------ 1 file changed, 104 insertions(+), 78 deletions(-)
tools/perf/bench/mem-memcpy.c +104 -78
@@ -52,16 +52,18 @@ typedef void *(*memcpy_t)(void *, const void *, size_t);struct routine {const char *name;const char *desc; -memcpy_t fn; +union { +memcpy_t memcpy; + } fn; }; -struct routine routines[] = { - {"default" , -"Default memcpy() provided by glibc" , - memcpy }, +struct routine memcpy_routines[] = { + { .name ="default" , + .desc ="Default memcpy() provided by glibc" , + .fn.memcpy = memcpy }, #ifdef HAVE_ARCH_X86_64_SUPPORT -#define MEMCPY_FN(fn, name, desc) { name, desc, fn }, +#define MEMCPY_FN(_fn, _name, _desc) {.name = _name, .desc = _desc, .fn.memcpy = _fn}, #include "mem-memcpy-x86-64-asm-def.h" #undef MEMCPY_FN
@@ -69,7 +71,7 @@ struct routine routines[] = { {NULL ,NULL , - NULL } + {NULL} } }; static const char * const bench_mem_memcpy_usage[] = {
@@ -110,63 +112,6 @@ static double timeval2double(struct timeval *ts) (double )ts->tv_usec / (double )1000000 ; } -static void alloc_mem (void **dst,void **src,size_t length) -{ - *dst =zalloc (length); -if (!*dst) -die ("memory allocation failed - maybe length is too large?\n" ); - - *src =zalloc (length); -if (!*src) -die ("memory allocation failed - maybe length is too large?\n" ); -/* Make sure to always replace the zero pages even if MMAP_THRESH is crossed */ -memset (*src,0 , length); -} - -static u64 do_memcpy_cycle (memcpy_t fn,size_t len,bool prefault) -{ -u64 cycle_start =0ULL , cycle_end =0ULL ; -void *src =NULL , *dst =NULL ; -int i; - -alloc_mem (&src, &dst, len); - -if (prefault) -fn (dst, src, len); - - cycle_start =get_cycle (); -for (i =0 ; i < iterations; ++i) -fn (dst, src, len); - cycle_end =get_cycle (); - -free (src); -free (dst); -return cycle_end - cycle_start; -} - -static double do_memcpy_gettimeofday (memcpy_t fn,size_t len,bool prefault) -{ -struct timeval tv_start, tv_end, tv_diff; -void *src =NULL , *dst =NULL ; -int i; - -alloc_mem (&src, &dst, len); - -if (prefault) -fn (dst, src, len); - -BUG_ON (gettimeofday (&tv_start,NULL )); -for (i =0 ; i < iterations; ++i) -fn (dst, src, len); -BUG_ON (gettimeofday (&tv_end,NULL )); - -timersub (&tv_end, &tv_start, &tv_diff); - -free (src); -free (dst); -return (double )((double )len /timeval2double (&tv_diff)); -} -#define pf (no_prefault ? 0 : 1)#define print_bps (x) do { \
@@ -180,8 +125,16 @@ static double do_memcpy_gettimeofday(memcpy_t fn, size_t len, bool prefault)printf (" %14lf GB/Sec" , x /K /K /K ); \ }while (0 ) -int bench_mem_memcpy(int argc, const char **argv, - const char *prefix __maybe_unused) +struct bench_mem_info { +const struct routine *routines; +u64 (*do_cycle)(const struct routine *r,size_t len,bool prefault); +double (*do_gettimeofday)(const struct routine *r,size_t len,bool prefault); +const char *const *usage; +}; + +static int bench_mem_common (int argc,const char **argv, +const char *prefix__maybe_unused , +struct bench_mem_info *info) {int i;size_t len;
@@ -189,7 +142,7 @@ int bench_mem_memcpy(int argc, const char **argv,u64 result_cycle[2 ]; argc =parse_options (argc, argv, options, - bench_mem_memcpy_usage,0 ); + info->usage,0 );if (no_prefault && only_prefault) {fprintf (stderr,"Invalid options: -o and -n are mutually exclusive\n" );
@@ -213,16 +166,16 @@ int bench_mem_memcpy(int argc, const char **argv,if (only_prefault && no_prefault) only_prefault = no_prefault = false; -for (i =0 ; routines[i].name; i++) { -if (!strcmp (routines[i].name, routine)) +for (i =0 ; info->routines[i].name; i++) { +if (!strcmp (info->routines[i].name, routine))break ; } -if (!routines[i].name) { +if (!info->routines[i].name) {printf ("Unknown routine:%s\n" , routine);printf ("Available routines...\n" ); -for (i =0 ; routines[i].name; i++) { +for (i =0 ; info->routines[i].name; i++) {printf ("\t%s ... %s\n" , - routines[i].name, routines[i].desc); + info->routines[i].name, info->routines[i].desc); }return 1 ; }
@@ -234,25 +187,25 @@ int bench_mem_memcpy(int argc, const char **argv,/* show both of results */ if (use_cycle) { result_cycle[0 ] = -do_memcpy_cycle (routines[i].fn, len, false); + info->do_cycle (&info->routines[i], len, false); result_cycle[1 ] = -do_memcpy_cycle (routines[i].fn, len, true); + info->do_cycle (&info->routines[i], len, true); }else { result_bps[0 ] = -do_memcpy_gettimeofday (routines[i].fn, + info->do_gettimeofday (&info->routines[i], len, false); result_bps[1 ] = -do_memcpy_gettimeofday (routines[i].fn, + info->do_gettimeofday (&info->routines[i], len, true); } }else {if (use_cycle) { result_cycle[pf] = -do_memcpy_cycle (routines[i].fn, + info->do_cycle (&info->routines[i], len, only_prefault); }else { result_bps[pf] = -do_memcpy_gettimeofday (routines[i].fn, + info->do_gettimeofday (&info->routines[i], len, only_prefault); } }
@@ -310,3 +263,76 @@ int bench_mem_memcpy(int argc, const char **argv,return 0 ; } + +static void memcpy_alloc_mem (void **dst,void **src,size_t length) +{ + *dst =zalloc (length); +if (!*dst) +die ("memory allocation failed - maybe length is too large?\n" ); + + *src =zalloc (length); +if (!*src) +die ("memory allocation failed - maybe length is too large?\n" ); +/* Make sure to always replace the zero pages even if MMAP_THRESH is crossed */ +memset (*src,0 , length); +} + +static u64 do_memcpy_cycle (const struct routine *r,size_t len,bool prefault) +{ +u64 cycle_start =0ULL , cycle_end =0ULL ; +void *src =NULL , *dst =NULL ; +memcpy_t fn = r->fn.memcpy; +int i; + +memcpy_alloc_mem (&src, &dst, len); + +if (prefault) +fn (dst, src, len); + + cycle_start =get_cycle (); +for (i =0 ; i < iterations; ++i) +fn (dst, src, len); + cycle_end =get_cycle (); + +free (src); +free (dst); +return cycle_end - cycle_start; +} + +static double do_memcpy_gettimeofday (const struct routine *r,size_t len, +bool prefault) +{ +struct timeval tv_start, tv_end, tv_diff; +memcpy_t fn = r->fn.memcpy; +void *src =NULL , *dst =NULL ; +int i; + +memcpy_alloc_mem (&src, &dst, len); + +if (prefault) +fn (dst, src, len); + +BUG_ON (gettimeofday (&tv_start,NULL )); +for (i =0 ; i < iterations; ++i) +fn (dst, src, len); +BUG_ON (gettimeofday (&tv_end,NULL )); + +timersub (&tv_end, &tv_start, &tv_diff); + +free (src); +free (dst); +return (double )((double )len /timeval2double (&tv_diff)); +} + +int bench_mem_memcpy (int argc,const char **argv, +const char *prefix__maybe_unused ) +{ +struct bench_mem_info info = { + .routines = memcpy_routines, + .do_cycle = do_memcpy_cycle, + .do_gettimeofday = do_memcpy_gettimeofday, + .usage = bench_mem_memcpy_usage, + }; + +return bench_mem_common (argc, argv, prefix, &info); +}
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 2/18 perf bench: Merge memset into memcpy
In reply to Arnaldo Carvalho de MeloFrom: Rabin Vincent <[email protected]>
The memset benchmark is largely copy-pasted from the memcpy benchmark. Merge the two now that memcpy is made more generic.
--- tools/perf/Makefile.perf | 1 - tools/perf/bench/mem-memcpy.c | 90 +++++++++++++ tools/perf/bench/mem-memset.c | 304 ------------------------------------------ 3 files changed, 90 insertions(+), 305 deletions(-) delete mode 100644 tools/perf/bench/mem-memset.c
tools/perf/Makefile.perf +0 -1
@@ -458,7 +458,6 @@ BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy-x86-64-asm.o BUILTIN_OBJS += $(OUTPUT)bench/mem-memset-x86-64-asm.o endif BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy.o -BUILTIN_OBJS += $(OUTPUT)bench/mem-memset.o BUILTIN_OBJS += $(OUTPUT)bench/futex-hash.o BUILTIN_OBJS += $(OUTPUT)bench/futex-wake.o BUILTIN_OBJS += $(OUTPUT)bench/futex-requeue.o
tools/perf/bench/mem-memcpy.c +90 -0
111 lines not on this page · raw message
tools/perf/bench/mem-memset.c deleted +0 -304
304 lines not on this page · raw message
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 3/18 perf bench: Fix memcpy/memset output
In reply to Arnaldo Carvalho de MeloFrom: Rabin Vincent <[email protected]>
The memcpy and memset benchmarks return bogus results when iterations > 0 because the iterations value is not taken into account when calculating the final result:
$ perf bench mem memset --only-prefault --length 1GB --iterations 1 # Running 'mem/memset' benchmark: # Copying 1GB Bytes ...
20.798669 GB/Sec (with prefault) $ perf bench mem memset --only-prefault --length 1GB --iterations 10 # Running 'mem/memset' benchmark: # Copying 1GB Bytes ...
2.086576 GB/Sec (with prefault) $ perf bench mem memset --only-prefault --length 1GB --iterations 100 # Running 'mem/memset' benchmark: # Copying 1GB Bytes ...
212.840917 MB/Sec (with prefault)
Fix this.
--- tools/perf/bench/mem-memcpy.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
tools/perf/bench/mem-memcpy.c +10 -8
@@ -141,6 +141,7 @@ static int bench_mem_common(int argc, const char **argv, {int i;size_t len; +double totallen;double result_bps[2 ];u64 result_cycle[2 ];
@@ -156,6 +157,7 @@ static int bench_mem_common(int argc, const char **argv,init_cycle (); len = (size_t )perf_atoll ((char *)length_str); + totallen = (double )len * iterations; result_cycle[0 ] = result_cycle[1 ] =0ULL ; result_bps[0 ] = result_bps[1 ] =0.0 ;
@@ -219,10 +221,10 @@ static int bench_mem_common(int argc, const char **argv,if (use_cycle) {printf (" %14lf Cycle/Byte\n" , (double )result_cycle[0 ] - / (double )len); + / totallen);printf (" %14lf Cycle/Byte (with prefault)\n" , (double )result_cycle[1 ] - / (double )len); + / totallen); }else {print_bps (result_bps[0 ]);printf ("\n" );
@@ -233,7 +235,7 @@ static int bench_mem_common(int argc, const char **argv,if (use_cycle) {printf (" %14lf Cycle/Byte" , (double )result_cycle[pf] - / (double )len); + / totallen); }else print_bps (result_bps[pf]);
@@ -244,8 +246,8 @@ static int bench_mem_common(int argc, const char **argv,if (!only_prefault && !no_prefault) {if (use_cycle) {printf ("%lf %lf\n" , - (double )result_cycle[0 ] / (double )len, - (double )result_cycle[1 ] / (double )len); + (double )result_cycle[0 ] / totallen, + (double )result_cycle[1 ] / totallen); }else {printf ("%lf %lf\n" , result_bps[0 ], result_bps[1 ]);
@@ -253,7 +255,7 @@ static int bench_mem_common(int argc, const char **argv, }else {if (use_cycle) {printf ("%lf\n" , (double )result_cycle[pf] - / (double )len); + / totallen); }else printf ("%lf\n" , result_bps[pf]); }
@@ -324,7 +326,7 @@ static double do_memcpy_gettimeofday(const struct routine *r, size_t len,free (src);free (dst); -return (double )((double )len /timeval2double (&tv_diff)); +return (double )(((double )len * iterations) /timeval2double (&tv_diff)); } int bench_mem_memcpy(int argc, const char **argv,
@@ -389,7 +391,7 @@ static double do_memset_gettimeofday(const struct routine *r, size_t len,timersub (&tv_end, &tv_start, &tv_diff);free (dst); -return (double )((double )len /timeval2double (&tv_diff)); +return (double )(((double )len * iterations) /timeval2double (&tv_diff)); }static const char *const bench_mem_memset_usage[] = {
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 4/18 perf hists browser: Change print format from %lu to %PRIu64
In reply to Arnaldo Carvalho de MeloFrom: Tom Huynh <[email protected]>
The nr_events variable in tools/perf/ui/browsers/hists.c is of type u64, so the print format (%lu) causes 'perf report' to show 0 event count when running with 32-bit userspace without redirection.
This patch fixes that problem by printing nr_events as PRIu64.
--- tools/perf/ui/browsers/hists.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/ui/browsers/hists.c +1 -1
@@ -1252,7 +1252,7 @@ static int hists__browser_title(struct hists *hists, nr_samples =convert_unit (nr_samples, &unit); printed =scnprintf (bf, size, -"Samples: %lu%c of event '%s', Event count (approx.): %lu" , +"Samples: %lu%c of event '%s', Event count (approx.): %" PRIu64, nr_samples, unit, ev_name, nr_events);
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 5/18 perf tools: Use single strcmp call instead of two
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
There's no need to use 2 strcmp calls, one is enough.
--- tools/perf/util/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/config.c +1 -1
@@ -522,7 +522,7 @@ static int buildid_dir_command_config(const char *var, const char *value,const char *v;/* same dir for all commands */ -if (!prefixcmp (var,"buildid." ) && !strcmp (var +8 ,"dir" )) { +if (!strcmp (var,"buildid.dir" )) { v =perf_config_dirname (var, value);if (!v)return -1 ;
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 6/18 perf buildid-cache: Remove extra debugdir variables
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
There's no need to copy over the buildid_dir into separate variable with no change.
This is leftover from commit:
45de34bbe3e1 perf buildid: add perfconfig option to specify buildid cache dir
that added global buildid_dir variable that holds cache directory, but did not cleanup the debugdir copies.
--- tools/perf/builtin-buildid-cache.c | 11 ++++------- tools/perf/util/build-id.c | 9 +++------ 2 files changed, 7 insertions(+), 13 deletions(-)
tools/perf/builtin-buildid-cache.c +4 -7
@@ -285,7 +285,6 @@ int cmd_buildid_cache(int argc, const char **argv,struct str_node *pos;int ret =0 ;bool force = false; -char debugdir[PATH_MAX ];char const *add_name_list_str =NULL , *remove_name_list_str =NULL , *missing_filename = NULL,
@@ -335,13 +334,11 @@ int cmd_buildid_cache(int argc, const char **argv,setup_pager (); -snprintf (debugdir,sizeof (debugdir),"%s" , buildid_dir); -if (add_name_list_str) { list =strlist__new (true, add_name_list_str);if (list) {strlist__for_each (pos, list) -if (build_id_cache__add_file (pos->s, debugdir)) { +if (build_id_cache__add_file (pos->s, buildid_dir)) {if (errno ==EEXIST ) {pr_debug ("%s already in the cache\n" , pos->s);
@@ -359,7 +356,7 @@ int cmd_buildid_cache(int argc, const char **argv, list =strlist__new (true, remove_name_list_str);if (list) {strlist__for_each (pos, list) -if (build_id_cache__remove_file (pos->s, debugdir)) { +if (build_id_cache__remove_file (pos->s, buildid_dir)) {if (errno ==ENOENT ) {pr_debug ("%s wasn't in the cache\n" , pos->s);
@@ -380,7 +377,7 @@ int cmd_buildid_cache(int argc, const char **argv, list =strlist__new (true, update_name_list_str);if (list) {strlist__for_each (pos, list) -if (build_id_cache__update_file (pos->s, debugdir)) { +if (build_id_cache__update_file (pos->s, buildid_dir)) {if (errno ==ENOENT ) {pr_debug ("%s wasn't in the cache\n" , pos->s);
@@ -395,7 +392,7 @@ int cmd_buildid_cache(int argc, const char **argv, }if (kcore_filename && -build_id_cache__add_kcore (kcore_filename, debugdir, force)) +build_id_cache__add_kcore (kcore_filename, buildid_dir, force))pr_warning ("Couldn't add %s\n" , kcore_filename); out:
tools/perf/util/build-id.c +3 -6
@@ -410,21 +410,18 @@ int perf_session__cache_build_ids(struct perf_session *session) {struct rb_node *nd;int ret; -char debugdir[PATH_MAX ];if (no_buildid_cache)return 0 ; -snprintf (debugdir,sizeof (debugdir),"%s" , buildid_dir); - -if (mkdir (debugdir,0755 ) !=0 && errno !=EEXIST ) +if (mkdir (buildid_dir,0755 ) !=0 && errno !=EEXIST )return -1 ; - ret =machine__cache_build_ids (&session->machines.host, debugdir); + ret =machine__cache_build_ids (&session->machines.host, buildid_dir);for (nd =rb_first (&session->machines.guests); nd; nd =rb_next (nd)) { struct machine *pos = rb_entry(nd, struct machine, rb_node); - ret |=machine__cache_build_ids (pos, debugdir); + ret |=machine__cache_build_ids (pos, buildid_dir); }return ret ?-1 :0 ; }
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 7/18 perf buildid cache: Fix -a segfault related to kcore handling
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
The kcore_filename is uninitialized and trash value could trigger build_id_cache__add_kcore function ending up with segfault.
--- tools/perf/builtin-buildid-cache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-buildid-cache.c +1 -1
@@ -289,7 +289,7 @@ int cmd_buildid_cache(int argc, const char **argv, *remove_name_list_str =NULL , *missing_filename =NULL , *update_name_list_str =NULL , - *kcore_filename; + *kcore_filename =NULL ;char sbuf[STRERR_BUFSIZE ];struct perf_data_file file = {
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 8/18 perf tools: Add --buildid-dir option to set cache directory
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Adding --buildid-dir to be able to set specific cache directory. It's going to be handy for buildid tests coming in shortly.
--- tools/perf/Documentation/perf.txt | 4 ++++ tools/perf/perf.c | 14 ++++++++++++-- tools/perf/util/config.c | 8 +++++--- tools/perf/util/util.h | 2 +- 4 files changed, 22 insertions(+), 6 deletions(-)
tools/perf/Documentation/perf.txt +4 -0
@@ -18,6 +18,10 @@ OPTIONS --debug verbose # sets verbose = 1 --debug verbose=2 # sets verbose = 2 +--buildid-dir:: + Setup buildid cache directory. It has higher priority than + buildid.dir config file option. + DESCRIPTION ----------- Performance counters for Linux are a new kernel-based subsystem
tools/perf/perf.c +12 -2
@@ -200,6 +200,16 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) *envchanged =1 ; (*argv)++; (*argc)--; + }else if (!strcmp (cmd,"--buildid-dir" )) { +if (*argc <2 ) { +fprintf (stderr,"No directory given for --buildid-dir.\n" ); +usage (perf_usage_string); + } +set_buildid_dir ((*argv)[1 ]); +if (envchanged) + *envchanged =1 ; + (*argv)++; + (*argc)--; }else if (!prefixcmp (cmd,CMD_DEBUGFS_DIR )) {perf_debugfs_set_path (cmd +strlen (CMD_DEBUGFS_DIR ));fprintf (stderr,"dir: %s\n" , debugfs_mountpoint);
@@ -499,7 +509,7 @@ int main(int argc, const char **argv) }if (!prefixcmp (cmd,"trace" )) {#ifdef HAVE_LIBAUDIT_SUPPORT -set_buildid_dir (); +set_buildid_dir (NULL );setup_path (); argv[0 ] ="trace" ;return cmd_trace (argc, argv,NULL );
@@ -514,7 +524,7 @@ int main(int argc, const char **argv) argc--;handle_options (&argv, &argc,NULL );commit_pager_choice (); -set_buildid_dir (); +set_buildid_dir (NULL );if (argc >0 ) {if (!prefixcmp (argv[0 ],"--" ))
tools/perf/util/config.c +5 -3
@@ -539,12 +539,14 @@ static void check_buildid_dir_config(void)perf_config (buildid_dir_command_config, &c); } -void set_buildid_dir (void ) +void set_buildid_dir (const char *dir) { - buildid_dir[0 ] ='\0' ; +if (dir) +scnprintf (buildid_dir,MAXPATHLEN -1 ,"%s" , dir);/* try config file */ -check_buildid_dir_config (); +if (buildid_dir[0 ] =='\0' ) +check_buildid_dir_config ();/* default to $HOME/.debug */ if (buildid_dir[0 ] =='\0' ) {
tools/perf/util/util.h +1 -1
@@ -153,7 +153,7 @@ extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)))extern void set_die_routine (void (*routine)(const char *err,va_list params)NORETURN );extern int prefixcmp (const char *str,const char *prefix); -extern void set_buildid_dir (void ); +extern void set_buildid_dir (const char *dir);static inline const char *skip_prefix (const char *str,const char *prefix) {
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 9/18 perf callchain: Fixup parameter handling error message
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Fix up parse_callchain_record_opt error message for 'fp', in the past using '-g fp' was a valid alternative to '--call-graph fp', which is not the case since:
commit 09b0fd45ff63413df94cbd832a765076b201edbb
Author: Jiri Olsa <[email protected]>
Date: Sat Oct 26 16:25:33 2013 +0200
perf record: Split -g and --call-graph
I.e. -g means "use the configured unwind data collection method" which has as default 'fp', while --call-graph requires passing the method to use.
--- tools/perf/util/callchain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/callchain.c +1 -1
@@ -77,7 +77,7 @@ int parse_callchain_record_opt(const char *arg) ret =0 ; }else pr_err ("callchain: No more arguments " -"needed for -g fp\n" ); +"needed for --call-graph fp\n" );break ;#ifdef HAVE_DWARF_UNWIND_SUPPORT
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 10/18 perf callchain: Move cpumode resolve code to add_callchain_ip
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Using flag to distinguish between branch_history and normal callchain.
Move the cpumode to add_callchain_ip function.
No change in behavior.
--- tools/perf/util/machine.c | 72 +++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 37 deletions(-)
tools/perf/util/machine.c +35 -37
@@ -1385,19 +1385,46 @@ struct mem_info *sample__resolve_mem(struct perf_sample *sample,static int add_callchain_ip (struct thread *thread,struct symbol **parent,struct addr_location *root_al, -int cpumode, +bool branch_history,u64 ip) {struct addr_location al; al.filtered =0 ; al.sym =NULL ; -if (cpumode ==-1 ) +if (branch_history)thread__find_cpumode_addr_location (thread,MAP__FUNCTION , ip, &al); -else +else { +u8 cpumode =PERF_RECORD_MISC_USER ; + +if (ip >=PERF_CONTEXT_MAX ) { +switch (ip) { +case PERF_CONTEXT_HV : + cpumode =PERF_RECORD_MISC_HYPERVISOR ; +break ; +case PERF_CONTEXT_KERNEL : + cpumode =PERF_RECORD_MISC_KERNEL ; +break ; +case PERF_CONTEXT_USER : + cpumode =PERF_RECORD_MISC_USER ; +break ; +default : +pr_debug ("invalid callchain context: " +"%" PRId64"\n" , (s64 ) ip); +/* +* It seems the callchain is corrupted. +* Discard all. +*/ +callchain_cursor_reset (&callchain_cursor); +return 1 ; + } +return 0 ; + }thread__find_addr_location (thread, cpumode,MAP__FUNCTION , ip, &al); + } +if (al.sym !=NULL ) {if (sort__has_parent && !*parent &&symbol__match_regex (al.sym, &parent_regex))
@@ -1480,11 +1507,8 @@ static int thread__resolve_callchain_sample(struct thread *thread,struct addr_location *root_al, int max_stack) { -u8 cpumode =PERF_RECORD_MISC_USER ; int chain_nr = min(max_stack, (int)chain->nr); -int i; -int j; -int err; +int i, j, err;int skip_idx =-1 ;int first_call =0 ;
@@ -1542,10 +1566,10 @@ static int thread__resolve_callchain_sample(struct thread *thread,for (i =0 ; i < nr; i++) { err =add_callchain_ip (thread, parent, root_al, --1 , be[i].to); + true, be[i].to);if (!err) err =add_callchain_ip (thread, parent, root_al, --1 , be[i].from); + true, be[i].from);if (err == -EINVAL )break ;if (err)
@@ -1574,36 +1598,10 @@ check_calls:#endif ip = chain->ips[j]; -if (ip >=PERF_CONTEXT_MAX ) { -switch (ip) { -case PERF_CONTEXT_HV : - cpumode =PERF_RECORD_MISC_HYPERVISOR ; -break ; -case PERF_CONTEXT_KERNEL : - cpumode =PERF_RECORD_MISC_KERNEL ; -break ; -case PERF_CONTEXT_USER : - cpumode =PERF_RECORD_MISC_USER ; -break ; -default : -pr_debug ("invalid callchain context: " -"%" PRId64"\n" , (s64 ) ip); -/* -* It seems the callchain is corrupted. -* Discard all. -*/ -callchain_cursor_reset (&callchain_cursor); -return 0 ; - } -continue ; - } + err =add_callchain_ip (thread, parent, root_al, false, ip); - err =add_callchain_ip (thread, parent, root_al, - cpumode, ip); -if (err == -EINVAL ) -break ;if (err) -return err; +return (err <0 ) ? err :0 ; }return 0 ;
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 11/18 calloc/xcalloc: Fix argument order
In reply to Arnaldo Carvalho de MeloFrom: Arjun Sreedharan <[email protected]>
The calloc() and xcalloc() functions takes @nmemb first and then @size. Fix all w/ pattern "calloc\s*(\s*sizeof".
--- scripts/kconfig/mconf.c | 4 ++-- tools/perf/ui/hist.c | 4 ++-- tools/thermal/tmon/sysfs.c | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-)
scripts/kconfig/mconf.c +2 -2
@@ -330,10 +330,10 @@ static void set_subtitle(void)list_for_each_entry (sp, &trail, entries) {if (sp->text) {if (pos) { - pos->next =xcalloc (sizeof (*pos),1 ); + pos->next =xcalloc (1 ,sizeof (*pos)); pos = pos->next; }else { - subtitles = pos =xcalloc (sizeof (*pos),1 ); + subtitles = pos =xcalloc (1 ,sizeof (*pos)); } pos->text = sp->text; }
tools/perf/ui/hist.c +2 -2
@@ -162,8 +162,8 @@ static int __hpp__sort(struct hist_entry *a, struct hist_entry *b,return ret; nr_members = evsel->nr_members; - fields_a =calloc (sizeof (*fields_a), nr_members); - fields_b =calloc (sizeof (*fields_b), nr_members); + fields_a =calloc (nr_members,sizeof (*fields_a)); + fields_b =calloc (nr_members,sizeof (*fields_b));if (!fields_a || !fields_b) goto out;
tools/thermal/tmon/sysfs.c +3 -3
@@ -446,7 +446,7 @@ int probe_thermal_sysfs(void)return -1 ; } - ptdata.tzi =calloc (sizeof (struct tz_info ), ptdata.max_tz_instance+1 ); + ptdata.tzi =calloc (ptdata.max_tz_instance+1 ,sizeof (struct tz_info ));if (!ptdata.tzi) {fprintf (stderr,"Err: allocate tz_info\n" );return -1 ;
@@ -454,8 +454,8 @@ int probe_thermal_sysfs(void)/* we still show thermal zone information if there is no cdev */ if (ptdata.nr_cooling_dev) { - ptdata.cdi =calloc (sizeof (struct cdev_info ), - ptdata.max_cdev_instance +1 ); + ptdata.cdi =calloc (ptdata.max_cdev_instance +1 , +sizeof (struct cdev_info ));if (!ptdata.cdi) {free (ptdata.tzi);fprintf (stderr,"Err: allocate cdev_info\n" );
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 12/18 perf tests: Fix attr tests size values to cope with machine state on interrupt ABI changes
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Following change adjusted 'struct perf_event_attr', but let the attr test's sizes untouched:
60e2364e60e8 perf: Add ability to sample machine state on interrupt
[jolsa@krava perf]$ ./perf test attr -vv
--- start ---
test child forked, pid 9719
running './tests/attr/test-stat-group1'
'PERF_TEST_ATTR=/tmp/tmp4drvul ./perf stat -o /tmp/tmp4drvul/perf.data -e '{cycles,instructions}' kill >/dev/null 2>&1' ret 1
expected size=96, got 104
FAILED './tests/attr/test-stat-group1' - match failure
Adjusting test size values for attr test.
--- tools/perf/tests/attr/base-record | 2 +- tools/perf/tests/attr/base-stat | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
tools/perf/tests/attr/base-record +1 -1
@@ -5,7 +5,7 @@ group_fd=-1 flags=0|8 cpu=* type=0|1 -size=96 +size=104 config=0 sample_period=4000 sample_type=263
tools/perf/tests/attr/base-stat +1 -1
@@ -5,7 +5,7 @@ group_fd=-1 flags=0|8 cpu=* type=0 -size=96 +size=104 config=0 sample_period=0 sample_type=0
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 13/18 perf kvm stat live: Mark events as (x86 only) in help output
In reply to Arnaldo Carvalho de MeloFrom: Alexander Yarygin <[email protected]>
The mmio and ioport events are useful only on x86.
--- tools/perf/builtin-kvm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/builtin-kvm.c +2 -1
@@ -1293,7 +1293,8 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,OPT_UINTEGER ('d' ,"display" , &kvm->display_time,"time in seconds between display updates" ),OPT_STRING (0 ,"event" , &kvm->report_event,"report event" , -"event for reporting: vmexit, mmio, ioport" ), +"event for reporting: " +"vmexit, mmio (x86 only), ioport (x86 only)" ),OPT_INTEGER (0 ,"vcpu" , &kvm->trace_vcpu,"vcpu id to report" ), OPT_STRING('k', "key", &kvm->sort_key, "sort-key",
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 14/18 tools lib fs: Adopt filename__read_int from tools/perf/
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Will be useful for new helpers to read sysctl values.
--- tools/lib/api/fs/fs.c | 21 +++++++++++++++++++++ tools/lib/api/fs/fs.h | 2 ++ tools/perf/util/util.c | 17 ----------------- tools/perf/util/util.h | 1 - 4 files changed, 23 insertions(+), 18 deletions(-)
tools/lib/api/fs/fs.c +21 -0
@@ -7,6 +7,10 @@#include <stdlib.h> #include <string.h> #include <sys/vfs.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> #include "debugfs.h" #include "fs.h"
@@ -163,3 +167,20 @@ const char *name##__mountpoint(void) \FS__MOUNTPOINT (sysfs,FS__SYSFS );FS__MOUNTPOINT (procfs,FS__PROCFS ); + +int filename__read_int (const char *filename,int *value) +{ +char line[64 ]; +int fd =open (filename,O_RDONLY ), err =-1 ; + +if (fd <0 ) +return -1 ; + +if (read (fd, line,sizeof (line)) >0 ) { + *value =atoi (line); + err =0 ; + } + +close (fd); +return err; +}
tools/lib/api/fs/fs.h +2 -0
@@ -11,4 +11,6 @@const char *sysfs__mountpoint (void );const char *procfs__mountpoint (void ); + +int filename__read_int (const char *filename,int *value);#endif /* __API_FS__ */
tools/perf/util/util.c +0 -17
@@ -442,23 +442,6 @@ unsigned long parse_tag_value(const char *str, struct parse_tag *tags)return (unsigned long )-1 ; } -int filename__read_int (const char *filename,int *value) -{ -char line[64 ]; -int fd =open (filename,O_RDONLY ), err =-1 ; - -if (fd <0 ) -return -1 ; - -if (read (fd, line,sizeof (line)) >0 ) { - *value =atoi (line); - err =0 ; - } - -close (fd); -return err; -} -int filename__read_str (const char *filename,char **buf,size_t *sizep) {size_t size =0 , alloc_size =0 ;
tools/perf/util/util.h +0 -1
@@ -343,7 +343,6 @@ char *get_srcline(struct dso *dso, unsigned long addr, struct symbol *sym, bool show_sym);void free_srcline (char *srcline); -int filename__read_int (const char *filename,int *value);int filename__read_str (const char *filename,char **buf,size_t *sizep);int perf_event_paranoid (void );
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 15/18 tools lib fs: Add sysctl__read_int helper
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Will come in handy for tools, see next patches.
--- tools/lib/api/fs/fs.c | 13 +++++++++++++ tools/lib/api/fs/fs.h | 1 + 2 files changed, 14 insertions(+)
tools/lib/api/fs/fs.c +13 -0
@@ -184,3 +184,16 @@ int filename__read_int(const char *filename, int *value)close (fd);return err; } + +int sysctl__read_int (const char *sysctl,int *value) +{ +char path[PATH_MAX ]; +const char *procfs =procfs__mountpoint (); + +if (!procfs) +return -1 ; + +snprintf (path,sizeof (path),"%s/sys/%s" , procfs, sysctl); + +return filename__read_int (path, value); +}
tools/lib/api/fs/fs.h +1 -0
@@ -13,4 +13,5 @@ const char *sysfs__mountpoint(void);const char *procfs__mountpoint (void );int filename__read_int (const char *filename,int *value); +int sysctl__read_int (const char *sysctl,int *value);#endif /* __API_FS__ */
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 16/18 perf tools: Use sysctl__read_int instead of ad-hoc copies
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/record.c | 11 +---------- tools/perf/util/util.c | 9 +-------- 2 files changed, 2 insertions(+), 18 deletions(-)
tools/perf/util/record.c +1 -10
@@ -137,16 +137,7 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts)static int get_max_rate (unsigned int *rate) { -char path[PATH_MAX ]; -const char *procfs =procfs__mountpoint (); - -if (!procfs) -return -1 ; - -snprintf (path,PATH_MAX , -"%s/sys/kernel/perf_event_max_sample_rate" , procfs); - -return filename__read_int (path, (int *) rate); +return sysctl__read_int ("kernel/perf_event_max_sample_rate" , (int *)rate); }static int record_opts__config_freq (struct record_opts *opts)
tools/perf/util/util.c +1 -8
@@ -506,16 +506,9 @@ const char *get_filename_for_perf_kvm(void)int perf_event_paranoid (void ) { -char path[PATH_MAX ]; -const char *procfs =procfs__mountpoint ();int value; -if (!procfs) -return INT_MAX ; - -scnprintf (path,PATH_MAX ,"%s/sys/kernel/perf_event_paranoid" , procfs); - -if (filename__read_int (path, &value)) +if (sysctl__read_int ("kernel/perf_event_paranoid" , &value))return INT_MAX ;return value;
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 17/18 perf evlist: Introduce strerror_mmap method
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
To pretty print hints about perf_evlist__mmap errors. Will be used in 'trace' in the next patch.
--- tools/perf/util/evlist.c | 23 +++++++++++++++++++++++ tools/perf/util/evlist.h | 1 + 2 files changed, 24 insertions(+)
tools/perf/util/evlist.c +23 -0
@@ -8,6 +8,7 @@*/ #include "util.h" #include <api/fs/debugfs.h> +#include <api/fs/fs.h> #include <poll.h> #include "cpumap.h" #include "thread_map.h"
@@ -1483,6 +1484,28 @@ int perf_evlist__strerror_open(struct perf_evlist *evlist __maybe_unused,return 0 ; } +int perf_evlist__strerror_mmap (struct perf_evlist *evlist,int err,char *buf,size_t size) +{ +char sbuf[STRERR_BUFSIZE ], *emsg =strerror_r (err, sbuf,sizeof (sbuf)); +int value; + +switch (err) { +case EPERM : +sysctl__read_int ("kernel/perf_event_mlock_kb" , &value); +scnprintf (buf, size,"Error:\t%s.\n" +"Hint:\tCheck /proc/sys/kernel/perf_event_mlock_kb (%d kB) setting.\n" +"Hint:\tTried using %zd kB.\n" +"Hint:\tTry using a bigger -m/--mmap-pages value." , + emsg, value, evlist->mmap_len /1024 ); +break ; +default : +scnprintf (buf, size,"%s" , emsg); +break ; + } + +return 0 ; +} +void perf_evlist__to_front (struct perf_evlist *evlist,struct perf_evsel *move_evsel) {
tools/perf/util/evlist.h +1 -0
@@ -185,6 +185,7 @@ size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp);int perf_evlist__strerror_tp (struct perf_evlist *evlist,int err,char *buf,size_t size);int perf_evlist__strerror_open (struct perf_evlist *evlist,int err,char *buf,size_t size); +int perf_evlist__strerror_mmap (struct perf_evlist *evlist,int err,char *buf,size_t size);static inline unsigned int perf_mmap__read_head (struct perf_mmap *mm) {
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 18/18 perf trace: Provide a better explanation when mmap fails
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
If we ask for a mmap lenght than the max configured via the relevant sysctl, provide a better warning, instead of just expanding the EPERM returned:
[acme@ssdandy ~]$ trace -m 256 -e nanosleep sleep 2
Error: Operation not permitted.
Hint: Check /proc/sys/kernel/perf_event_mlock_kb (516 kB) setting.
Hint: Tried using 1028 kB.
Hint: Try using a bigger -m/--mmap-pages value.
[acme@ssdandy ~]$ trace -m 128 -e nanosleep sleep 2
2001.280 (2000.403 ms): nanosleep(rqtp: 0x7fff89a8a7f0) = 0
[acme@ssdandy ~]$
An upcoming patch will autotune the request for non-root users when -m is not used.
--- tools/perf/builtin-trace.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
tools/perf/builtin-trace.c +6 -6
@@ -2045,7 +2045,6 @@ static int trace__run(struct trace *trace, int argc, const char **argv)unsigned long before;const bool forks = argc >0 ;bool draining = false; -char sbuf[STRERR_BUFSIZE ]; trace->live = true;
@@ -2106,11 +2105,8 @@ static int trace__run(struct trace *trace, int argc, const char **argv) goto out_error_open; err =perf_evlist__mmap (evlist, trace->opts.mmap_pages, false); -if (err <0 ) { -fprintf (trace->output,"Couldn't mmap the events: %s\n" , -strerror_r (errno, sbuf,sizeof (sbuf))); - goto out_delete_evlist; - } +if (err <0 ) + goto out_error_mmap;perf_evlist__enable (evlist);
@@ -2210,6 +2206,10 @@ out_error_tp:perf_evlist__strerror_tp (evlist, errno, errbuf,sizeof (errbuf)); goto out_error; +out_error_mmap: +perf_evlist__strerror_mmap (evlist, errno, errbuf,sizeof (errbuf)); + goto out_error; + out_error_open:perf_evlist__strerror_open (evlist, errno, errbuf,sizeof (errbuf));
Signature · 1 line
1.9.3
Quoted 114 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit
cfa0bd52d0ba9b852f76c7b3f1055edd5e5c7846:Merge tag 'perf-core-for-mingo-2' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linuxinto perf/core (2014-12-08 07:45:45 +0100)are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingofor you to fetch changes up to
e09b18d4907992d3d615b215c1abf585721b2810:perf trace: Provide a better explanation when mmap fails (2014-12-11 18:04:10 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:User visible:
- Mark events as (x86 only) in help output for 'perf kvm stat live" (Alexander Yarygin)
- Provide a better explanation when mmap fails in 'trace' (Arnaldo Carvalho de Melo)
- Add --buildid-dir option to set cache directory, i.e. use:
$ perf --buildid-dir /path/to/dir tool --tool-options(Jiri Olsa)
- Fix memcpy/memset 'perf bench' output (Rabin Vicent)
- Fix 'perf test' attr tests size values to cope with machine state on interrupt ABI changes (Jiri Olsa)
- Fixup callchain type parameter handling error message (Kan Liang)
Infrastructure/cleanups:
- calloc/xcalloc: Fix argument order (Arjun Sreedharan)
- Move
filename__read_intfromtools/perf/totools/lib, addsysctl__read_intthere and use it in place of ad-hoc copies (Arnaldo Carvalho de Melo)- Use single strcmp call instead of two (Jiri Olsa)
- Remove extra debugdir variables in 'perf buildid-cache' (Jiri Olsa)
- Fix -a segfault related to kcore handling in 'perf buildid-cache' (Jiri Olsa)
- Move cpumode resolve code to
add_callchain_ip(Kan Liang)- Merge memset into memcpy 'perf bench' (Rabin Vincent)
- Change print format from %lu to %PRIu64 in the hists browser (Tom Huynh)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Alexander Yarygin (1):
perf kvm stat live: Mark events as (x86 only) in help outputArjun Sreedharan (1):
calloc/xcalloc: Fix argument orderArnaldo Carvalho de Melo (5):
tools lib fs: Adoptfilename__read_intfromtools/perf/tools lib fs: Addsysctl__read_inthelper
perf tools: Usesysctl__read_intinstead of ad-hoc copies perf evlist: Introducestrerror_mmapmethod perf trace: Provide a better explanation when mmap failsJiri Olsa (5):
perf tools: Use single strcmp call instead of two
perf buildid-cache: Remove extra debugdir variables
perf buildid cache: Fix -a segfault related to kcore handling
perf tools: Add --buildid-dir option to set cache directory
perf tests: Fix attr tests size values to cope with machine state on interrupt ABI changesKan Liang (2):
perf callchain: Fixup parameter handling error message perf callchain: Move cpumode resolve code toadd_callchain_ipRabin Vincent (3):
perf bench: Prepare memcpy for merge
perf bench: Merge memset into memcpy
perf bench: Fix memcpy/memset outputTom Huynh (1):
perf hists browser: Change print format from %lu to %PRIu64scripts/kconfig/mconf.c | 4 +- tools/lib/api/fs/fs.c | 34 +++++ tools/lib/api/fs/fs.h | 3 + tools/perf/Documentation/perf.txt | 4 + tools/perf/Makefile.perf | 1 - tools/perf/bench/mem-memcpy.c | 286 ++++++++++++++++++++++++---------- tools/perf/bench/mem-memset.c | 304 ------------------------------------- tools/perf/builtin-buildid-cache.c | 13 +- tools/perf/builtin-kvm.c | 3 +- tools/perf/builtin-trace.c | 12 +- tools/perf/perf.c | 14 +- tools/perf/tests/attr/base-record | 2 +- tools/perf/tests/attr/base-stat | 2 +- tools/perf/ui/browsers/hists.c | 2 +- tools/perf/ui/hist.c | 4 +- tools/perf/util/build-id.c | 9 +- tools/perf/util/callchain.c | 2 +- tools/perf/util/config.c | 10 +- tools/perf/util/evlist.c | 23 +++
Quoted 8 lines
tools/perf/util/evlist.h | 1 + tools/perf/util/machine.c | 72 +++++---- tools/perf/util/record.c | 11 +- tools/perf/util/util.c | 26 +--- tools/perf/util/util.h | 3 +- tools/thermal/tmon/sysfs.c | 6 +- 25 files changed, 350 insertions(+), 501 deletions(-) delete mode 100644 tools/perf/bench/mem-memset.c
Pulled, thanks a lot Arnaldo!
Ingo