* Peter Zijlstra <peterz@xxxxxxxxxxxxx> [2011-09-27 13:41:21]: > On Mon, 2011-09-26 at 21:14 +0530, Srikar Dronamraju wrote: > > > Why not something like: > > > > > > > > > +static struct uprobe *__find_uprobe(struct inode * inode, loff_t offset, > > > bool inode_only) > > > +{ > > > struct uprobe u = { .inode = inode, .offset = inode_only ? 0 : offset }; > > > + struct rb_node *n = uprobes_tree.rb_node; > > > + struct uprobe *uprobe; > > > struct uprobe *ret = NULL; > > > + int match; > > > + > > > + while (n) { > > > + uprobe = rb_entry(n, struct uprobe, rb_node); > > > + match = match_uprobe(&u, uprobe); > > > + if (!match) { > > > if (!inode_only) > > > atomic_inc(&uprobe->ref); > > > + return uprobe; > > > + } > > > if (inode_only && uprobe->inode == inode) > > > ret = uprobe; > > > + if (match < 0) > > > + n = n->rb_left; > > > + else > > > + n = n->rb_right; > > > + > > > + } > > > return ret; > > > +} > > > > > > > I am not comfortable with this change. > > find_uprobe() was suppose to return back a uprobe if and only if > > the inode and offset match, > > And it will, because find_uprobe() will never expose that third > argument. > > > However with your approach, we end up > > returning a uprobe that isnt matching and one that isnt refcounted. > > Moreover if even if we have a matching uprobe, we end up sending a > > unrefcounted uprobe back. > > Because the matching isn't the important part, you want to return the > leftmost node matching the specified inode. Also, in that case you > explicitly don't want the ref, since the first thing you do on the > call-site is drop the ref if there was a match. You don't care about > inode:0 in particular, you want a place to start iterating all of > inode:*. > The case of we taking a ref and dropping it would arise if and only if there is a matching uprobe i.e inode: and 0 offset. I dont think that would be the common case. If you arent comfortable passing the rb_node as the third argument, then we could pass the reference to uprobe itself. But that would mean we do a redundant dereference everytime. -- 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>