diff options
Diffstat (limited to 'tools/perf/tests/dwarf-unwind.c')
| -rw-r--r-- | tools/perf/tests/dwarf-unwind.c | 37 | 
1 files changed, 27 insertions, 10 deletions
| diff --git a/tools/perf/tests/dwarf-unwind.c b/tools/perf/tests/dwarf-unwind.c index 07221793a3ac..1c5c0221cea2 100644 --- a/tools/perf/tests/dwarf-unwind.c +++ b/tools/perf/tests/dwarf-unwind.c @@ -51,6 +51,12 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)  		"krava_1",  		"test__dwarf_unwind"  	}; +	/* +	 * The funcs[MAX_STACK] array index, based on the +	 * callchain order setup. +	 */ +	int idx = callchain_param.order == ORDER_CALLER ? +		  MAX_STACK - *cnt - 1 : *cnt;  	if (*cnt >= MAX_STACK) {  		pr_debug("failed: crossed the max stack value %d\n", MAX_STACK); @@ -63,8 +69,10 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)  		return -1;  	} -	pr_debug("got: %s 0x%" PRIx64 "\n", symbol, entry->ip); -	return strcmp((const char *) symbol, funcs[(*cnt)++]); +	(*cnt)++; +	pr_debug("got: %s 0x%" PRIx64 ", expecting %s\n", +		 symbol, entry->ip, funcs[idx]); +	return strcmp((const char *) symbol, funcs[idx]);  }  __attribute__ ((noinline)) @@ -105,8 +113,16 @@ static int compare(void *p1, void *p2)  	/* Any possible value should be 'thread' */  	struct thread *thread = *(struct thread **)p1; -	if (global_unwind_retval == -INT_MAX) +	if (global_unwind_retval == -INT_MAX) { +		/* Call unwinder twice for both callchain orders. */ +		callchain_param.order = ORDER_CALLER; +  		global_unwind_retval = unwind_thread(thread); +		if (!global_unwind_retval) { +			callchain_param.order = ORDER_CALLEE; +			global_unwind_retval = unwind_thread(thread); +		} +	}  	return p1 - p2;  } @@ -142,21 +158,23 @@ static int krava_1(struct thread *thread)  	return krava_2(thread);  } -int test__dwarf_unwind(void) +int test__dwarf_unwind(int subtest __maybe_unused)  { -	struct machines machines;  	struct machine *machine;  	struct thread *thread;  	int err = -1; -	machines__init(&machines); - -	machine = machines__find(&machines, HOST_KERNEL_ID); +	machine = machine__new_host();  	if (!machine) {  		pr_err("Could not get machine\n");  		return -1;  	} +	if (machine__create_kernel_maps(machine)) { +		pr_err("Failed to create kernel maps\n"); +		return -1; +	} +  	callchain_param.record_mode = CALLCHAIN_DWARF;  	if (init_live_machine(machine)) { @@ -178,7 +196,6 @@ int test__dwarf_unwind(void)   out:  	machine__delete_threads(machine); -	machine__exit(machine); -	machines__exit(&machines); +	machine__delete(machine);  	return err;  } | 
