hlist_for_each_entry(ri, node, head, hlist) { if (ri->stack_addr == sara && ri->rp) { if (ri->rp->handler) ri->rp->handler(ri, regs); } 
/* * It is possible to have multiple instances associated with a given * task either because an multiple functions in the call path * have a return probe installed on them, and/or more then one return * return probe was registered for a target function. * * We can handle this because: *     - instances are always inserted at the head of the list *     - when multiple return probes are registered for the same *       function, the first instance's ret_addr will point to the *       real return address, and all the rest will point to *       kretprobe_trampoline */ hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { if (ri->task != current) /* another task is sharing our hash bucket */ continue;  if (ri->rp && ri->rp->handler) ri->rp->handler(ri, regs);  orig_ret_address = (unsigned long)ri->ret_addr; recycle_rp_inst(ri);  if (orig_ret_address != trampoline_address) /* * This is the real return address. Any other * instances associated with this task are for * other calls deeper on the call stack */ break; 
int trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs){	struct task_struct *tsk;	struct kretprobe_instance *ri;	struct hlist_head *head;	struct hlist_node *node;	unsigned long *sara = ((unsigned long *) &regs->esp) - 1;	tsk = arch_get_kprobe_task(sara);	head = kretprobe_inst_table_head(tsk);	hlist_for_each_entry(ri, node, head, hlist) {		if (ri->stack_addr == sara && ri->rp) {			if (ri->rp->handler)				ri->rp->handler(ri, regs);		}	}	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/4bdbd37f6d01abc4c002bb8de90ea2c3bc7abe7e/kprobes.c/clean/arch/i386/kernel/kprobes.c