From: Josh Stone <jistone@redhat.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>,
Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
Anton Arapov <anton@redhat.com>, David Smith <dsmith@redhat.com>,
"Frank Ch. Eigler" <fche@redhat.com>, Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <peterz@infradead.org>,
"Suzuki K. Poulose" <suzuki@in.ibm.com>,
linux-kernel@vger.kernel.org
Subject: Re: uprobes && pre-filtering
Date: Tue, 06 Nov 2012 09:41:21 -0800 [thread overview]
Message-ID: <50994BC1.1000705@redhat.com> (raw)
In-Reply-To: <20121106170243.GA32311@redhat.com>
On 11/06/2012 09:02 AM, Oleg Nesterov wrote:
> On 11/06, Srikar Dronamraju wrote:
>> Another reason for having the filters in the current way was to have a
>> set of standard filters in uprobes code so that all users dont need to
>> recreate these filters.
>
> IOW, you mean that both register_for_each_vma() and handler_chain() should
> use the same ->filter() method? Personally I do not think they should.
>
> Because the semantics is different imo. register_for_each_vma() needs
> to know if we should modify mm and insert the breakpoint. handler_chain()
> just tries to skip ->handler() (and for no reason, imho).
I agree here - I don't see much use for filter(), and even if you have
it, the semantics are definitely different than prefilter(). You could
do all sorts of localized and temporal checks in filter() that make no
sense for a prefilter(), like check for a particular thread id, filter
every N hits, or filter only hits under calls to some foo().
[...]
>>> - Perhaps we should extend the API. We can add
>>>
>>> uprobe_apply(consumer, task, bool add_remove);
>>>
>>> which adds/removes breakpoints to task->mm.
>>>
>>> This way consumer can probe every task it wants to trace after
>>> uprobe_register().
>>>
>>> Its ->filter(UPROBE_FILTER_REGISTER) should simply return false. Or,
>>> better, we can split uprobe_register() into 2 functions,
>>> __uprobe_register() and uprobe_apply_all() which actually does
>>> register_for_each_vma().
>>>
>>> ***** QUESTION *****: perhaps this is all systemtap needs? ignoring
>>> UPROBE_FILTER_MMAP.
>>>
>>> - Multiple consumers. uprobe_register/uprobe_unregister should be
>>> modified so that register_for_each_vma() is called every time when
>>> the new consumer comes or consumer goes away.
>>>
>>> uprobe_apply(add_remove => false) should obviously consult other
>>> consumers too.
>>
>>
>> So in this case, would uprobe_register() just add a consumer to a
>> new/existing uprobe. The actual probe insertion is done by the
>> uprobe_apply()/uprobe_apply_all().
>
> Yes. Not sure we really need this, but to me this extension looks natural.
>
> Frank, Josh, do you think it can help systemtap ?
Yes, I think this sounds closer to systemtap's model of probing. We
already track tasks that come and go to see which are "interesting", so
we could easily call apply() at that time. We actually watch mmaps too,
so I think we could apply() for that case as well.
We wouldn't even need filtering functions at all in this mode. But
maybe other consumers could still use it, like perf.
However, it's not clear to me what value there is in uprobe_register, if
you always have to apply it too. The modes are something like:
1. uprobe_register(); uprobe_apply_all();
2. uprobe_register(); uprobe_apply(); [...]
And the second could have a bunch of idle registrations waiting for the
first applicable task to come around. So why not instead:
1. uprobe_register_all();
2. uprobe_register_task(); [...]
In this case, the second would have to allow the same consumer to be
repeated on different tasks, but it feels more natural to me.
Josh
next prev parent reply other threads:[~2012-11-06 17:41 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-05 19:04 uprobes && pre-filtering Oleg Nesterov
2012-11-06 9:05 ` Srikar Dronamraju
2012-11-06 17:02 ` Oleg Nesterov
2012-11-06 17:41 ` Josh Stone [this message]
2012-11-06 18:20 ` 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=50994BC1.1000705@redhat.com \
--to=jistone@redhat.com \
--cc=ananth@in.ibm.com \
--cc=anton@redhat.com \
--cc=dsmith@redhat.com \
--cc=fche@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=oleg@redhat.com \
--cc=peterz@infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox