|
|
@@ -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);
|
|
|
}
|
|
|
/*
|