From: Ravi Bangoria <ravi.bangoria@linux.ibm.com> To: oleg@redhat.com, srikar@linux.vnet.ibm.com, rostedt@goodmis.org, mhiramat@kernel.org Cc: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, alexander.shishkin@linux.intel.com, jolsa@redhat.com, namhyung@kernel.org, linux-kernel@vger.kernel.org, corbet@lwn.net, linux-doc@vger.kernel.org, ananth@linux.vnet.ibm.com, alexis.berlemont@gmail.com, naveen.n.rao@linux.vnet.ibm.com, Ravi Bangoria <ravi.bangoria@linux.ibm.com> Subject: [PATCH 4/7] trace_uprobe/sdt: Prevent multiple reference counter for same uprobe Date: Wed, 6 Jun 2018 14:03:41 +0530 [thread overview] Message-ID: <20180606083344.31320-5-ravi.bangoria@linux.ibm.com> (raw) In-Reply-To: <20180606083344.31320-1-ravi.bangoria@linux.ibm.com> Rightnow, there can be multiple trace_uprobes with same inode+offset but internally they all points to same uprobe. To allow user to specify multiple ref_ctr_offset for single inode+offset combo, core uprobe logic has to be changed. It's also unlikely to have more than one reference counter for single uprobe. Restrict it. Ex, # echo "p:sdt_tick/loop2 /home/ravi/tick:0x6e4(0x10036) > uprobe_events # echo "p:sdt_tick/loop2_1 /home/ravi/tick:0x6e4(0x10030) >> uprobe_events bash: echo: write error: Invalid argument # dmesg | tail -1 trace_kprobe: Reference counter offset mismatch. One exception to this is when user is trying to replace the old entry with the new one. We allow this if the new entry does not conflict with any other existing entry. Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com> --- kernel/trace/trace_uprobe.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index d5b6ca9..e8914f7 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c @@ -324,6 +324,34 @@ static int unregister_trace_uprobe(struct trace_uprobe *tu) return 0; } +/* + * Uprobe with multiple reference counter is not allowed. i.e. + * If inode and offset matches, reference counter offset *must* + * match as well. Only one exception to this is when we are + * replacing old trace_uprobe with new one(same group/event). + */ +static struct trace_uprobe *find_old_trace_uprobe(struct trace_uprobe *new) +{ + struct trace_uprobe *tmp, *old = NULL; + struct inode *new_inode = d_real_inode(new->path.dentry); + + old = find_probe_event(trace_event_name(&new->tp.call), + new->tp.call.class->system); + if (!new->ref_ctr_offset) + return old; + + list_for_each_entry(tmp, &uprobe_list, list) { + if (new_inode == d_real_inode(tmp->path.dentry) && + new->offset == tmp->offset && + new->ref_ctr_offset != tmp->ref_ctr_offset && + tmp != old) { + pr_warn("Reference counter offset mismatch."); + return ERR_PTR(-EINVAL); + } + } + return old; +} + /* Register a trace_uprobe and probe_event */ static int register_trace_uprobe(struct trace_uprobe *tu) { @@ -333,8 +361,12 @@ static int register_trace_uprobe(struct trace_uprobe *tu) mutex_lock(&uprobe_lock); /* register as an event */ - old_tu = find_probe_event(trace_event_name(&tu->tp.call), - tu->tp.call.class->system); + old_tu = find_old_trace_uprobe(tu); + if (IS_ERR(old_tu)) { + ret = PTR_ERR(old_tu); + goto end; + } + if (old_tu) { /* delete old event */ ret = unregister_trace_uprobe(old_tu); -- 1.8.3.1
WARNING: multiple messages have this Message-ID (diff)
From: Ravi Bangoria <ravi.bangoria@linux.ibm.com> To: oleg@redhat.com, srikar@linux.vnet.ibm.com, rostedt@goodmis.org, mhiramat@kernel.org Cc: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, alexander.shishkin@linux.intel.com, jolsa@redhat.com, namhyung@kernel.org, linux-kernel@vger.kernel.org, corbet@lwn.net, linux-doc@vger.kernel.org, ananth@linux.vnet.ibm.com, alexis.berlemont@gmail.com, naveen.n.rao@linux.vnet.ibm.com, Ravi Bangoria <ravi.bangoria@linux.ibm.com> Subject: [PATCH 4/7] trace_uprobe/sdt: Prevent multiple reference counter for same uprobe Date: Wed, 6 Jun 2018 14:03:41 +0530 [thread overview] Message-ID: <20180606083344.31320-5-ravi.bangoria@linux.ibm.com> (raw) In-Reply-To: <20180606083344.31320-1-ravi.bangoria@linux.ibm.com> Rightnow, there can be multiple trace_uprobes with same inode+offset but internally they all points to same uprobe. To allow user to specify multiple ref_ctr_offset for single inode+offset combo, core uprobe logic has to be changed. It's also unlikely to have more than one reference counter for single uprobe. Restrict it. Ex, # echo "p:sdt_tick/loop2 /home/ravi/tick:0x6e4(0x10036) > uprobe_events # echo "p:sdt_tick/loop2_1 /home/ravi/tick:0x6e4(0x10030) >> uprobe_events bash: echo: write error: Invalid argument # dmesg | tail -1 trace_kprobe: Reference counter offset mismatch. One exception to this is when user is trying to replace the old entry with the new one. We allow this if the new entry does not conflict with any other existing entry. Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com> --- kernel/trace/trace_uprobe.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index d5b6ca9..e8914f7 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c @@ -324,6 +324,34 @@ static int unregister_trace_uprobe(struct trace_uprobe *tu) return 0; } +/* + * Uprobe with multiple reference counter is not allowed. i.e. + * If inode and offset matches, reference counter offset *must* + * match as well. Only one exception to this is when we are + * replacing old trace_uprobe with new one(same group/event). + */ +static struct trace_uprobe *find_old_trace_uprobe(struct trace_uprobe *new) +{ + struct trace_uprobe *tmp, *old = NULL; + struct inode *new_inode = d_real_inode(new->path.dentry); + + old = find_probe_event(trace_event_name(&new->tp.call), + new->tp.call.class->system); + if (!new->ref_ctr_offset) + return old; + + list_for_each_entry(tmp, &uprobe_list, list) { + if (new_inode == d_real_inode(tmp->path.dentry) && + new->offset == tmp->offset && + new->ref_ctr_offset != tmp->ref_ctr_offset && + tmp != old) { + pr_warn("Reference counter offset mismatch."); + return ERR_PTR(-EINVAL); + } + } + return old; +} + /* Register a trace_uprobe and probe_event */ static int register_trace_uprobe(struct trace_uprobe *tu) { @@ -333,8 +361,12 @@ static int register_trace_uprobe(struct trace_uprobe *tu) mutex_lock(&uprobe_lock); /* register as an event */ - old_tu = find_probe_event(trace_event_name(&tu->tp.call), - tu->tp.call.class->system); + old_tu = find_old_trace_uprobe(tu); + if (IS_ERR(old_tu)) { + ret = PTR_ERR(old_tu); + goto end; + } + if (old_tu) { /* delete old event */ ret = unregister_trace_uprobe(old_tu); -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2018-06-06 8:35 UTC|newest] Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-06-06 8:33 [PATCH 0/7] Uprobes: Support SDT markers having reference count (semaphore) Ravi Bangoria 2018-06-06 8:33 ` Ravi Bangoria 2018-06-06 8:33 ` [PATCH 1/7] Uprobes: Simplify uprobe_register() body Ravi Bangoria 2018-06-06 8:33 ` Ravi Bangoria 2018-06-06 8:33 ` [PATCH 2/7] Uprobes: Support SDT markers having reference count (semaphore) Ravi Bangoria 2018-06-06 8:33 ` Ravi Bangoria 2018-06-06 8:33 ` [PATCH 3/7] Uprobes/sdt: Fix multiple update of same reference counter Ravi Bangoria 2018-06-06 8:33 ` Ravi Bangoria 2018-06-06 8:33 ` Ravi Bangoria [this message] 2018-06-06 8:33 ` [PATCH 4/7] trace_uprobe/sdt: Prevent multiple reference counter for same uprobe Ravi Bangoria 2018-06-06 8:33 ` [PATCH 5/7] Uprobes/sdt: " Ravi Bangoria 2018-06-06 8:33 ` Ravi Bangoria 2018-06-06 8:33 ` [PATCH 6/7] Uprobes/sdt: Document about reference counter Ravi Bangoria 2018-06-06 8:33 ` Ravi Bangoria 2018-06-06 8:33 ` [PATCH 7/7] perf probe: Support SDT markers having reference counter (semaphore) Ravi Bangoria 2018-06-06 8:33 ` Ravi Bangoria 2018-06-06 8:35 ` [PATCH 0/7] Uprobes: Support SDT markers having reference count (semaphore) Ravi Bangoria 2018-06-06 8:35 ` Ravi Bangoria 2018-06-08 1:10 ` Masami Hiramatsu 2018-06-08 1:10 ` Masami Hiramatsu 2018-06-08 2:29 ` Ravi Bangoria 2018-06-08 2:29 ` Ravi Bangoria 2018-06-08 5:14 ` Masami Hiramatsu 2018-06-08 5:14 ` Masami Hiramatsu 2018-06-08 6:34 ` Ravi Bangoria 2018-06-08 6:34 ` Ravi Bangoria 2018-06-08 15:45 ` Masami Hiramatsu 2018-06-08 15:45 ` Masami Hiramatsu 2018-06-11 4:31 ` Ravi Bangoria 2018-06-11 4:31 ` Ravi Bangoria 2018-06-16 13:50 ` Masami Hiramatsu 2018-06-16 13:50 ` Masami Hiramatsu 2018-06-16 15:07 ` Ravi Bangoria 2018-06-16 15:07 ` Ravi Bangoria 2018-06-08 16:36 ` Oleg Nesterov 2018-06-08 16:36 ` Oleg Nesterov 2018-06-11 4:13 ` Ravi Bangoria 2018-06-11 4:13 ` Ravi Bangoria 2018-06-20 16:37 ` Steven Rostedt 2018-06-20 16:37 ` Steven Rostedt 2018-06-21 2:35 ` Ravi Bangoria 2018-06-21 2:35 ` Ravi Bangoria
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=20180606083344.31320-5-ravi.bangoria@linux.ibm.com \ --to=ravi.bangoria@linux.ibm.com \ --cc=acme@kernel.org \ --cc=alexander.shishkin@linux.intel.com \ --cc=alexis.berlemont@gmail.com \ --cc=ananth@linux.vnet.ibm.com \ --cc=corbet@lwn.net \ --cc=jolsa@redhat.com \ --cc=linux-doc@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mhiramat@kernel.org \ --cc=mingo@redhat.com \ --cc=namhyung@kernel.org \ --cc=naveen.n.rao@linux.vnet.ibm.com \ --cc=oleg@redhat.com \ --cc=peterz@infradead.org \ --cc=rostedt@goodmis.org \ --cc=srikar@linux.vnet.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: linkBe 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.