> > void __unregister_uprobe(...) > { > uprobe = find_uprobe(); // ref++ > if (delete_consumer(...)); // includes tree removal on last consumer > // implies we own the last ref > return; // consumers > > vma_prio_tree_foreach() { > // create list > } > > list_for_each_entry_safe() { > // remove from list > remove_breakpoint(); // unconditional, if it wasn't there > // its a nop anyway, can't get any new > // new probes on account of holding > // uprobes_mutex and mmap() doesn't see > // it due to tree removal. > } > } > This would have a bigger race. A breakpoint might be hit by which time the node is removed and we have no way to find out the uprobe. So we deliver an extra TRAP to the app. > int mmap_uprobe(...) > { > spin_lock(&uprobes_treelock); > for_each_probe_in_inode() { > // create list; > } > spin_unlock(..); > > list_for_each_entry_safe() { > // remove from list > ret = install_breakpoint(); > if (ret) > goto fail; > if (!uprobe_still_there()) // takes treelock > remove_breakpoint(); > } > > return 0; > > fail: > list_for_each_entry_safe() { > // destroy list > } > return ret; > } > register_uprobe will race with mmap_uprobe's first pass. So we might end up with a vma that doesnot have a breakpoint inserted but inserted in all other vma that map to the same inode. -- 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>