All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Howells <dhowells@redhat.com>
To: Trond Myklebust <trond.myklebust@fys.uio.no>
Cc: David Howells <dhowells@redhat.com>,
	torvalds@osdl.org, akpm@osdl.org, sds@tycho.nsa.gov,
	selinux@tycho.nsa.gov, linux-kernel@vger.kernel.org,
	aviro@redhat.com, steved@redhat.com
Subject: Re: [PATCH 05/19] NFS: Use local caching
Date: Wed, 15 Nov 2006 16:00:24 +0000	[thread overview]
Message-ID: <26454.1163606424@redhat.com> (raw)
In-Reply-To: <1163603377.5691.113.camel@lade.trondhjem.org>

Trond Myklebust <trond.myklebust@fys.uio.no> wrote:

> Why is fscache being given a vote on whether or not the NFS page can be
> removed from the mapping? If the file has changed on the server, so that
> we have to invalidate the mapping, then I don't care about the fact that
> fscache is busy: the page has to go.

This is releasepage() not invalidatepage().  It is conditional.

At this point you can't get rid of the page if FS-Cache is still using it
because FS-Cache will call the netfs callback on the page when it has finished.

You also can't cancel the I/O because it may involve a BIO which itself can't
be cancelled.

You may not be able to sleep to wait for FS-Cache to finish because gfp might
not include __GFP_WAIT.

The whole point is to find out whether a page is releasable and recycle it if
it is, not to force it to be released; for that, invalidatepage() exists.

In my opinion, it is better to tell the VM that this page is not currently
available, and let it get on with trying to find one that is rather than
holding up the page allocator until the page becomes available.

> You are missing the NFSv4 change attribute. The latter is supposed to
> override mtime/ctime/size concerns in NFSv4.

Is that stored in the inode?  I don't recall offhand.  It's easy enough to add
if it is.

