On 07/10, Oleg Nesterov wrote: > > -void uprobe_unregister(struct inode *inode, loff_t offset, struct > uprobe_consumer *uc) > +void uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *uc) > { > - struct uprobe *uprobe; > - > - uprobe = find_uprobe(inode, offset); > - if (WARN_ON(!uprobe)) > - return; > - > down_write(&uprobe->register_rwsem); > __uprobe_unregister(uprobe, uc); > up_write(&uprobe->register_rwsem); > - put_uprobe(uprobe);
OK, this is obviously wrong, needs get_uprobe/put_uprobe. __uprobe_unregister() can free this uprobe, so up_write(&uprobe->register_rwsem) is not safe. I'll send V2 on top of Peter's new version. Oleg.