All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org, Wang Nan <wangnan0@huawei.com>,
	Alexei Starovoitov <ast@fb.com>, He Kuang <hekuang@huawei.com>,
	Jiri Olsa <jolsa@kernel.org>, Joe Stringer <joe@ovn.org>,
	Zefan Li <lizefan@huawei.com>,
	pi3orama@163.com, Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 03/20] perf tools: Pass context to perf hook functions
Date: Mon,  5 Dec 2016 18:37:51 -0300	[thread overview]
Message-ID: <20161205213808.6231-4-acme@kernel.org> (raw)
In-Reply-To: <20161205213808.6231-1-acme@kernel.org>

From: Wang Nan <wangnan0@huawei.com>

Pass a pointer to perf hook functions so they receive context
information during setup.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Alexei Starovoitov <ast@fb.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Joe Stringer <joe@ovn.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/20161126070354.141764-6-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/tests/perf-hooks.c | 14 +++++++++-----
 tools/perf/util/perf-hooks.c  | 10 +++++++---
 tools/perf/util/perf-hooks.h  |  6 ++++--
 3 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/tools/perf/tests/perf-hooks.c b/tools/perf/tests/perf-hooks.c
index 9338cb2c25ab..665ecc19671c 100644
--- a/tools/perf/tests/perf-hooks.c
+++ b/tools/perf/tests/perf-hooks.c
@@ -15,13 +15,13 @@ static void sigsegv_handler(int sig __maybe_unused)
 	exit(-1);
 }
 
-static int hook_flags;
 
-static void the_hook(void)
+static void the_hook(void *_hook_flags)
 {
+	int *hook_flags = _hook_flags;
 	int *p = NULL;
 
-	hook_flags = 1234;
+	*hook_flags = 1234;
 
 	/* Generate a segfault, test perf_hooks__recover */
 	*p = 0;
@@ -29,13 +29,17 @@ static void the_hook(void)
 
 int test__perf_hooks(int subtest __maybe_unused)
 {
+	int hook_flags = 0;
+
 	signal(SIGSEGV, sigsegv_handler);
-	perf_hooks__set_hook("test", the_hook);
+	perf_hooks__set_hook("test", the_hook, &hook_flags);
 	perf_hooks__invoke_test();
 
 	/* hook is triggered? */
-	if (hook_flags != 1234)
+	if (hook_flags != 1234) {
+		pr_debug("Setting failed: %d (%p)\n", hook_flags, &hook_flags);
 		return TEST_FAIL;
+	}
 
 	/* the buggy hook is removed? */
 	if (perf_hooks__get_hook("test"))
diff --git a/tools/perf/util/perf-hooks.c b/tools/perf/util/perf-hooks.c
index 4ce88e37dd63..cb368306b12b 100644
--- a/tools/perf/util/perf-hooks.c
+++ b/tools/perf/util/perf-hooks.c
@@ -27,7 +27,7 @@ void perf_hooks__invoke(const struct perf_hook_desc *desc)
 		*(current_perf_hook->p_hook_func) = NULL;
 	} else {
 		current_perf_hook = desc;
-		(**desc->p_hook_func)();
+		(**desc->p_hook_func)(desc->hook_ctx);
 	}
 	current_perf_hook = NULL;
 }
@@ -41,7 +41,9 @@ void perf_hooks__recover(void)
 #define PERF_HOOK(name)					\
 perf_hook_func_t __perf_hook_func_##name = NULL;	\
 struct perf_hook_desc __perf_hook_desc_##name =		\
