perf callchain: Move callchain specific routines from util.[ch]
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 56e2e05644a9494e8ba3165182dcdf43d40cc6a2 Gitweb: http://git.kernel.org/tip/56e2e05644a9494e8ba3165182dcdf43d40cc6a2 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Wed, 19 Apr 2017 18:38:33 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 24 Apr 2017 13:43:26 -0300
perf callchain: Move callchain specific routines from util.[ch]
Where they belong, no point in leaving those in the generic "util" files.
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/callchain.c | 103 +++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/python.c | 13 ++++++ tools/perf/util/util.c | 104 -------------------------------------------- tools/perf/util/util.h | 4 -- 4 files changed, 116 insertions(+), 108 deletions(-)
tools/perf/util/callchain.c +103 -0
@@ -24,6 +24,21 @@#include "machine.h" #include "callchain.h" +#define CALLCHAIN_PARAM_DEFAULT \ + .mode = CHAIN_GRAPH_ABS, \ + .min_percent = 0.5, \ + .order = ORDER_CALLEE, \ + .key = CCKEY_FUNCTION, \ + .value = CCVAL_PERCENT, \ + +struct callchain_param callchain_param = { +CALLCHAIN_PARAM_DEFAULT +}; + +struct callchain_param callchain_param_default = { +CALLCHAIN_PARAM_DEFAULT +}; + __threadstruct callchain_cursor callchain_cursor;int parse_callchain_record_opt (const char *arg,struct callchain_param *param)
@@ -113,6 +128,32 @@ static int parse_callchain_value(const char *value)return -1 ; } +static int get_stack_size (const char *str,unsigned long *_size) +{ +char *endptr; +unsigned long size; +unsigned long max_size =round_down (USHRT_MAX ,sizeof (u64)); + + size =strtoul (str, &endptr,0 ); + +do { +if (*endptr) +break ; + + size =round_up (size,sizeof (u64)); +if (!size || size > max_size) +break ; + + *_size = size; +return 0 ; + + }while (0 ); + +pr_err ("callchain: Incorrect stack dump size (max %ld): %s\n" , + max_size, str); +return -1 ; +} +static int __parse_callchain_report_opt (const char *arg,bool allow_record_opt) {
@@ -196,6 +237,68 @@ int parse_callchain_top_opt(const char *arg)return __parse_callchain_report_opt (arg, true); } +int parse_callchain_record (const char *arg,struct callchain_param *param) +{ +char *tok, *name, *saveptr =NULL ; +char *buf; +int ret =-1 ; + +/* We need buffer that we know we can write to. */ + buf =malloc (strlen (arg) +1 ); +if (!buf) +return -ENOMEM ; + +strcpy (buf, arg); + + tok =strtok_r ((char *)buf,"," , &saveptr); + name = tok ? : (char *)buf; + +do { +/* Framepointer style */ +if (!strncmp (name,"fp" ,sizeof ("fp" ))) { +if (!strtok_r (NULL ,"," , &saveptr)) { + param->record_mode =CALLCHAIN_FP ; + ret =0 ; + }else +pr_err ("callchain: No more arguments " +"needed for --call-graph fp\n" ); +break ; + +/* Dwarf style */ + }else if (!strncmp (name,"dwarf" ,sizeof ("dwarf" ))) { +const unsigned long default_stack_dump_size =8192 ; + + ret =0 ; + param->record_mode =CALLCHAIN_DWARF ; + param->dump_size = default_stack_dump_size; + + tok =strtok_r (NULL ,"," , &saveptr); +if (tok) { +unsigned long size =0 ; + + ret =get_stack_size (tok, &size); + param->dump_size = size; + } + }else if (!strncmp (name,"lbr" ,sizeof ("lbr" ))) { +if (!strtok_r (NULL ,"," , &saveptr)) { + param->record_mode =CALLCHAIN_LBR ; + ret =0 ; + }else +pr_err ("callchain: No more arguments " +"needed for --call-graph lbr\n" ); +break ; + }else { +pr_err ("callchain: Unknown --call-graph option " +"value: %s\n" , arg); +break ; + } + + }while (0 ); + +free (buf); +return ret; +} +int perf_callchain_config (const char *var,const char *value) {char *endptr;
tools/perf/util/python.c +13 -0
@@ -4,6 +4,7 @@#include <poll.h> #include <linux/err.h> #include "evlist.h" +#include "callchain.h" #include "evsel.h" #include "event.h" #include "cpumap.h"
@@ -11,6 +12,18 @@#include "thread_map.h" /* +* Provide these two so that we don't have to link against callchain.c and +* start dragging hist.c, etc. +*/ +struct callchain_param callchain_param; + +int parse_callchain_record (const char *arg__maybe_unused , +struct callchain_param *param__maybe_unused ) +{ +return 0 ; +} + +/* * Support debug printing even though util/debug.c is not linked. That means * implementing 'verbose' and 'eprintf'. */
tools/perf/util/util.c +0 -104
118 lines not on this page · raw message
tools/perf/util/util.h +0 -4
@@ -17,7 +17,6 @@#include <stdlib.h> #include <stdarg.h> #include <string.h> -#include <limits.h> #include <sys/param.h> #include <sys/types.h> #include <assert.h>
@@ -25,7 +24,6 @@#include <poll.h> #include <sys/socket.h> #include <sys/ioctl.h> -#include <linux/kernel.h> #include <linux/types.h> extern char buildid_dir[];
@@ -99,8 +97,6 @@ void mem_bswap_32(void *src, int byte_size);bool find_process (const char *name); -int get_stack_size (const char *str,unsigned long *_size); -int fetch_kernel_version (unsigned int *puint,char *str,size_t str_sz);#define KVER_VERSION (x) (((x) >> 16) & 0xff)