mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Will Drewry <wad@chromium.org>
To: linux-kernel@vger.kernel.org
Cc: kees.cook@canonical.com, torvalds@linux-foundation.org,
	tglx@linutronix.de, mingo@elte.hu, rostedt@goodmis.org,
	jmorris@namei.org, Will Drewry <wad@chromium.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Paul Mackerras <paulus@samba.org>,
	Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
	Frederic Weisbecker <fweisbec@gmail.com>
Subject: [PATCH v3 01/13] tracing: split out filter initialization and clean up.
Date: Tue, 31 May 2011 22:10:33 -0500	[thread overview]
Message-ID: <1306897845-9393-1-git-send-email-wad@chromium.org> (raw)
In-Reply-To: <BANLkTimNcag-ZmVTXjUoTyiuJm6jtW0DgA@mail.gmail.com>

Moves the perf-specific profile event allocation and freeing code into
kernel/perf_event.c where it is called from and two symbols are exported
via ftrace_event.h for instantiating struct event_filters without
requiring a change to the core tracing code.

The change allows globally registered ftrace events to be used in
event_filter structs.  perf is the current consumer, but a possible
future consumer is a system call filtering using the secure computing
hooks (and the existing syscalls subsystem events).

Signed-off-by: Will Drewry <wad@chromium.org>
---
 include/linux/ftrace_event.h       |    9 +++--
 kernel/perf_event.c                |    7 +++-
 kernel/trace/trace_events_filter.c |   60 ++++++++++++++++++++++--------------
 3 files changed, 48 insertions(+), 28 deletions(-)

diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h
index 22b32af..fea9d98 100644
--- a/include/linux/ftrace_event.h
+++ b/include/linux/ftrace_event.h
@@ -216,6 +216,12 @@ extern int filter_current_check_discard(struct ring_buffer *buffer,
 					void *rec,
 					struct ring_buffer_event *event);
 
+extern void ftrace_free_filter(struct event_filter *filter);
+extern int ftrace_parse_filter(struct event_filter **filter,
+			       int event_id,
+			       const char *filter_str);
+extern const char *ftrace_get_filter_string(const struct event_filter *filter);
+
 enum {
 	FILTER_OTHER = 0,
 	FILTER_STATIC_STRING,
@@ -266,9 +272,6 @@ extern int  perf_trace_init(struct perf_event *event);
 extern void perf_trace_destroy(struct perf_event *event);
 extern int  perf_trace_add(struct perf_event *event, int flags);
 extern void perf_trace_del(struct perf_event *event, int flags);
-extern int  ftrace_profile_set_filter(struct perf_event *event, int event_id,
-				     char *filter_str);
-extern void ftrace_profile_free_filter(struct perf_event *event);
 extern void *perf_trace_buf_prepare(int size, unsigned short type,
 				    struct pt_regs *regs, int *rctxp);
 
diff --git a/kernel/perf_event.c b/kernel/perf_event.c
index 8e81a98..1da45e7 100644
--- a/kernel/perf_event.c
+++ b/kernel/perf_event.c
@@ -5588,7 +5588,8 @@ static int perf_event_set_filter(struct perf_event *event, void __user *arg)
 	if (IS_ERR(filter_str))
 		return PTR_ERR(filter_str);
 
-	ret = ftrace_profile_set_filter(event, event->attr.config, filter_str);
+	ret = ftrace_parse_filter(&event->filter, event->attr.config,
+				  filter_str);
 
 	kfree(filter_str);
 	return ret;
@@ -5596,7 +5597,9 @@ static int perf_event_set_filter(struct perf_event *event, void __user *arg)
 
 static void perf_event_free_filter(struct perf_event *event)
 {
-	ftrace_profile_free_filter(event);
+	struct event_filter *filter = event->filter;
+	event->filter = NULL;
+	ftrace_free_filter(filter);
 }
 
 #else
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 8008ddc..787b174 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -522,7 +522,7 @@ static void remove_filter_string(struct event_filter *filter)
 }
 
 static int replace_filter_string(struct event_filter *filter,
-				 char *filter_string)
+				 const char *filter_string)
 {
 	kfree(filter->filter_string);
 	filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
@@ -1936,21 +1936,27 @@ out_unlock:
 	return err;
 }
 
