Re: [PATCH 06/43] FS-Cache: Recruit a couple of page flags for cache management [ver #46]

From: Nick Piggin
Date: Thu Apr 02 2009 - 12:15:40 EST


On Friday 03 April 2009 02:51:02 David Howells wrote:
> Nick Piggin <nickpiggin@xxxxxxxxxxxx> wrote:
>
> > Haven't looked closely at how fscache works.
>
> It's fairly simple. FS-Cache sets PG_private_2 (PageFsCache) on pages that the
> netfs tells it about, if it retains an interest in the page. This causes
> invalidatepage() and suchlike to be invoked on that page when the page is
> discarded.
>
> The netfs can check for the page being in use by calling PageFsCache() and then
> uncache the page if it is in use:
>
> #ifdef CONFIG_AFS_FSCACHE
> if (PageFsCache(page)) {
> struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
> wait_on_page_fscache_write(page);
> fscache_uncache_page(vnode->cache, page);
> }
> #endif
>
> which clears the bit.

OK, then you just use PG_private for that, and have the netfs
use a PG_owner_private or some such bit to tell that it is an
fscache page.


> Furthermore, when FS-Cache is asked to store a page to the cache, it
> immediately marks it with PG_owner_priv_2 (PageFsCacheWrite). This is cleared
> when FS-Cache no longer needs the data in the page for writing to the cache.
>
> This allows (1) invalidatepage() to wait until the page is written before it is
> returned to the memory allocator, and (2) releasepage() to indicate that the
> page is busy if __GFP_WAIT is not given.

So it isn't written synchronously at invalidatepage-time? OK.


> > Possibly you can't reuse mappedtodisk....
>
> PG_mappedtodisk has a very specific meaning to fs/buffer.c and fs/mpage.c. I
> can't also easily make it mean that a page is backed by the cache. A page can
> be cached and not mapped to disk.

You have 2 types of pagecache pages you are dealing with here, right? The
netfs and the backingfs pages. From what you write above, am I to take it
that you need to know whether a backingfs page is "backed by the cache"?
WTF for? And what cache is it backed by if it is the backing store?


> > > We still need a way of triggering the page invalidation callbacks for in-use
> > > pages, however. PG_private, as I've said, is not currently a viable option.
> >
> > Can you say exactly why not?
>
> fs/buffer.c owns PG_private in filesystems that use standard buffering. It
> sets it, clears it and tests it at its own behest without recourse to the
> filesystem using it.

One of us is confused about how this works. Firstly, from your description
above, you're needing the invalidatepage call from the *netfs* page. This is
not using fs/buffer.c presumably, that is the backing store fs.

Secondly, I repeat again, PG_private is only to tell the VM to call the fs aop,
so if you just think you can override this without changing the aop then you
are mistaken: buffer.c will blow up in serveral places if its page aops are
called without buffers being attached to the page (try_to_release_page being one
of them).

Thirdly, buffer layer is just a library for the filesystem to use. Of course it
has recourse to override things just by giving different aops (which could then
call into buffer.c if PG_fscache is not set or whatever you require).


> Also NFS uses PG_private for its own nefarious purposes. Making PG_private be
> the conjunction of both purposes entailed some fairly messy patching.

This is basically an NFS mess, so that's where it belongs. But anyway I don't
see how it could be less messy to add this in the VM because NFS aops *still*
need to distinguish between cases anyway.
--
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/