mirror of https://gitee.com/openkylin/linux.git
kprobes: Don't check the ->break_handler() in generic kprobes code
Don't check the ->break_handler() from the core kprobes code, because it was only used by jprobes which got removed. ( In followup patches we'll remove the remaining calls in low level arch handlers as well and remove the callback altogether. ) Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: linux-arch@vger.kernel.org Link: https://lore.kernel.org/lkml/152942462686.15209.6324404940493598980.stgit@devbox Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
e9bf11a5a6
commit
059053a275
|
@ -262,7 +262,7 @@ is optimized, that modification is ignored. Thus, if you want to
|
|||
tweak the kernel's execution path, you need to suppress optimization,
|
||||
using one of the following techniques:
|
||||
|
||||
- Specify an empty function for the kprobe's post_handler or break_handler.
|
||||
- Specify an empty function for the kprobe's post_handler.
|
||||
|
||||
or
|
||||
|
||||
|
|
|
@ -627,8 +627,8 @@ static void optimize_kprobe(struct kprobe *p)
|
|||
(kprobe_disabled(p) || kprobes_all_disarmed))
|
||||
return;
|
||||
|
||||
/* Both of break_handler and post_handler are not supported. */
|
||||
if (p->break_handler || p->post_handler)
|
||||
/* kprobes with post_handler can not be optimized */
|
||||
if (p->post_handler)
|
||||
return;
|
||||
|
||||
op = container_of(p, struct optimized_kprobe, kp);
|
||||
|
@ -1116,20 +1116,6 @@ static int aggr_fault_handler(struct kprobe *p, struct pt_regs *regs,
|
|||
}
|
||||
NOKPROBE_SYMBOL(aggr_fault_handler);
|
||||
|
||||
static int aggr_break_handler(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
struct kprobe *cur = __this_cpu_read(kprobe_instance);
|
||||
int ret = 0;
|
||||
|
||||
if (cur && cur->break_handler) {
|
||||
if (cur->break_handler(cur, regs))
|
||||
ret = 1;
|
||||
}
|
||||
reset_kprobe_instance();
|
||||
return ret;
|
||||
}
|
||||
NOKPROBE_SYMBOL(aggr_break_handler);
|
||||
|
||||
/* Walks the list and increments nmissed count for multiprobe case */
|
||||
void kprobes_inc_nmissed_count(struct kprobe *p)
|
||||
{
|
||||
|
@ -1270,24 +1256,15 @@ static void cleanup_rp_inst(struct kretprobe *rp)
|
|||
}
|
||||
NOKPROBE_SYMBOL(cleanup_rp_inst);
|
||||
|
||||
/*
|
||||
* Add the new probe to ap->list. Fail if this is the
|
||||
* second break_handler at the address
|
||||
*/
|
||||
/* Add the new probe to ap->list */
|
||||
static int add_new_kprobe(struct kprobe *ap, struct kprobe *p)
|
||||
{
|
||||
BUG_ON(kprobe_gone(ap) || kprobe_gone(p));
|
||||
|
||||
if (p->break_handler || p->post_handler)
|
||||
if (p->post_handler)
|
||||
unoptimize_kprobe(ap, true); /* Fall back to normal kprobe */
|
||||
|
||||
if (p->break_handler) {
|
||||
if (ap->break_handler)
|
||||
return -EEXIST;
|
||||
list_add_tail_rcu(&p->list, &ap->list);
|
||||
ap->break_handler = aggr_break_handler;
|
||||
} else
|
||||
list_add_rcu(&p->list, &ap->list);
|
||||
list_add_rcu(&p->list, &ap->list);
|
||||
if (p->post_handler && !ap->post_handler)
|
||||
ap->post_handler = aggr_post_handler;
|
||||
|
||||
|
@ -1310,8 +1287,6 @@ static void init_aggr_kprobe(struct kprobe *ap, struct kprobe *p)
|
|||
/* We don't care the kprobe which has gone. */
|
||||
if (p->post_handler && !kprobe_gone(p))
|
||||
ap->post_handler = aggr_post_handler;
|
||||
if (p->break_handler && !kprobe_gone(p))
|
||||
ap->break_handler = aggr_break_handler;
|
||||
|
||||
INIT_LIST_HEAD(&ap->list);
|
||||
INIT_HLIST_NODE(&ap->hlist);
|
||||
|
@ -1706,8 +1681,6 @@ static int __unregister_kprobe_top(struct kprobe *p)
|
|||
goto disarmed;
|
||||
else {
|
||||
/* If disabling probe has special handlers, update aggrprobe */
|
||||
if (p->break_handler && !kprobe_gone(p))
|
||||
ap->break_handler = NULL;
|
||||
if (p->post_handler && !kprobe_gone(p)) {
|
||||
list_for_each_entry_rcu(list_p, &ap->list, list) {
|
||||
if ((list_p != p) && (list_p->post_handler))
|
||||
|
@ -1911,7 +1884,6 @@ int register_kretprobe(struct kretprobe *rp)
|
|||
rp->kp.pre_handler = pre_handler_kretprobe;
|
||||
rp->kp.post_handler = NULL;
|
||||
rp->kp.fault_handler = NULL;
|
||||
rp->kp.break_handler = NULL;
|
||||
|
||||
/* Pre-allocate memory for max kretprobe instances */
|
||||
if (rp->maxactive <= 0) {
|
||||
|
@ -2034,7 +2006,6 @@ static void kill_kprobe(struct kprobe *p)
|
|||
list_for_each_entry_rcu(kp, &p->list, list)
|
||||
kp->flags |= KPROBE_FLAG_GONE;
|
||||
p->post_handler = NULL;
|
||||
p->break_handler = NULL;
|
||||
kill_optimized_kprobe(p);
|
||||
}
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue