From: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <peterz@infradead.org>,
Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
Anton Arapov <anton@redhat.com>, Frank Eigler <fche@redhat.com>,
Josh Stone <jistone@redhat.com>,
"Suzuki K. Poulose" <suzuki@in.ibm.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/1] uprobes: Teach handler_chain() to filter out the probed task
Date: Wed, 9 Jan 2013 23:09:18 +0530 [thread overview]
Message-ID: <20130109173918.GL1325@linux.vnet.ibm.com> (raw)
In-Reply-To: <20130108190018.GA4408@redhat.com>
* Oleg Nesterov <oleg@redhat.com> [2013-01-08 20:00:18]:
> On 01/08, Srikar Dronamraju wrote:
> >
> > * Oleg Nesterov <oleg@redhat.com> [2012-12-29 18:36:14]:
> >
> > > This patch does the first step to improve the filtering. handler_chain()
> > > removes the breakpoints installed by this uprobe from current->mm if all
> > > handlers return UPROBE_HANDLER_REMOVE.
> > >
> >
> > I am thinking of tid based filter, If let say a tracer is just
> > interested in a particular thread of a process, should such a hanlder
> > always return 0.
>
> In this case ->handler() should return
>
> current->mm == PROBED_THEAD->mm ? 0 : UPROBE_HANDLER_REMOVE
>
> > In general, does this mean if the handler is not interested for this
> > particular task, but not sure if other tasks in the same process could
> > be interested, then such a handler should always return 0?
>
> Probably yes. Obviously it should return UPROBE_HANDLER_REMOVE only if
> it knows for sure that current can't share ->mm with the "interesting"
> task.
>
okay, then looks good.
> Because, whatever we do, remove_breakpoint() affects ->mm, not task_struct.
> Our goal is eliminate do_int3(), not to skip uc->handler() call.
>
> > If yes, should we document it (either in handler_chain() or
> > near uprobe_consumer definition)
>
> Oh yes, I do agree. We need to add some documentation.
Okay
> I'll try to do
> this in a separate patch (although I would be happy to see the patch
> from someone else ;).
>
> > > Note: instead of checking the retcode from uc->handler, we could add
> > > uc->filter(UPROBE_FILTER_BPHIT). But I think this is not optimal to
> > > call 2 hooks in a row. This buys nothing, and if handler/filter do
> > > something nontrivial they will probably do the same work twice.
> >
> > I was for having the filter called explicitly. But I am okay with it
> > being called internally by the handler.
>
> OK, thanks,
>
> > My only small concern was
> >
> > - Given that we have an explicit filter, handlers (or folks writing
> > handlers can misunderstand and miss filtering assuming that handlers
> > would be called after filtering.
>
> Do you mean that they can assume that uc->filter(mm) should be called at
> least once before uc->handler() with the same current->mm ?
>
yes, thats what I think they can assume.
> They shouldn't in any case. To remind, we can optimize filter_chain()
> for example and avoid the potentially costly uc->filter() call. Say,
> we can detect/remember the fact that at least one consumre has
> ->filter == NULL.
>
> OTOH, UPROBE_HANDLER_REMOVE is not really pre-filtering (although I think
> it helps to make the things better). It is more like uprobe_unapply_mm()
> which (perhaps) we need as well. But doing uprobe_unapply_mm() from
> uc->handler is a) deadlockable and b) not optimal because it has to
> consult other consumers.
>
> Anyway I agree, the folks writing handlers should understand what do they
> do ;) and this needs some documentation.
If we document explicitly that filter wont be called, then this should
be okay.
>
> > > +static void handler_chain(struct uprobe *uprobe, struct pt_regs *regs)
> > > +{
> > > + struct uprobe_consumer *uc;
> > > + int remove = UPROBE_HANDLER_REMOVE;
> > > +
> > > + down_read(&uprobe->register_rwsem);
> > > + for (uc = uprobe->consumers; uc; uc = uc->next) {
> > > + int rc = uc->handler(uc, regs);
> > > +
> > > + WARN(rc & ~UPROBE_HANDLER_MASK,
> > > + "bad rc=0x%x from %pf()\n", rc, uc->handler);
> >
next prev parent reply other threads:[~2013-01-09 17:46 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-29 17:35 [PATCH 0/1] uprobes: Teach handler_chain() to filter out the probed task Oleg Nesterov
2012-12-29 17:36 ` [PATCH 1/1] " Oleg Nesterov
2013-01-08 11:18 ` Srikar Dronamraju
2013-01-08 19:00 ` Oleg Nesterov
2013-01-09 17:39 ` Srikar Dronamraju [this message]
2013-01-09 18:13 ` Oleg Nesterov
2013-01-10 5:35 ` Srikar Dronamraju
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=20130109173918.GL1325@linux.vnet.ibm.com \
--to=srikar@linux.vnet.ibm.com \
--cc=ananth@in.ibm.com \
--cc=anton@redhat.com \
--cc=fche@redhat.com \
--cc=jistone@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--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.