From bbd23554f998950026e82b5dba9d18140b96c8e3 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Wed, 29 Aug 2012 14:37:30 +0400 Subject: [PATCH] fix miss events (recursion handling disabled) recursing?! --- kprobe/arch/asm-arm/dbi_kprobes.c | 9 +++++---- kprobe/dbi_insn_slots.c | 14 +++++++------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/kprobe/arch/asm-arm/dbi_kprobes.c b/kprobe/arch/asm-arm/dbi_kprobes.c index e45e1fd..73ea5f0 100644 --- a/kprobe/arch/asm-arm/dbi_kprobes.c +++ b/kprobe/arch/asm-arm/dbi_kprobes.c @@ -715,7 +715,7 @@ void save_previous_kprobe (struct kprobe_ctlblk *kcb, struct kprobe *cur_p) void restore_previous_kprobe (struct kprobe_ctlblk *kcb) { - __get_cpu_var (current_kprobe) = kcb->prev_kprobe.kp; + set_current_kprobe(kcb->prev_kprobe.kp, NULL, NULL); kcb->kprobe_status = kcb->prev_kprobe.status; kcb->prev_kprobe.kp = NULL; kcb->prev_kprobe.status = 0; @@ -1090,7 +1090,8 @@ int kprobe_handler (struct pt_regs *regs) pid = current->tgid; } /* Check we're not actually recursing */ - if (kprobe_running ()) + // TODO: handling of recursion is disabled + if (0 && kprobe_running ()) { DBPRINTF ("lock???"); p = get_kprobe (addr, pid, current); @@ -1149,7 +1150,7 @@ int kprobe_handler (struct pt_regs *regs) } } if(!p) { - p = __get_cpu_var (current_kprobe); + p = kprobe_running(); DBPRINTF ("kprobe_running !!! p = 0x%p p->break_handler = 0x%p", p, p->break_handler); /*if (p->break_handler && p->break_handler(p, regs)) { DBPRINTF("kprobe_running !!! goto ss"); @@ -1293,7 +1294,7 @@ int setjmp_pre_handler (struct kprobe *p, struct pt_regs *regs) entry_point_t entry; # ifdef REENTER - p = __get_cpu_var (current_kprobe); + p = kprobe_running(); # endif DBPRINTF ("pjp = 0x%p jp->entry = 0x%p", jp, jp->entry); diff --git a/kprobe/dbi_insn_slots.c b/kprobe/dbi_insn_slots.c index cce3c62..de979af 100644 --- a/kprobe/dbi_insn_slots.c +++ b/kprobe/dbi_insn_slots.c @@ -149,7 +149,7 @@ kprobe_opcode_t *get_insn_slot (struct task_struct *task, int atomic) } retry: - hlist_for_each_entry (kip, pos, page_list, hlist) + hlist_for_each_entry_rcu(kip, pos, page_list, hlist) { if( !(!task || (kip->tgid == task->tgid)) ) continue; @@ -211,7 +211,7 @@ retry: kip->ngarbage = 0; kip->tgid = task ? task->tgid : 0; INIT_HLIST_NODE (&kip->hlist); - hlist_add_head (&kip->hlist, page_list); + hlist_add_head_rcu(&kip->hlist, page_list); return kip->insns; } @@ -231,11 +231,11 @@ int collect_one_slot (struct hlist_head *page_list, struct task_struct *task, * so as not to have to set it up again the * next time somebody inserts a probe. */ - hlist_del (&kip->hlist); + hlist_del_rcu(&kip->hlist); if (!task && hlist_empty (page_list)) { INIT_HLIST_NODE (&kip->hlist); - hlist_add_head (&kip->hlist, page_list); + hlist_add_head_rcu(&kip->hlist, page_list); } else { @@ -272,7 +272,7 @@ int collect_one_slot (struct hlist_head *page_list, struct task_struct *task, int collect_garbage_slots (struct hlist_head *page_list, struct task_struct *task) { struct kprobe_insn_page *kip; - struct hlist_node *pos, *next; + struct hlist_node *pos; unsigned slots_per_page = INSNS_PER_PAGE; /* Ensure no-one is preepmted on the garbages */ @@ -284,7 +284,7 @@ int collect_garbage_slots (struct hlist_head *page_list, struct task_struct *tas else slots_per_page = INSNS_PER_PAGE/KPROBES_TRAMP_LEN; - hlist_for_each_entry_safe (kip, pos, next, page_list, hlist) + hlist_for_each_entry_rcu(kip, pos, page_list, hlist) { int i; if ((task && (kip->tgid != task->tgid)) || (kip->ngarbage == 0)) @@ -323,7 +323,7 @@ void free_insn_slot (struct hlist_head *page_list, struct task_struct *task, kpr } DBPRINTF("free_insn_slot: dirty %d, %p/%d", dirty, task, task?task->pid:0); - hlist_for_each_entry (kip, pos, page_list, hlist) + hlist_for_each_entry_rcu(kip, pos, page_list, hlist) { DBPRINTF("free_insn_slot: kip->insns=%p slot=%p", kip->insns, slot); if ((kip->insns <= slot) && (slot < kip->insns + (INSNS_PER_PAGE * MAX_INSN_SIZE))) -- 2.7.4