Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[sfrench/cifs-2.6.git] / tools / perf / util / sort.c
index 901b9bece2ee439ebbc9e9100471cd03883b55d8..45512baaab672706d1c0fd4c858630fed4176364 100644 (file)
@@ -1061,6 +1061,7 @@ static struct hpp_dimension hpp_sort_dimensions[] = {
        DIM(PERF_HPP__OVERHEAD_US, "overhead_us"),
        DIM(PERF_HPP__OVERHEAD_GUEST_SYS, "overhead_guest_sys"),
        DIM(PERF_HPP__OVERHEAD_GUEST_US, "overhead_guest_us"),
+       DIM(PERF_HPP__OVERHEAD_ACC, "overhead_children"),
        DIM(PERF_HPP__SAMPLES, "sample"),
        DIM(PERF_HPP__PERIOD, "period"),
 };
@@ -1156,6 +1157,7 @@ __sort_dimension__alloc_hpp(struct sort_dimension *sd)
 
        INIT_LIST_HEAD(&hse->hpp.list);
        INIT_LIST_HEAD(&hse->hpp.sort_list);
+       hse->hpp.elide = false;
 
        return hse;
 }
@@ -1363,27 +1365,64 @@ static int __setup_sorting(void)
        return ret;
 }
 
-bool perf_hpp__should_skip(struct perf_hpp_fmt *format)
+void perf_hpp__set_elide(int idx, bool elide)
 {
-       if (perf_hpp__is_sort_entry(format)) {
-               struct hpp_sort_entry *hse;
+       struct perf_hpp_fmt *fmt;
+       struct hpp_sort_entry *hse;
+
+       perf_hpp__for_each_format(fmt) {
+               if (!perf_hpp__is_sort_entry(fmt))
+                       continue;
 
-               hse = container_of(format, struct hpp_sort_entry, hpp);
-               return hse->se->elide;
+               hse = container_of(fmt, struct hpp_sort_entry, hpp);
+               if (hse->se->se_width_idx == idx) {
+                       fmt->elide = elide;
+                       break;
+               }
        }
-       return false;
 }
 
-static void sort_entry__setup_elide(struct sort_entry *se,
-                                   struct strlist *list,
-                                   const char *list_name, FILE *fp)
+static bool __get_elide(struct strlist *list, const char *list_name, FILE *fp)
 {
        if (list && strlist__nr_entries(list) == 1) {
                if (fp != NULL)
                        fprintf(fp, "# %s: %s\n", list_name,
                                strlist__entry(list, 0)->s);
-               se->elide = true;
+               return true;
        }
+       return false;
+}
+
+static bool get_elide(int idx, FILE *output)
+{
+       switch (idx) {
+       case HISTC_SYMBOL:
+               return __get_elide(symbol_conf.sym_list, "symbol", output);
+       case HISTC_DSO:
+               return __get_elide(symbol_conf.dso_list, "dso", output);
+       case HISTC_COMM:
+               return __get_elide(symbol_conf.comm_list, "comm", output);
+       default:
+               break;
+       }
+
+       if (sort__mode != SORT_MODE__BRANCH)
+               return false;
+
+       switch (idx) {
+       case HISTC_SYMBOL_FROM:
+               return __get_elide(symbol_conf.sym_from_list, "sym_from", output);
+       case HISTC_SYMBOL_TO:
+               return __get_elide(symbol_conf.sym_to_list, "sym_to", output);
+       case HISTC_DSO_FROM:
+               return __get_elide(symbol_conf.dso_from_list, "dso_from", output);
+       case HISTC_DSO_TO:
+               return __get_elide(symbol_conf.dso_to_list, "dso_to", output);
+       default:
+               break;
+       }
+
+       return false;
 }
 
 void sort__setup_elide(FILE *output)
@@ -1391,39 +1430,12 @@ void sort__setup_elide(FILE *output)
        struct perf_hpp_fmt *fmt;
        struct hpp_sort_entry *hse;
 
-       sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-                               "dso", output);
-       sort_entry__setup_elide(&sort_comm, symbol_conf.comm_list,
-                               "comm", output);
-       sort_entry__setup_elide(&sort_sym, symbol_conf.sym_list,
-                               "symbol", output);
-
-       if (sort__mode == SORT_MODE__BRANCH) {
-               sort_entry__setup_elide(&sort_dso_from,
-                                       symbol_conf.dso_from_list,
-                                       "dso_from", output);
-               sort_entry__setup_elide(&sort_dso_to,
-                                       symbol_conf.dso_to_list,
-                                       "dso_to", output);
-               sort_entry__setup_elide(&sort_sym_from,
-                                       symbol_conf.sym_from_list,
-                                       "sym_from", output);
-               sort_entry__setup_elide(&sort_sym_to,
-                                       symbol_conf.sym_to_list,
-                                       "sym_to", output);
-       } else if (sort__mode == SORT_MODE__MEMORY) {
-               sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-                                       "symbol_daddr", output);
-               sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-                                       "dso_daddr", output);
-               sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-                                       "mem", output);
-               sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-                                       "local_weight", output);
-               sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-                                       "tlb", output);
-               sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-                                       "snoop", output);
+       perf_hpp__for_each_format(fmt) {
+               if (!perf_hpp__is_sort_entry(fmt))
+                       continue;
+
+               hse = container_of(fmt, struct hpp_sort_entry, hpp);
+               fmt->elide = get_elide(hse->se->se_width_idx, output);
        }
 
        /*
@@ -1434,8 +1446,7 @@ void sort__setup_elide(FILE *output)
                if (!perf_hpp__is_sort_entry(fmt))
                        continue;
 
-               hse = container_of(fmt, struct hpp_sort_entry, hpp);
-               if (!hse->se->elide)
+               if (!fmt->elide)
                        return;
        }
 
@@ -1443,8 +1454,7 @@ void sort__setup_elide(FILE *output)
                if (!perf_hpp__is_sort_entry(fmt))
                        continue;
 
-               hse = container_of(fmt, struct hpp_sort_entry, hpp);
-               hse->se->elide = false;
+               fmt->elide = false;
        }
 }
 
@@ -1581,6 +1591,9 @@ void reset_output_field(void)
        sort__has_sym = 0;
        sort__has_dso = 0;
 
+       field_order = NULL;
+       sort_order = NULL;
+
        reset_dimensions();
        perf_hpp__reset_output_field();
 }