> > int mmap_uprobe(...) { > .... > ret = install_breakpoint(vma->vm_mm, uprobe); > if (ret == -EEXIST) { > if (!read_opcode(vma->vm_mm, vaddr, &opcode) && > (opcode == UPROBES_BKPT_INSN)) > atomic_inc(&vma->vm_mm->mm_uprobes_count); > ret = 0; > } > .... > } > Infact the check for EEXIST and read_opcode in mmap_uprobe() is needed for another reason too. Lets say while unregister_uprobe was around, a thread thats being probed, just forked a child and the child called mmap_uprobe. Now mmap_uprobe might find that the breakpoint is already inserted since the pages are shared with the parent. But before unregister_uprobe can come around and cleanup, the child can run and hit the breakpoint. Since the breakpoint count is 0 for the child, we dont expect the child to have hit a breakpoint placed by uprobes, and the child gets a SIGTRAP. With this check for read_opcode on EEXIST from install_breakpoint, we will know that there is a valid breakpoint underneath and increment the count. So on a breakpoint hit, the uprobes notifier does the right thing. If the unregister_uprobe() had already cleanup the breakpoint in the parent, the child's copy would also be clean so read_opcode wont find the breakpoint and hence we wont increment the breakpoint. -- Thanks and Regards Srikar -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>