aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2014-03-02 20:59:57 -0500
committerJiri Olsa <jolsa@kernel.org>2014-05-21 05:45:33 -0400
commitbc18b7f2e3ca09b360b26c25a7541ba6f170111b (patch)
tree69fffa9b2913a8650a493dba72bf4af6bb7fb7cd /tools/perf
parent6480c56130ba073df84d57d61062ec4118b10bbe (diff)
perf tools: Add ->cmp(), ->collapse() and ->sort() to perf_hpp_fmt
Those function pointers will be used to sort report output based on the selected fields. This is a preparation of later change. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Ingo Molnar <mingo@kernel.org> Link: http://lkml.kernel.org/r/1400480762-22852-2-git-send-email-namhyung@kernel.org Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/ui/hist.c39
-rw-r--r--tools/perf/util/hist.h3
2 files changed, 38 insertions, 4 deletions
diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index 0912805c08f4..d4a4f2e7eb43 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -192,6 +192,14 @@ static int hpp__entry_##_type(struct perf_hpp_fmt *_fmt __maybe_unused, \
192 hpp_entry_scnprintf, true); \ 192 hpp_entry_scnprintf, true); \
193} 193}
194 194
195#define __HPP_SORT_FN(_type, _field) \
196static int64_t hpp__sort_##_type(struct hist_entry *a, struct hist_entry *b) \
197{ \
198 s64 __a = he_get_##_field(a); \
199 s64 __b = he_get_##_field(b); \
200 return __a - __b; \
201}
202
195#define __HPP_ENTRY_RAW_FN(_type, _field) \ 203#define __HPP_ENTRY_RAW_FN(_type, _field) \
196static u64 he_get_raw_##_field(struct hist_entry *he) \ 204static u64 he_get_raw_##_field(struct hist_entry *he) \
197{ \ 205{ \
@@ -206,16 +214,27 @@ static int hpp__entry_##_type(struct perf_hpp_fmt *_fmt __maybe_unused, \
206 hpp_entry_scnprintf, false); \ 214 hpp_entry_scnprintf, false); \
207} 215}
208 216
217#define __HPP_SORT_RAW_FN(_type, _field) \
218static int64_t hpp__sort_##_type(struct hist_entry *a, struct hist_entry *b) \
219{ \
220 s64 __a = he_get_raw_##_field(a); \
221 s64 __b = he_get_raw_##_field(b); \
222 return __a - __b; \
223}
224
225
209#define HPP_PERCENT_FNS(_type, _str, _field, _min_width, _unit_width) \ 226#define HPP_PERCENT_FNS(_type, _str, _field, _min_width, _unit_width) \
210__HPP_HEADER_FN(_type, _str, _min_width, _unit_width) \ 227__HPP_HEADER_FN(_type, _str, _min_width, _unit_width) \
211__HPP_WIDTH_FN(_type, _min_width, _unit_width) \ 228__HPP_WIDTH_FN(_type, _min_width, _unit_width) \
212__HPP_COLOR_PERCENT_FN(_type, _field) \ 229__HPP_COLOR_PERCENT_FN(_type, _field) \
213__HPP_ENTRY_PERCENT_FN(_type, _field) 230__HPP_ENTRY_PERCENT_FN(_type, _field) \
231__HPP_SORT_FN(_type, _field)
214 232
215#define HPP_RAW_FNS(_type, _str, _field, _min_width, _unit_width) \ 233#define HPP_RAW_FNS(_type, _str, _field, _min_width, _unit_width) \
216__HPP_HEADER_FN(_type, _str, _min_width, _unit_width) \ 234__HPP_HEADER_FN(_type, _str, _min_width, _unit_width) \
217__HPP_WIDTH_FN(_type, _min_width, _unit_width) \ 235__HPP_WIDTH_FN(_type, _min_width, _unit_width) \
218__HPP_ENTRY_RAW_FN(_type, _field) 236__HPP_ENTRY_RAW_FN(_type, _field) \
237__HPP_SORT_RAW_FN(_type, _field)
219 238
220 239
221HPP_PERCENT_FNS(overhead, "Overhead", period, 8, 8) 240HPP_PERCENT_FNS(overhead, "Overhead", period, 8, 8)
@@ -227,19 +246,31 @@ HPP_PERCENT_FNS(overhead_guest_us, "guest usr", period_guest_us, 9, 8)
227HPP_RAW_FNS(samples, "Samples", nr_events, 12, 12) 246HPP_RAW_FNS(samples, "Samples", nr_events, 12, 12)
228HPP_RAW_FNS(period, "Period", period, 12, 12) 247HPP_RAW_FNS(period, "Period", period, 12, 12)
229 248
249static int64_t hpp__nop_cmp(struct hist_entry *a __maybe_unused,
250 struct hist_entry *b __maybe_unused)
251{
252 return 0;
253}
254
230#define HPP__COLOR_PRINT_FNS(_name) \ 255#define HPP__COLOR_PRINT_FNS(_name) \
231 { \ 256 { \
232 .header = hpp__header_ ## _name, \ 257 .header = hpp__header_ ## _name, \
233 .width = hpp__width_ ## _name, \ 258 .width = hpp__width_ ## _name, \
234 .color = hpp__color_ ## _name, \ 259 .color = hpp__color_ ## _name, \
235 .entry = hpp__entry_ ## _name \ 260 .entry = hpp__entry_ ## _name, \
261 .cmp = hpp__nop_cmp, \
262 .collapse = hpp__nop_cmp, \
263 .sort = hpp__sort_ ## _name, \
236 } 264 }
237 265
238#define HPP__PRINT_FNS(_name) \ 266#define HPP__PRINT_FNS(_name) \
239 { \ 267 { \
240 .header = hpp__header_ ## _name, \ 268 .header = hpp__header_ ## _name, \
241 .width = hpp__width_ ## _name, \ 269 .width = hpp__width_ ## _name, \
242 .entry = hpp__entry_ ## _name \ 270 .entry = hpp__entry_ ## _name, \
271 .cmp = hpp__nop_cmp, \
272 .collapse = hpp__nop_cmp, \
273 .sort = hpp__sort_ ## _name, \
243 } 274 }
244 275
245struct perf_hpp_fmt perf_hpp__format[] = { 276struct perf_hpp_fmt perf_hpp__format[] = {
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 38c3e874c164..36dbe00e3cc8 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -160,6 +160,9 @@ struct perf_hpp_fmt {
160 struct hist_entry *he); 160 struct hist_entry *he);
161 int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, 161 int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
162 struct hist_entry *he); 162 struct hist_entry *he);
163 int64_t (*cmp)(struct hist_entry *a, struct hist_entry *b);
164 int64_t (*collapse)(struct hist_entry *a, struct hist_entry *b);
165 int64_t (*sort)(struct hist_entry *a, struct hist_entry *b);
163 166
164 struct list_head list; 167 struct list_head list;
165}; 168};