> > @@ -84,6 +84,7 @@ void nfs_clear_inode(struct inode *inode
> ...
> What about nfs4_clear_inode?

It calls nfs_clear_inode()...

> > +	nfs_fscache_zap_fh_cookie(inode);
> 
> The cache will be zapped upon the next revalidation anyway. and the
> whole point of nfs_zap_caches is to allow fast invalidation in contexts
> where we cannot sleep. nfs_fscache_zap_fh_cookie calls
> fscache_relinquish_cookie(), which sleeps, grabs rw_semaphores, etc.

Okay...  It sounds like I should be able to drop that call there.

Perhaps you should add a comment to that function to note this...

> > @@ -376,6 +383,7 @@ void nfs_setattr_update_inode(struct ino
> >  	if ((attr->ia_valid & ATTR_SIZE) != 0) {
> >  		nfs_inc_stats(inode, NFSIOS_SETATTRTRUNC);
> >  		inode->i_size = attr->ia_size;
> > +		nfs_fscache_set_size(inode);
> 
> Why? Isn't this supposed to be a read-only inode?

I suppose.  This is a holdover from when I supported R/W inodes too.

> > @@ -942,11 +954,13 @@ static int nfs_update_inode(struct inode
> > ...
> > +			nfs_fscache_set_size(inode);
> 
> Doesn't nfs_fscache_set_size try to grab rw_semaphores? This function is
> _always_ called with the inode->i_lock spinlock held.

Hmmm...  I wonder if I need to do this in nfs_update_inode() at all.  Won't the
pages and the cache object attached to an inode be discarded anyway if the file
attributes returned by the server change?

When can an inode be left with its data attached when modified on the server?
Is this an NFSv4 thing?

> >  static void nfs_readpage_release(struct nfs_page *req)
> >  {
> > +	struct inode *d_inode = req->wb_context->dentry->d_inode;
> > +
> > +	if (PageUptodate(req->wb_page))
> > +		nfs_readpage_to_fscache(d_inode, req->wb_page, 0);
> > +
> 
> Will usually be called from an rpciod context. Should therefore not be
> grabbing semaphores, doing memory allocation etc.

Is it possible to make an NFS kernel thread that can have completed nfs_page
structs queued for writing to the cache?

> > +
> > +	nfs_writepage_to_fscache(inode, page);
> > +
> 
> Why are we doing this, if the cache is turned off whenever the file is
> open for writes?

Good point again; for the moment, this can be discarded - though we could do it
for NFS4 under some circumstances, I believe.

David

--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

WARNING: multiple messages have this Message-ID (diff)
From: David Howells <dhowells@redhat.com>
To: Trond Myklebust <trond.myklebust@fys.uio.no>
Cc: David Howells <dhowells@redhat.com>,
	torvalds@osdl.org, akpm@osdl.org, sds@tycho.nsa.gov,
	selinux@tycho.nsa.gov, linux-kernel@vger.kernel.org,
	aviro@redhat.com, steved@redhat.com
Subject: Re: [PATCH 05/19] NFS: Use local caching
Date: Wed, 15 Nov 2006 16:00:24 +0000	[thread overview]
Message-ID: <26454.1163606424@redhat.com> (raw)
In-Reply-To: <1163603377.5691.113.camel@lade.trondhjem.org>

Trond Myklebust <trond.myklebust@fys.uio.no> wrote:

> Why is fscache being given a vote on whether or not the NFS page can be
> removed from the mapping? If the file has changed on the server, so that
> we have to invalidate the mapping, then I don't care about the fact that
> fscache is busy: the page has to go.

This is releasepage() not invalidatepage().  It is conditional.

At this point you can't get rid of the page if FS-Cache is still using it
because FS-Cache will call the netfs callback on the page when it has finished.

You also can't cancel the I/O because it may involve a BIO which itself can't
be cancelled.

You may not be able to sleep to wait for FS-Cache to finish because gfp might
not include __GFP_WAIT.

The whole point is to find out whether a page is releasable and recycle it if
it is, not to force it to be released; for that, invalidatepage() exists.

In my opinion, it is better to tell the VM that this page is not currently
available, and let it get on with trying to find one that is rather than
holding up the page allocator until the page becomes available.

> You are missing the NFSv4 change attribute. The latter is supposed to
> override mtime/ctime/size concerns in NFSv4.

Is that stored in the inode?  I don't recall offhand.  It's easy enough to add
if it is.

> > @@ -84,6 +84,7 @@ void nfs_clear_inode(struct inode *inode
> ...
> What about nfs4_clear_inode?

It calls nfs_clear_inode()...

> > +	nfs_fscache_zap_fh_cookie(inode);
> 
> The cache will be zapped upon the next revalidation anyway. and the
> whole point of nfs_zap_caches is to allow fast invalidation in contexts
> where we cannot sleep. nfs_fscache_zap_fh_cookie calls
> fscache_relinquish_cookie(), which sleeps, grabs rw_semaphores, etc.

Okay...  It sounds like I should be able to drop that call there.

Perhaps you should add a comment to that function to note this...

> > @@ -376,6 +383,7 @@ void nfs_setattr_update_inode(struct ino
> >  	if ((attr->ia_valid & ATTR_SIZE) != 0) {
> >  		nfs_inc_stats(inode, NFSIOS_SETATTRTRUNC);
> >  		inode->i_size = attr->ia_size;
> > +		nfs_fscache_set_size(inode);
> 
> Why? Isn't this supposed to be a read-only inode?

I suppose.  This is a holdover from when I supported R/W inodes too.

> > @@ -942,11 +954,13 @@ static int nfs_update_inode(struct inode
> > ...
> > +			nfs_fscache_set_size(inode);
> 
> Doesn't nfs_fscache_set_size try to grab rw_semaphores? This function is
> _always_ called with the inode->i_lock spinlock held.

Hmmm...  I wonder if I need to do this in nfs_update_inode() at all.  Won't the
pages and the cache object attached to an inode be discarded anyway if the file
attributes returned by the server change?

When can an inode be left with its data attached when modified on the server?
Is this an NFSv4 thing?

> >  static void nfs_readpage_release(struct nfs_page *req)
> >  {
> > +	struct inode *d_inode = req->wb_context->dentry->d_inode;
> > +
> > +	if (PageUptodate(req->wb_page))
> > +		nfs_readpage_to_fscache(d_inode, req->wb_page, 0);
> > +
> 
> Will usually be called from an rpciod context. Should therefore not be
> grabbing semaphores, doing memory allocation etc.

Is it possible to make an NFS kernel thread that can have completed nfs_page
structs queued for writing to the cache?

> > +
> > +	nfs_writepage_to_fscache(inode, page);
> > +
> 
> Why are we doing this, if the cache is turned off whenever the file is
> open for writes?

Good point again; for the moment, this can be discarded - though we could do it
for NFS4 under some circumstances, I believe.

David

  reply	other threads:[~2006-11-15 16:00 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-14 20:06 [PATCH 00/19] Permit filesystem local caching and NFS superblock sharing David Howells
2006-11-14 20:06 ` David Howells
2006-11-14 20:06 ` [PATCH 02/19] FS-Cache: Provide a filesystem-specific sync'able page bit David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:06 ` [PATCH 03/19] FS-Cache: Release page->private after failed readahead David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:06 ` [PATCH 04/19] FS-Cache: Make kAFS use FS-Cache David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:06 ` [PATCH 05/19] NFS: Use local caching David Howells
2006-11-14 20:06   ` David Howells
2006-11-15 12:38   ` Steve Dickson
2006-11-15 15:09   ` Trond Myklebust
2006-11-15 16:00     ` David Howells [this message]
2006-11-15 16:00       ` David Howells
2006-11-15 16:52       ` Trond Myklebust
2006-11-15 17:07         ` David Howells
2006-11-15 17:07           ` David Howells
2006-11-15 17:53           ` Trond Myklebust
2006-11-14 20:06 ` [PATCH 06/19] FS-Cache: NFS: Only obtain cache cookies on file open, not on inode read David Howells
2006-11-14 20:06   ` David Howells
2006-11-15 11:23   ` Steve Dickson
2006-11-14 20:06 ` [PATCH 07/19] CacheFiles: Add missing copy_page export for ia64 David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:06 ` [PATCH 08/19] CacheFiles: Add a function to write a single page of data to an inode David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:06 ` [PATCH 09/19] CacheFiles: Permit the page lock state to be monitored David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:06 ` [PATCH 10/19] CacheFiles: Export things for CacheFiles David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:06 ` [PATCH 12/19] CacheFiles: Permit a process's create SID to be overridden David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 21:19   ` James Morris
2006-11-14 21:19     ` James Morris
2006-11-15 12:26     ` David Howells
2006-11-15 12:26       ` David Howells
2006-11-15 16:19       ` James Morris
2006-11-15 16:19         ` James Morris
2006-11-15 16:23         ` David Howells
2006-11-15 16:23           ` David Howells
2006-11-15 17:52           ` Karl MacMillan
2006-11-15 17:52             ` Karl MacMillan
2006-11-15 18:21             ` David Howells
2006-11-15 18:21               ` David Howells
2006-11-15 19:09           ` David Howells
2006-11-15 19:09             ` David Howells
2006-11-15 19:11             ` David Howells
2006-11-15 19:11               ` David Howells
2006-11-20 18:49           ` Stephen Smalley
2006-11-20 18:49             ` Stephen Smalley
2006-11-15 13:50     ` David Howells
2006-11-15 13:50       ` David Howells
2006-11-15 16:22       ` James Morris
2006-11-15 16:22         ` James Morris
2006-11-15 17:54         ` Karl MacMillan
2006-11-15 17:54           ` Karl MacMillan
2006-11-20 18:41     ` Stephen Smalley
2006-11-20 18:41       ` Stephen Smalley
2006-11-20 19:56       ` Karl MacMillan
2006-11-20 19:56         ` Karl MacMillan
2006-11-20 22:29       ` James Morris
2006-11-20 22:29         ` James Morris
2006-11-14 20:06 ` [PATCH 13/19] CacheFiles: Add an act-as SID override in task_security_struct David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:06 ` [PATCH 14/19] CacheFiles: Permit an inode's security ID to be obtained David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:06 ` [PATCH 15/19] CacheFiles: Get the SID under which the CacheFiles module should operate David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:06 ` [PATCH 16/19] CacheFiles: Deal with LSM when accessing the cache David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 21:27   ` James Morris
2006-11-14 21:27     ` James Morris
2006-11-14 20:06 ` [PATCH 17/19] CacheFiles: Use the VFS wrappers for inode ops David Howells
2006-11-14 20:06   ` David Howells
2006-11-14 20:07 ` [PATCH 18/19] CacheFiles: Use VFS lookup services David Howells
2006-11-14 20:07 ` [PATCH 19/19] CacheFiles: Permit daemon to probe inuseness of a cache file David Howells
2006-11-14 20:07   ` David Howells
2006-11-15 15:52   ` Christoph Hellwig
2006-11-15 16:10     ` David Howells
2006-11-15 16:10       ` David Howells
2006-11-15 10:10 ` [PATCH 20/19] CacheFiles: Use secid not sid lest confusion arise with session IDs David Howells
2006-11-15 10:10   ` David Howells
2006-11-15 13:17 ` [PATCH 21/19] CacheFiles: Set the file creation security ID whilst binding the cache David Howells
2006-11-15 13:17   ` David Howells
2006-11-15 13:23 ` [PATCH 22/19] FS-Cache: NFS: Rename NFS_INO_CACHEABLE David Howells
2006-11-15 13:23   ` David Howells
2006-11-15 16:42 ` [PATCH 23/19] FS-Cache: NFS: Don't invoke FS-Cache from nfs_zap_caches() David Howells
2006-11-15 16:42   ` David Howells
2006-11-15 16:51 ` [PATCH 24/19] FS-Cache: NFS: Remove old support for R/W caching David Howells
2006-11-15 16:51   ` David Howells
2006-11-15 17:22 ` [PATCH 25/19] FS-Cache: NFS: Wait in releasepage() if FS-Cache is busy and __GFP_WAIT is set David Howells
2006-11-15 17:22   ` David Howells
2006-11-17 10:01 ` [PATCH 26/19] CacheFiles: Don't include linux/proc_fs.h David Howells
2006-11-17 10:01   ` David Howells
2006-11-23 13:10 ` [PATCH 27/19] FS-Cache: Apply the PG_checked -> PG_fs_misc conversion to Ext4 David Howells
2006-11-23 13:10   ` David Howells
2006-11-23 13:17 ` [PATCH 28/19] FS-Cache: NFS: Handle caching being disabled correctly David Howells
2006-11-23 13:17   ` David Howells
2006-11-23 20:13 ` [PATCH 29/19] CacheFiles: Remove old obsolete cull function David Howells
2006-11-23 20:13   ` David Howells
2006-11-29 16:47 ` [PATCH 30/19] CacheFiles: Fix the allocate_page() op David Howells
2006-11-29 16:47   ` David Howells

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=26454.1163606424@redhat.com \
    --to=dhowells@redhat.com \
    --cc=akpm@osdl.org \
    --cc=aviro@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sds@tycho.nsa.gov \
    --cc=selinux@tycho.nsa.gov \
    --cc=steved@redhat.com \
    --cc=torvalds@osdl.org \
    --cc=trond.myklebust@fys.uio.no \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.