All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Olsa <jolsa@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	Ingo Molnar <mingo@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	David Ahern <dsahern@gmail.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [PATCH 16/17] perf tests: Fix dwarf unwind for stripped binaries
Date: Tue,  6 Feb 2018 19:18:12 +0100	[thread overview]
Message-ID: <20180206181813.10943-17-jolsa@kernel.org> (raw)
In-Reply-To: <20180206181813.10943-1-jolsa@kernel.org>

When we strip the perf binary, dwarf unwind test stop
to work. The reason is that strip will remove static
function symbols, which we need to check for unwind.

This change will keep this test working in cases where
the global symbols are put into dynamic symbol table,
which is the case on x86. It still won't work on powerpc.

Making those 5 local functions global, and adding
'test_dwarf_unwind__' to their names.

Link: http://lkml.kernel.org/n/tip-y6ovucoyct8nimmzggi6tq9s@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/tests/dwarf-unwind.c | 46 +++++++++++++++++++++++++++--------------
 1 file changed, 30 insertions(+), 16 deletions(-)

diff --git a/tools/perf/tests/dwarf-unwind.c b/tools/perf/tests/dwarf-unwind.c
index 260418969120..2f008067d989 100644
--- a/tools/perf/tests/dwarf-unwind.c
+++ b/tools/perf/tests/dwarf-unwind.c
@@ -37,6 +37,19 @@ static int init_live_machine(struct machine *machine)
 						  mmap_handler, machine, true, 500);
 }
 
+/*
+ * We need to keep these functions global, despite the
+ * fact that they are used only locally in this object,
+ * in order to keep them around even if the binary is
+ * stripped. If they are gone, the unwind check for
+ * symbol fails.
+ */
+int test_dwarf_unwind__thread(struct thread *thread);
+int test_dwarf_unwind__compare(void *p1, void *p2);
+int test_dwarf_unwind__krava_3(struct thread *thread);
+int test_dwarf_unwind__krava_2(struct thread *thread);
+int test_dwarf_unwind__krava_1(struct thread *thread);
+
 #define MAX_STACK 8
 
 static int unwind_entry(struct unwind_entry *entry, void *arg)
@@ -45,12 +58,12 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)
 	char *symbol = entry->sym ? entry->sym->name : NULL;
 	static const char *funcs[MAX_STACK] = {
 		"test__arch_unwind_sample",
-		"unwind_thread",
-		"compare",
+		"test_dwarf_unwind__thread",
+		"test_dwarf_unwind__compare",
 		"bsearch",
-		"krava_3",
-		"krava_2",
-		"krava_1",
+		"test_dwarf_unwind__krava_3",
+		"test_dwarf_unwind__krava_2",
+		"test_dwarf_unwind__krava_1",
 		"test__dwarf_unwind"
 	};
 	/*
@@ -77,7 +90,7 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)
 	return strcmp((const char *) symbol, funcs[idx]);
 }
 
-static noinline int unwind_thread(struct thread *thread)
+noinline int test_dwarf_unwind__thread(struct thread *thread)
 {
 	struct perf_sample sample;
 	unsigned long cnt = 0;
@@ -108,7 +121,7 @@ static noinline int unwind_thread(struct thread *thread)
 
 static int global_unwind_retval = -INT_MAX;
 
-static noinline int compare(void *p1, void *p2)
+noinline int test_dwarf_unwind__compare(void *p1, void *p2)
 {
 	/* Any possible value should be 'thread' */
 	struct thread *thread = *(struct thread **)p1;
@@ -117,17 +130,17 @@ static noinline int compare(void *p1, void *p2)
 		/* Call unwinder twice for both callchain orders. */
 		callchain_param.order = ORDER_CALLER;
 
-		global_unwind_retval = unwind_thread(thread);
+		global_unwind_retval = test_dwarf_unwind__thread(thread);
 		if (!global_unwind_retval) {
 			callchain_param.order = ORDER_CALLEE;
-			global_unwind_retval = unwind_thread(thread);
+			global_unwind_retval = test_dwarf_unwind__thread(thread);
 		}
 	}
 
 	return p1 - p2;
 }
 
-static noinline int krava_3(struct thread *thread)
+noinline int test_dwarf_unwind__krava_3(struct thread *thread)
 {
 	struct thread *array[2] = {thread, thread};
 	void *fp = &bsearch;
@@ -141,18 +154,19 @@ static noinline int krava_3(struct thread *thread)
 			size_t, int (*)(void *, void *));
 
 	_bsearch = fp;
-	_bsearch(array, &thread, 2, sizeof(struct thread **), compare);
+	_bsearch(array, &thread, 2, sizeof(struct thread **),
+		 test_dwarf_unwind__compare);
 	return global_unwind_retval;
 }
 
