mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	perf tools: Consolidate management of default sort orders
The perf uses different default sort orders for different use-cases, and this was scattered throughout the code. Add get_default_sort_ order() function to handle this and change initial value of sort_order to NULL to distinguish it from user-given one. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1400480762-22852-10-git-send-email-namhyung@kernel.org Signed-off-by: Jiri Olsa <jolsa@kernel.org>
This commit is contained in:
		
							parent
							
								
									a2ce067e55
								
							
						
					
					
						commit
						512ae1bd6a
					
				
					 5 changed files with 31 additions and 24 deletions
				
			
		| 
						 | 
					@ -60,7 +60,6 @@ static int data__files_cnt;
 | 
				
			||||||
#define data__for_each_file(i, d) data__for_each_file_start(i, d, 0)
 | 
					#define data__for_each_file(i, d) data__for_each_file_start(i, d, 0)
 | 
				
			||||||
#define data__for_each_file_new(i, d) data__for_each_file_start(i, d, 1)
 | 
					#define data__for_each_file_new(i, d) data__for_each_file_start(i, d, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char diff__default_sort_order[] = "dso,symbol";
 | 
					 | 
				
			||||||
static bool force;
 | 
					static bool force;
 | 
				
			||||||
static bool show_period;
 | 
					static bool show_period;
 | 
				
			||||||
static bool show_formula;
 | 
					static bool show_formula;
 | 
				
			||||||
