From: Oleg Nesterov <oleg@redhat.com>
To: Ingo Molnar <mingo@elte.hu>,
Srikar Dronamraju <srikar@linux.vnet.ibm.com>,
Steven Rostedt <rostedt@goodmis.org>
Cc: Anton Arapov <anton@redhat.com>, Frank Eigler <fche@redhat.com>,
Josh Stone <jistone@redhat.com>,
Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
"Suzuki K. Poulose" <suzuki@in.ibm.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH 4/4] uprobes: Teach uprobe_trace_consumer to support the pre-filtering
Date: Sun, 27 Jan 2013 20:48:43 +0100 [thread overview]
Message-ID: <20130127194843.GA25412@redhat.com> (raw)
In-Reply-To: <20130127194814.GA25377@redhat.com>
Implement trace_uprobe_filter_func() and change probe_event_enable()
to setup uprobe_consumer->filter() if necessary.
Also change uprobe_dispatcher() to skip the tasks we do not want to
probe and return UPROBE_HANDLER_REMOVE to indicate that this "int3"
should be removed unless there is another consumer which wants to
trace this task.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
kernel/trace/trace_uprobe.c | 48 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
index f7a2dcb..78e918f 100644
--- a/kernel/trace/trace_uprobe.c
+++ b/kernel/trace/trace_uprobe.c
@@ -112,6 +112,50 @@ static void probes_seq_show_filter(struct trace_uprobe_filter *filter,
seq_printf(m, " pid=%d", pid_vnr(filter->tgid));
}
+static bool trace_uprobe_filter_current(struct trace_uprobe_filter *filter)
+{
+ return !filter->tgid || filter->tgid == task_tgid(current);
+}
+
+static bool trace_uprobe_filter_func(struct uprobe_consumer *uc,
+ enum uprobe_filter_ctx ctx,
+ struct mm_struct *mm)
+{
+ struct uprobe_trace_consumer *utc;
+ struct trace_uprobe_filter *filter;
+ struct task_struct *p, *t;
+ bool ret;
+
+ utc = container_of(uc, struct uprobe_trace_consumer, cons);
+ filter = &utc->tu->filter;
+
+ if (ctx == UPROBE_FILTER_MMAP)
+ return trace_uprobe_filter_current(filter);
+
+ ret = false;
+ rcu_read_lock();
+ p = pid_task(filter->tgid, PIDTYPE_PID);
+ if (p) {
+ t = p;
+ do {
+ if (t->mm) {
+ ret = (t->mm == mm);
+ break;
+ }
+ } while_each_thread(p, t);
+ }
+ rcu_read_unlock();
+
+ return ret;
+}
+
+static inline void set_trace_uprobe_filter_func(struct uprobe_consumer *uc,
+ struct trace_uprobe_filter *filter)
+{
+ if (filter->tgid)
+ uc->filter = trace_uprobe_filter_func;
+}
+
/*
* Allocate new trace_uprobe and initialize it (including uprobes).
*/
@@ -613,6 +657,7 @@ static int probe_event_enable(struct trace_uprobe *tu, int flag)
if (!utc)
return -EINTR;
+ set_trace_uprobe_filter_func(&utc->cons, &tu->filter);
utc->cons.handler = uprobe_dispatcher;
utc->tu = tu;
tu->consumer = utc;
@@ -784,6 +829,9 @@ static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs)
if (!tu || tu->consumer != utc)
return 0;
+ if (!trace_uprobe_filter_current(&tu->filter))
+ return UPROBE_HANDLER_REMOVE;
+
if (tu->flags & TP_FLAG_TRACE)
uprobe_trace_func(tu, regs);
--
1.5.5.1
next prev parent reply other threads:[~2013-01-27 19:49 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-27 19:48 [PATCH 0/4] uprobes: Teach debug/tracing/uprobe_events to do the filtering Oleg Nesterov
2013-01-27 19:48 ` [PATCH 1/4] uprobes: Fix dentry/mount leak in create_trace_uprobe() Oleg Nesterov
2013-01-28 12:08 ` Srikar Dronamraju
2013-01-27 19:48 ` [PATCH 2/4] uprobes: Fully initialize uprobe_trace_consumer before uprobe_register() Oleg Nesterov
2013-01-28 12:09 ` Srikar Dronamraju
2013-01-27 19:48 ` [PATCH 3/4] uprobes: Teach tracing/uprobe_events to accept pid=TGID argument Oleg Nesterov
2013-01-27 19:48 ` Oleg Nesterov [this message]
2013-01-31 17:04 ` [PATCH 0/4] uprobes: Teach debug/tracing/uprobe_events to do the filtering Oleg Nesterov
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=20130127194843.GA25412@redhat.com \
--to=oleg@redhat.com \
--cc=anton@redhat.com \
--cc=fche@redhat.com \
--cc=jistone@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=mingo@elte.hu \
--cc=rostedt@goodmis.org \
--cc=srikar@linux.vnet.ibm.com \
--cc=suzuki@in.ibm.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.