-#ifdef CONFIG_PERF_EVENTS
-
-void ftrace_profile_free_filter(struct perf_event *event)
+/* ftrace_free_filter - frees a parsed filter its internal structures.
+ *
+ * @filter: pointer to the event_filter to free.
+ */
+void ftrace_free_filter(struct event_filter *filter)
 {
-	struct event_filter *filter = event->filter;
-
-	event->filter = NULL;
-	__free_filter(filter);
+	if (filter)
+		__free_filter(filter);
 }
+EXPORT_SYMBOL_GPL(ftrace_free_filter);
 
-int ftrace_profile_set_filter(struct perf_event *event, int event_id,
-			      char *filter_str)
+/* ftrace_parse_filter - allocates and populates a new event_filter
+ *
+ * @event_id: may be something like syscalls::sys_event_tkill's id.
+ * @filter_str: pointer to the filter string. Ownership IS taken.
+ */
+int ftrace_parse_filter(struct event_filter **filter,
+			int event_id,
+			const char *filter_str)
 {
 	int err;
-	struct event_filter *filter;
 	struct filter_parse_state *ps;
 	struct ftrace_event_call *call = NULL;
 
@@ -1966,12 +1972,12 @@ int ftrace_profile_set_filter(struct perf_event *event, int event_id,
 		goto out_unlock;
 
 	err = -EEXIST;
-	if (event->filter)
+	if (*filter)
 		goto out_unlock;
 
-	filter = __alloc_filter();
-	if (!filter) {
-		err = PTR_ERR(filter);
+	*filter = __alloc_filter();
+	if (IS_ERR_OR_NULL(*filter)) {
+		err = PTR_ERR(*filter);
 		goto out_unlock;
 	}
 
@@ -1980,14 +1986,14 @@ int ftrace_profile_set_filter(struct perf_event *event, int event_id,
 	if (!ps)
 		goto free_filter;
 
-	parse_init(ps, filter_ops, filter_str);
+	replace_filter_string(*filter, filter_str);
+
+	parse_init(ps, filter_ops, (*filter)->filter_string);
 	err = filter_parse(ps);
 	if (err)
 		goto free_ps;
 
-	err = replace_preds(call, filter, ps, filter_str, false);
-	if (!err)
-		event->filter = filter;
+	err = replace_preds(call, *filter, ps, (*filter)->filter_string, false);
 
 free_ps:
 	filter_opstack_clear(ps);
@@ -1995,14 +2001,22 @@ free_ps:
 	kfree(ps);
 
 free_filter:
-	if (err)
-		__free_filter(filter);
+	if (err) {
+		__free_filter(*filter);
+		*filter = NULL;
+	}
 
 out_unlock:
 	mutex_unlock(&event_mutex);
 
 	return err;
 }
+EXPORT_SYMBOL_GPL(ftrace_parse_filter);
 
-#endif /* CONFIG_PERF_EVENTS */
-
+const char *ftrace_get_filter_string(const struct event_filter *filter)
+{
+	if (!filter)
+		return NULL;
+	return filter->filter_string;
+}
+EXPORT_SYMBOL_GPL(ftrace_get_filter_string);
-- 
1.7.0.4


  reply	other threads:[~2011-06-01  3:10 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1305563026.5456.19.camel@gandalf.stny.rr.com>
     [not found] ` <20110516165249.GB10929@elte.hu>
     [not found]   ` <1305565422.5456.21.camel@gandalf.stny.rr.com>
     [not found]     ` <20110517124212.GB21441@elte.hu>
     [not found]       ` <1305637528.5456.723.camel@gandalf.stny.rr.com>
     [not found]         ` <20110517131902.GF21441@elte.hu>
     [not found]           ` <BANLkTikBK3-KZ10eErQ6Eex_L6Qe2aZang@mail.gmail.com>
     [not found]             ` <1305807728.11267.25.camel@gandalf.stny.rr.com>
     [not found]               ` <BANLkTiki8aQJbFkKOFC+s6xAEiuVyMM5MQ@mail.gmail.com>
     [not found]                 ` <BANLkTim9UyYAGhg06vCFLxkYPX18cPymEQ@mail.gmail.com>
     [not found]                   ` <20110524200815.GD27634@elte.hu>
2011-05-24 20:25                     ` [PATCH 3/5] v2 seccomp_filters: Enable ftrace-based system call filtering Kees Cook
2011-05-25 19:09                       ` Ingo Molnar
2011-05-25 16:40                     ` Will Drewry
     [not found]                   ` <1306254027.18455.47.camel@twins>
     [not found]                     ` <20110524195435.GC27634@elte.hu>
     [not found]                       ` <alpine.LFD.2.02.1105242239230.3078@ionos>
     [not found]                         ` <20110525150153.GE29179@elte.hu>
     [not found]                           ` <alpine.LFD.2.02.1105251836030.3078@ionos>
2011-05-25 18:01                             ` Kees Cook
2011-05-25 18:42                               ` Linus Torvalds
2011-05-25 19:06                                 ` Ingo Molnar
2011-05-25 19:54                                   ` Will Drewry
2011-05-25 19:11                                 ` Kees Cook
2011-05-25 20:01                                   ` Linus Torvalds
2011-05-25 20:19                                     ` Ingo Molnar
2011-06-09  9:00                                       ` Sven Anders
2011-05-26 14:37                                     ` Colin Walters
2011-05-26 15:03                                       ` Linus Torvalds
2011-05-26 15:28                                         ` Colin Walters
2011-05-26 16:33                                         ` Will Drewry
2011-05-26 16:46                                           ` Linus Torvalds
2011-05-26 17:02                                             ` Will Drewry
2011-05-26 17:04                                               ` Will Drewry
2011-05-26 17:17                                               ` Linus Torvalds
2011-05-26 17:38                                                 ` Will Drewry
2011-05-26 18:33                                                   ` Linus Torvalds
2011-05-26 18:47                                                     ` Ingo Molnar
2011-05-26 19:05                                                       ` david
2011-05-26 19:09                                                         ` Eric Paris
2011-05-26 19:46                                                         ` Ingo Molnar
2011-05-26 19:49                                                           ` david
2011-05-26 18:49                                                     ` Will Drewry
2011-06-01  3:10                                                       ` Will Drewry [this message]
2011-06-01  3:10                                                       ` [PATCH v3 02/13] tracing: split out syscall_trace_enter construction Will Drewry
2011-06-01  7:00                                                         ` Ingo Molnar
2011-06-01 17:15                                                           ` Will Drewry
2011-06-02 14:29                                                             ` Ingo Molnar
2011-06-02 15:18                                                               ` Will Drewry
2011-06-01  3:10                                                       ` [PATCH v3 03/13] seccomp_filters: new mode with configurable syscall filters Will Drewry
2011-06-02 17:36                                                         ` Paul E. McKenney
2011-06-02 18:14                                                           ` Will Drewry
2011-06-02 19:42                                                             ` Paul E. McKenney
2011-06-02 20:28                                                               ` Will Drewry
2011-06-02 20:46                                                                 ` Steven Rostedt
2011-06-02 21:12                                                                   ` Paul E. McKenney
2011-06-01  3:10                                                       ` [PATCH v3 04/13] seccomp_filter: add process state reporting Will Drewry
2011-06-01  3:10                                                       ` [PATCH v3 05/13] seccomp_filter: Document what seccomp_filter is and how it works Will Drewry
2011-06-01 21:23                                                         ` Kees Cook
2011-06-01 23:03                                                           ` Will Drewry
2011-06-01  3:10                                                       ` [PATCH v3 06/13] x86: add HAVE_SECCOMP_FILTER and seccomp_execve Will Drewry
2011-06-01  3:10                                                       ` [PATCH v3 07/13] arm: select HAVE_SECCOMP_FILTER Will Drewry
2011-06-01  3:10                                                       ` [PATCH v3 08/13] microblaze: select HAVE_SECCOMP_FILTER and provide seccomp_execve Will Drewry
2011-06-01  5:37                                                         ` Michal Simek
2011-06-01  3:10                                                       ` [PATCH v3 09/13] mips: " Will Drewry
2011-06-01  3:10                                                       ` [PATCH v3 10/13] s390: " Will Drewry
2011-06-01  3:10                                                       ` [PATCH v3 11/13] powerpc: " Will Drewry
2011-06-01  3:10                                                       ` [PATCH v3 12/13] sparc: " Will Drewry
2011-06-01  3:35                                                         ` David Miller
2011-06-01  3:10                                                       ` [PATCH v3 13/13] sh: select HAVE_SECCOMP_FILTER Will Drewry
2011-06-02  5:27                                                         ` Paul Mundt
2011-05-26 17:38                                               ` [PATCH 3/5] v2 seccomp_filters: Enable ftrace-based system call filtering Valdis.Kletnieks
2011-05-26 18:08                                                 ` Will Drewry
2011-05-26 18:22                                                   ` Valdis.Kletnieks
2011-05-26 17:07                                             ` Steven Rostedt
2011-05-26 18:43                                               ` Casey Schaufler
2011-05-26 18:54                                                 ` Steven Rostedt
2011-05-26 18:34                                             ` david
2011-05-26 18:54                                             ` Ingo Molnar
2011-05-26  1:19                                 ` James Morris
2011-05-26  6:08                                   ` Avi Kivity
2011-05-26  8:24                                   ` Ingo Molnar
2011-05-26  8:35                                     ` Pekka Enberg
2011-05-26  8:49                                     ` Avi Kivity
2011-05-26  8:57                                       ` Pekka Enberg
     [not found]                                         ` <20110526085939.GG29458@redhat.com>
2011-05-26 10:38                                           ` Ingo Molnar
2011-05-26 10:46                                             ` Avi Kivity
2011-05-26 10:46                                             ` Gleb Natapov
2011-05-26 11:11                                               ` Ingo Molnar
2011-05-26  9:30                                       ` Ingo Molnar
2011-05-26  9:48                                         ` Ingo Molnar
2011-05-26 11:02                                           ` Avi Kivity
2011-05-26 11:16                                             ` Ingo Molnar
2011-05-26 10:56                                         ` Avi Kivity
2011-05-26 11:38                                           ` Ingo Molnar
2011-05-26 18:06                                             ` Avi Kivity
2011-05-26 18:15                                               ` Ingo Molnar
2011-05-26 18:20                                                 ` Avi Kivity
2011-05-26 18:36                                                   ` Ingo Molnar
2011-05-26 18:43                                                     ` Valdis.Kletnieks
2011-05-26 18:50                                                       ` Ingo Molnar
2011-05-26 18:22                                                 ` Peter Zijlstra
2011-05-26 18:38                                                   ` Ingo Molnar
2011-05-27  0:12                                                     ` James Morris
2011-05-29 16:51                                 ` Aneesh Kumar K.V
2011-05-29 17:02                                   ` Linus Torvalds
2011-05-29 18:23                                     ` Al Viro

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=1306897845-9393-1-git-send-email-wad@chromium.org \
    --to=wad@chromium.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@ghostprotocols.net \
    --cc=fweisbec@gmail.com \
    --cc=jmorris@namei.org \
    --cc=kees.cook@canonical.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=paulus@samba.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®