-	{.hook_name = #name, .p_hook_func = &__perf_hook_func_##name};
+	{.hook_name = #name,				\
+	 .p_hook_func = &__perf_hook_func_##name,	\
+	 .hook_ctx = NULL};
 #include "perf-hooks-list.h"
 #undef PERF_HOOK
 
@@ -54,7 +56,8 @@ static struct perf_hook_desc *perf_hooks[] = {
 #undef PERF_HOOK
 
 int perf_hooks__set_hook(const char *hook_name,
-			 perf_hook_func_t hook_func)
+			 perf_hook_func_t hook_func,
+			 void *hook_ctx)
 {
 	unsigned int i;
 
@@ -65,6 +68,7 @@ int perf_hooks__set_hook(const char *hook_name,
 		if (*(perf_hooks[i]->p_hook_func))
 			pr_warning("Overwrite existing hook: %s\n", hook_name);
 		*(perf_hooks[i]->p_hook_func) = hook_func;
+		perf_hooks[i]->hook_ctx = hook_ctx;
 		return 0;
 	}
 	return -ENOENT;
diff --git a/tools/perf/util/perf-hooks.h b/tools/perf/util/perf-hooks.h
index 1d482b26b4b9..838d5797bc1e 100644
--- a/tools/perf/util/perf-hooks.h
+++ b/tools/perf/util/perf-hooks.h
@@ -5,10 +5,11 @@
 extern "C" {
 #endif
 
-typedef void (*perf_hook_func_t)(void);
+typedef void (*perf_hook_func_t)(void *ctx);
 struct perf_hook_desc {
 	const char * const hook_name;
 	perf_hook_func_t * const p_hook_func;
+	void *hook_ctx;
 };
 
 extern void perf_hooks__invoke(const struct perf_hook_desc *);
@@ -26,7 +27,8 @@ static inline void perf_hooks__invoke_##name(void)	\
 
 extern int
 perf_hooks__set_hook(const char *hook_name,
-		     perf_hook_func_t hook_func);
+		     perf_hook_func_t hook_func,
+		     void *hook_ctx);
 
 extern perf_hook_func_t
 perf_hooks__get_hook(const char *hook_name);
-- 
2.9.3

  parent reply	other threads:[~2016-12-05 21:41 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-05 21:37 [GIT PULL 00/20] perf/core improvements and fixes Arnaldo Carvalho de Melo
2016-12-05 21:37 ` [PATCH 01/20] tools build: Make fixdep parsing wait for last target Arnaldo Carvalho de Melo
2016-12-05 21:37 ` [PATCH 02/20] tools build: Fix objtool build with clang Arnaldo Carvalho de Melo
2016-12-05 21:37 ` Arnaldo Carvalho de Melo [this message]
2016-12-05 21:37 ` [PATCH 04/20] perf llvm: Extract helpers in llvm-utils.c Arnaldo Carvalho de Melo
2016-12-05 21:37 ` [PATCH 05/20] tools build: Add feature detection for LLVM Arnaldo Carvalho de Melo
2016-12-05 21:37 ` [PATCH 06/20] tools build: Add feature detection for clang Arnaldo Carvalho de Melo
2016-12-05 21:37 ` [PATCH 07/20] perf build: Add clang and llvm compile and linking support Arnaldo Carvalho de Melo
2016-12-05 21:37 ` [PATCH 08/20] perf clang: Add builtin clang support ant test case Arnaldo Carvalho de Melo
2016-12-05 21:37 ` [PATCH 09/20] perf clang: Use real file system for #include Arnaldo Carvalho de Melo
2016-12-05 21:37 ` [PATCH 10/20] perf clang: Allow passing CFLAGS to builtin clang Arnaldo Carvalho de Melo
2016-12-05 21:37 ` [PATCH 11/20] perf clang: Update test case to use real BPF script Arnaldo Carvalho de Melo
2016-12-05 21:38 ` [PATCH 12/20] perf clang: Support compile IR to BPF object and add testcase Arnaldo Carvalho de Melo
2016-12-05 21:38 ` [PATCH 13/20] perf clang: Compile BPF script using builtin clang support Arnaldo Carvalho de Melo
2016-12-05 21:38 ` [PATCH 14/20] tools build: Make the .cmd file more readable Arnaldo Carvalho de Melo
2016-12-05 21:38 ` [PATCH 15/20] tools build: Move tabs to spaces where suitable Arnaldo Carvalho de Melo
2016-12-05 21:38 ` [PATCH 16/20] perf tools: Move install-gtk target into rules area Arnaldo Carvalho de Melo
2016-12-05 21:38 ` [PATCH 17/20] perf tools: Move python/perf.so " Arnaldo Carvalho de Melo
2016-12-05 21:38 ` [PATCH 18/20] perf tools: Cleanup build directory before each test Arnaldo Carvalho de Melo
2016-12-05 21:38 ` [PATCH 19/20] perf tools: Add non config targets Arnaldo Carvalho de Melo
2016-12-05 21:38 ` [PATCH 20/20] perf annotate: Show raw form for jump instruction with indirect target Arnaldo Carvalho de Melo
2016-12-06  8:17 ` [GIT PULL 00/20] perf/core improvements and fixes Ingo Molnar

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=20161205213808.6231-4-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=ast@fb.com \
    --cc=hekuang@huawei.com \
    --cc=joe@ovn.org \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=mingo@kernel.org \
    --cc=pi3orama@163.com \
    --cc=wangnan0@huawei.com \
    /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.