Messages in this thread | | | From | Linus Torvalds <> | Date | Wed, 1 Dec 2010 08:47:34 -0800 | Subject | Re: [PATCH v2 3/3] NFS: Fix a memory leak in nfs_readdir |
| |
On Wed, Dec 1, 2010 at 8:35 AM, Rik van Riel <riel@redhat.com> wrote: > > Surely somebody can have just looked up the page and > gotten a reference count, right before your ->freepage > call is invoked?
No.
The removal from the page cache is atomic, even in the presence of the lockless lookup.
The page cache lookup does a "get_page_unless_zero()" on the count, so when __remove_mapping() has removed the page using "page_freeze_refs()", it's really gone, and cannot be looked up.
And if that is broken, then we have much more serious problems (like aliasing the same page when doing mmap/read etc), so that's more than just an implementation detail, it's a fundamental requirement of the whole page-cache design.
And that's the whole point of adding this callback to the __remove_mapping() stage: that's the _only_ point where we really end up knowing that "yes, we really removed that page, and there are no more users".
Linus
| |