fix miss events (recursion handling disabled)
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 29 Aug 2012 10:37:30 +0000 (14:37 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 29 Aug 2012 12:38:28 +0000 (16:38 +0400)
recursing?!

kprobe/arch/asm-arm/dbi_kprobes.c
kprobe/dbi_insn_slots.c

index e45e1fd..73ea5f0 100644 (file)
@@ -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);
index cce3c62..de979af 100644 (file)
@@ -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)))