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