perf tools: Add +field argument support for --field option
authorJiri Olsa <jolsa@kernel.org>
Fri, 22 Aug 2014 13:58:38 +0000 (15:58 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Sun, 24 Aug 2014 11:11:19 +0000 (08:11 -0300)
Adding support to add field(s) to default field order via using the '+'
prefix, like for report:

  $ perf report
  Samples: 10  of event 'cycles', Event count (approx.): 4463799
  Overhead  Command  Shared Object      Symbol
    32.40%  ls       [kernel.kallsyms]  [k] filemap_fault
    28.19%  ls       [kernel.kallsyms]  [k] get_page_from_freelist
    23.38%  ls       [kernel.kallsyms]  [k] enqueue_entity
    15.04%  ls       [kernel.kallsyms]  [k] mmap_region

  $ perf report -F +period,sample
  Samples: 10  of event 'cycles', Event count (approx.): 4463799
  Overhead        Period       Samples  Command  Shared Object      Symbol
    32.40%       1446493             1  ls       [kernel.kallsyms]  [k] filemap_fault
    28.19%       1258486             1  ls       [kernel.kallsyms]  [k] get_page_from_freelist
    23.38%       1043754             1  ls       [kernel.kallsyms]  [k] enqueue_entity
    15.04%        671160             1  ls       [kernel.kallsyms]  [k] mmap_region

Works in general for commands using --field option.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jean Pihet <jean.pihet@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1408715919-25990-2-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/ui/hist.c
tools/perf/util/sort.c
tools/perf/util/sort.h

index 75eb6ac821f82dc917ccee5d29126b0b6bda7d5b..2af18376b0772ea5094e1f6277afa343533a484c 100644 (file)
@@ -452,7 +452,7 @@ void perf_hpp__init(void)
        /*
         * If user specified field order, no need to setup default fields.
         */
-       if (field_order)
+       if (is_strict_order(field_order))
                return;
 
        if (symbol_conf.cumulate_callchain) {
@@ -519,7 +519,7 @@ void perf_hpp__column_disable(unsigned col)
 
 void perf_hpp__cancel_cumulate(void)
 {
-       if (field_order)
+       if (is_strict_order(field_order))
                return;
 
        perf_hpp__column_disable(PERF_HPP__OVERHEAD_ACC);
index b4a805e5e44035fe26c2689b8eb29f0f7497a791..1958637cf136755709ae202f9d8e1e5038e3d341 100644 (file)
@@ -1453,7 +1453,7 @@ static int __setup_sorting(void)
        int ret = 0;
 
        if (sort_keys == NULL) {
-               if (field_order) {
+               if (is_strict_order(field_order)) {
                        /*
                         * If user specified field order but no sort order,
                         * we'll honor it and not add default sort orders.
@@ -1639,23 +1639,36 @@ static void reset_dimensions(void)
                memory_sort_dimensions[i].taken = 0;
 }
 
+bool is_strict_order(const char *order)
+{
+       return order && (*order != '+');
+}
+
 static int __setup_output_field(void)
 {
-       char *tmp, *tok, *str;
-       int ret = 0;
+       char *tmp, *tok, *str, *strp;
+       int ret = -EINVAL;
 
        if (field_order == NULL)
                return 0;
 
        reset_dimensions();
 
-       str = strdup(field_order);
+       strp = str = strdup(field_order);
        if (str == NULL) {
                error("Not enough memory to setup output fields");
                return -ENOMEM;
        }
 
-       for (tok = strtok_r(str, ", ", &tmp);
+       if (!is_strict_order(field_order))
+               strp++;
+
+       if (!strlen(strp)) {
+               error("Invalid --fields key: `+'");
+               goto out;
+       }
+
+       for (tok = strtok_r(strp, ", ", &tmp);
                        tok; tok = strtok_r(NULL, ", ", &tmp)) {
                ret = output_field_add(tok);
                if (ret == -EINVAL) {
@@ -1667,6 +1680,7 @@ static int __setup_output_field(void)
                }
        }
 
+out:
        free(str);
        return ret;
 }
index 041f0c9cea2b4f0f1af283ddeed3d3d5a9511e49..c03e4ff8beffe083ab19769d91a7e57d6f70d126 100644 (file)
@@ -218,4 +218,5 @@ void perf_hpp__set_elide(int idx, bool elide);
 
 int report_parse_ignore_callees_opt(const struct option *opt, const char *arg, int unset);
 
+bool is_strict_order(const char *order);
 #endif /* __PERF_SORT_H */