| 
						 | 
					@ -1142,7 +1141,6 @@ int cmd_diff(int argc, const char **argv, const char *prefix __maybe_unused)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	perf_config(perf_default_config, NULL);
 | 
						perf_config(perf_default_config, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sort_order = diff__default_sort_order;
 | 
					 | 
				
			||||||
	argc = parse_options(argc, argv, options, diff_usage, 0);
 | 
						argc = parse_options(argc, argv, options, diff_usage, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (symbol__init() < 0)
 | 
						if (symbol__init() < 0)
 | 
				
			||||||
| 
						 | 
					@ -1153,6 +1151,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix __maybe_unused)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ui_init();
 | 
						ui_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sort__mode = SORT_MODE__DIFF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (setup_sorting() < 0)
 | 
						if (setup_sorting() < 0)
 | 
				
			||||||
		usage_with_options(diff_usage, options);
 | 
							usage_with_options(diff_usage, options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -805,30 +805,12 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
 | 
				
			||||||
	if (branch_mode == -1 && has_br_stack)
 | 
						if (branch_mode == -1 && has_br_stack)
 | 
				
			||||||
		sort__mode = SORT_MODE__BRANCH;
 | 
							sort__mode = SORT_MODE__BRANCH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* sort__mode could be NORMAL if --no-branch-stack */
 | 
					 | 
				
			||||||
	if (sort__mode == SORT_MODE__BRANCH) {
 | 
					 | 
				
			||||||
		/*
 | 
					 | 
				
			||||||
		 * if no sort_order is provided, then specify
 | 
					 | 
				
			||||||
		 * branch-mode specific order
 | 
					 | 
				
			||||||
		 */
 | 
					 | 
				
			||||||
		if (sort_order == default_sort_order)
 | 
					 | 
				
			||||||
			sort_order = "comm,dso_from,symbol_from,"
 | 
					 | 
				
			||||||
				     "dso_to,symbol_to";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (report.mem_mode) {
 | 
						if (report.mem_mode) {
 | 
				
			||||||
		if (sort__mode == SORT_MODE__BRANCH) {
 | 
							if (sort__mode == SORT_MODE__BRANCH) {
 | 
				
			||||||
			pr_err("branch and mem mode incompatible\n");
 | 
								pr_err("branch and mem mode incompatible\n");
 | 
				
			||||||
			goto error;
 | 
								goto error;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		sort__mode = SORT_MODE__MEMORY;
 | 
							sort__mode = SORT_MODE__MEMORY;
 | 
				
			||||||
 | 
					 | 
				
			||||||
		/*
 | 
					 | 
				
			||||||
		 * if no sort_order is provided, then specify
 | 
					 | 
				
			||||||
		 * branch-mode specific order
 | 
					 | 
				
			||||||
		 */
 | 
					 | 
				
			||||||
		if (sort_order == default_sort_order)
 | 
					 | 
				
			||||||
			sort_order = "local_weight,mem,sym,dso,symbol_daddr,dso_daddr,snoop,tlb,locked";
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (setup_sorting() < 0) {
 | 
						if (setup_sorting() < 0) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1137,8 +1137,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
 | 
				
			||||||
	if (argc)
 | 
						if (argc)
 | 
				
			||||||
		usage_with_options(top_usage, options);
 | 
							usage_with_options(top_usage, options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (sort_order == default_sort_order)
 | 
						sort__mode = SORT_MODE__TOP;
 | 
				
			||||||
		sort_order = "dso,symbol";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (setup_sorting() < 0) {
 | 
						if (setup_sorting() < 0) {
 | 
				
			||||||
		parse_options_usage(top_usage, options, "s", 1);
 | 
							parse_options_usage(top_usage, options, "s", 1);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,11 @@ regex_t		parent_regex;
 | 
				
			||||||
const char	default_parent_pattern[] = "^sys_|^do_page_fault";
 | 
					const char	default_parent_pattern[] = "^sys_|^do_page_fault";
 | 
				
			||||||
const char	*parent_pattern = default_parent_pattern;
 | 
					const char	*parent_pattern = default_parent_pattern;
 | 
				
			||||||
const char	default_sort_order[] = "comm,dso,symbol";
 | 
					const char	default_sort_order[] = "comm,dso,symbol";
 | 
				
			||||||
const char	*sort_order = default_sort_order;
 | 
					const char	default_branch_sort_order[] = "comm,dso_from,symbol_from,dso_to,symbol_to";
 | 
				
			||||||
 | 
					const char	default_mem_sort_order[] = "local_weight,mem,sym,dso,symbol_daddr,dso_daddr,snoop,tlb,locked";
 | 
				
			||||||
 | 
					const char	default_top_sort_order[] = "dso,symbol";
 | 
				
			||||||
 | 
					const char	default_diff_sort_order[] = "dso,symbol";
 | 
				
			||||||
 | 
					const char	*sort_order;
 | 
				
			||||||
regex_t		ignore_callees_regex;
 | 
					regex_t		ignore_callees_regex;
 | 
				
			||||||
int		have_ignore_callees = 0;
 | 
					int		have_ignore_callees = 0;
 | 
				
			||||||
int		sort__need_collapse = 0;
 | 
					int		sort__need_collapse = 0;
 | 
				
			||||||
| 
						 | 
					@ -1218,11 +1222,31 @@ int sort_dimension__add(const char *tok)
 | 
				
			||||||
	return -ESRCH;
 | 
						return -ESRCH;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char *get_default_sort_order(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const char *default_sort_orders[] = {
 | 
				
			||||||
 | 
							default_sort_order,
 | 
				
			||||||
 | 
							default_branch_sort_order,
 | 
				
			||||||
 | 
							default_mem_sort_order,
 | 
				
			||||||
 | 
							default_top_sort_order,
 | 
				
			||||||
 | 
							default_diff_sort_order,
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						BUG_ON(sort__mode >= ARRAY_SIZE(default_sort_orders));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return default_sort_orders[sort__mode];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int setup_sorting(void)
 | 
					int setup_sorting(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char *tmp, *tok, *str = strdup(sort_order);
 | 
						char *tmp, *tok, *str;
 | 
				
			||||||
 | 
						const char *sort_keys = sort_order;
 | 
				
			||||||
	int ret = 0;
 | 
						int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (sort_keys == NULL)
 | 
				
			||||||
 | 
							sort_keys = get_default_sort_order();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						str = strdup(sort_keys);
 | 
				
			||||||
	if (str == NULL) {
 | 
						if (str == NULL) {
 | 
				
			||||||
		error("Not enough memory to setup sort keys");
 | 
							error("Not enough memory to setup sort keys");
 | 
				
			||||||
		return -ENOMEM;
 | 
							return -ENOMEM;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,6 +133,8 @@ enum sort_mode {
 | 
				
			||||||
	SORT_MODE__NORMAL,
 | 
						SORT_MODE__NORMAL,
 | 
				
			||||||
	SORT_MODE__BRANCH,
 | 
						SORT_MODE__BRANCH,
 | 
				
			||||||
	SORT_MODE__MEMORY,
 | 
						SORT_MODE__MEMORY,
 | 
				
			||||||
 | 
						SORT_MODE__TOP,
 | 
				
			||||||
 | 
						SORT_MODE__DIFF,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum sort_type {
 | 
					enum sort_type {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue