Re: [PATCH 3/3] mm: Simplify anon_vma refcounts

From: Linus Torvalds
Date: Thu Feb 17 2011 - 13:31:03 EST


On Thu, Feb 17, 2011 at 8:19 AM, Peter Zijlstra <a.p.zijlstra@xxxxxxxxx> 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), 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)

Linus
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/