diff options
author | Oleg Nesterov <oleg@redhat.com> | 2012-12-29 17:49:11 +0100 |
---|---|---|
committer | Oleg Nesterov <oleg@redhat.com> | 2013-02-08 17:47:11 +0100 |
commit | da1816b1caeccdff04531e763bb35d7caa3ed19f (patch) | |
tree | bbf3b1eda3f969a5115770f0aa1081feafd871cb /kernel/cpu.c | |
parent | 8a7f2fa0dea3b019500961b86d765e6fdd4bffb2 (diff) | |
download | linux-da1816b1caeccdff04531e763bb35d7caa3ed19f.tar.bz2 |
uprobes: Teach handler_chain() to filter out the probed task
Currrently the are 2 problems with pre-filtering:
1. It is not possible to add/remove a task (mm) after uprobe_register()
2. A forked child inherits all breakpoints and uprobe_consumer can not
control this.
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.
Note that handler_chain() relies on ->register_rwsem to avoid the race
with uprobe_register/unregister which can add/del a consumer, or even
remove and then insert the new uprobe at the same address.
Perhaps we will add uprobe_apply_mm(uprobe, mm, is_register) and teach
copy_mm() to do filter(UPROBE_FILTER_FORK), but I think this change makes
sense anyway.
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.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/cpu.c')
0 files changed, 0 insertions, 0 deletions