-static noinline int krava_2(struct thread *thread)
+noinline int test_dwarf_unwind__krava_2(struct thread *thread)
 {
-	return krava_3(thread);
+	return test_dwarf_unwind__krava_3(thread);
 }
 
-static noinline int krava_1(struct thread *thread)
+noinline int test_dwarf_unwind__krava_1(struct thread *thread)
 {
-	return krava_2(thread);
+	return test_dwarf_unwind__krava_2(thread);
 }
 
 int test__dwarf_unwind(struct test *test __maybe_unused, int subtest __maybe_unused)
@@ -189,7 +203,7 @@ int test__dwarf_unwind(struct test *test __maybe_unused, int subtest __maybe_unu
 		goto out;
 	}
 
-	err = krava_1(thread);
+	err = test_dwarf_unwind__krava_1(thread);
 	thread__put(thread);
 
  out:
-- 
2.13.6

  parent reply	other threads:[~2018-02-06 18:25 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-06 18:17 [PATCH 00/17] perf tools: Assorted fixes Jiri Olsa
2018-02-06 18:17 ` [PATCH 01/17] perf report: Ask ordered events for --tasks option Jiri Olsa
2018-02-06 18:48   ` Arnaldo Carvalho de Melo
2018-02-06 18:59     ` Jiri Olsa
2018-02-06 19:20       ` Arnaldo Carvalho de Melo
2018-02-17 11:22   ` [tip:perf/core] perf report: Ask for " tip-bot for Jiri Olsa
2018-02-06 18:17 ` [PATCH 02/17] perf record: Put new line after target override warning Jiri Olsa
2018-02-17 11:19   ` [tip:perf/core] " tip-bot for Jiri Olsa
2018-02-06 18:17 ` [PATCH 03/17] perf script: Add --show-round-event to display PERF_RECORD_FINISHED_ROUND Jiri Olsa
2018-02-17 11:19   ` [tip:perf/core] " tip-bot for Jiri Olsa
2018-02-06 18:18 ` [PATCH 04/17] tools lib api fs: Add filename__read_xll function Jiri Olsa
2018-02-17 11:20   ` [tip:perf/core] " tip-bot for Jiri Olsa
2018-02-06 18:18 ` [PATCH 05/17] tools lib api fs: Add sysfs__read_xll function Jiri Olsa
2018-02-06 19:08   ` Arnaldo Carvalho de Melo
2018-02-17 11:21   ` [tip:perf/core] " tip-bot for Jiri Olsa
2018-02-06 18:18 ` [PATCH 06/17] tools lib symbol: Skip non-address kallsyms line Jiri Olsa
2018-02-06 19:06   ` Arnaldo Carvalho de Melo
2018-02-06 19:07     ` Arnaldo Carvalho de Melo
2018-02-06 18:18 ` [PATCH 07/17] perf tools: Free root_dir in machine__init error path Jiri Olsa
2018-02-06 19:09   ` Arnaldo Carvalho de Melo
2018-02-06 18:18 ` [PATCH 08/17] perf tools: Move kernel mmap name into struct machine Jiri Olsa
2018-02-06 19:10   ` Arnaldo Carvalho de Melo
2018-02-06 18:18 ` [PATCH 09/17] perf tools: Don't search for active kernel start in __machine__create_kernel_maps Jiri Olsa
2018-02-06 18:18 ` [PATCH 10/17] perf tools: Generalize machine__set_kernel_mmap function Jiri Olsa
2018-02-06 18:18 ` [PATCH 11/17] perf tools: Use machine__set_kernel_mmap instead of map_groups__fixup_end Jiri Olsa
2018-02-06 18:18 ` [PATCH 12/17] perf tools: Rename __map_groups__fixup_end to map_groups__fixup_end Jiri Olsa
2018-02-06 18:18 ` [PATCH 13/17] perf tools: Remove machine__load_kallsyms function Jiri Olsa
2018-02-06 18:18 ` [PATCH 14/17] perf tools: Do not create kernel maps in sample__resolve Jiri Olsa
2018-02-06 18:18 ` [PATCH 15/17] perf tools: Check if we read regular file in dso__load Jiri Olsa
2018-02-06 18:18 ` Jiri Olsa [this message]
2018-02-06 19:15   ` [PATCH 16/17] perf tests: Fix dwarf unwind for stripped binaries Arnaldo Carvalho de Melo
2018-02-17 11:21   ` [tip:perf/core] " tip-bot for Jiri Olsa
2018-02-06 18:18 ` [PATCH 17/17] perf tools: Fix comment for sort__* compare functions Jiri Olsa
2018-02-06 19:16   ` Arnaldo Carvalho de Melo
2018-02-17 11:22   ` [tip:perf/core] " tip-bot for Jiri Olsa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180206181813.10943-17-jolsa@kernel.org \
    --to=jolsa@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=dsahern@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.