Messages in this thread | | | Subject | Re: [PATCH 3/3] mm: Simplify anon_vma refcounts | From | Peter Zijlstra <> | Date | Fri, 18 Feb 2011 12:30:35 +0100 |
| |
On Thu, 2011-02-17 at 10:30 -0800, Linus Torvalds wrote: > On Thu, Feb 17, 2011 at 8:19 AM, Peter Zijlstra <a.p.zijlstra@chello.nl> wrote: > > > > +void __put_anon_vma(struct anon_vma *anon_vma) > > +{ > > + if (anon_vma->root != anon_vma) > > + put_anon_vma(anon_vma->root); > > + anon_vma_free(anon_vma); > > } > > So this makes me nervous. It looks like recursion. > > Now, I don't think we can ever get a chain of these things (because > the root should be the root of everything),
Exactly.
> but I still preferred the > older code that made that "one-level root" case explicit, and didn't > have recursion. > > IOW, even though it should be entirely equivalent, I think I'd really > prefer something like > > void __put_anon_vma(struct anon_vma *anon_vma) > { > struct anon_vma *root = anon_vma->root; > > if (root != anon_vma && atomic_dec_and_test(&root->refcount)) > anon_vma_free(root); > anon_vma_free(anon_vma); > } > > instead. Exactly because it makes it very clear that the "root" is a > root, and we're not doing some possibly arbitrarily deep list like the > dentry tree (which avoids recursion by open-coding its freeing as a > loop). > > Hmm? (The above is obviously untested, maybe it has some stupid bug)
Looks about right, I'll give it a spin.
| |