uprobes: Reintroduce uprobe_consumer->filter()
authorOleg Nesterov <oleg@redhat.com>
Fri, 28 Dec 2012 16:58:38 +0000 (17:58 +0100)
committerOleg Nesterov <oleg@redhat.com>
Fri, 8 Feb 2013 16:47:10 +0000 (17:47 +0100)
commit8a7f2fa0dea3b019500961b86d765e6fdd4bffb2
treec6c467e02da75a9e92f8541cf8889dbd0e2fe5fb
parent806a98bdf2a862fef0fc880399d677b35ba525ff
uprobes: Reintroduce uprobe_consumer->filter()

Finally add uprobe_consumer->filter() and change consumer_filter()
to actually call this method.

Note that ->filter() accepts mm_struct, not task_struct. Because:

1. We do not have for_each_mm_user(mm, task).

2. Even if we implement for_each_mm_user(), ->filter() can
   use it itself.

3. It is not clear who will actually need this interface to
   do the "nontrivial" filtering.

Another argument is "enum uprobe_filter_ctx", consumer->filter() can
use it to figure out why/where it was called. For example, perhaps
we can add UPROBE_FILTER_PRE_REGISTER used by build_map_info() to
quickly "nack" the unwanted mm's. In this case consumer should know
that it is called under ->i_mmap_mutex.

See the previous discussion at http://marc.info/?t=135214229700002
Perhaps we should pass more arguments, vma/vaddr?

Note: this patch obviously can't help to filter out the child created
by fork(), this will be addressed later.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
include/linux/uprobes.h
kernel/events/uprobes.c