All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Snitzer <snitzer@kernel.org>
To: Jeff Layton <jlayton@kernel.org>
Cc: linux-nfs@vger.kernel.org, Anna Schumaker <anna@kernel.org>,
	Trond Myklebust <trondmy@hammerspace.com>
Subject: Re: nfs: avoid i_lock contention in nfs_clear_invalid_mapping
Date: Fri, 18 Oct 2024 15:49:50 -0400	[thread overview]
Message-ID: <ZxK73l2yAOcLe_jl@kernel.org> (raw)
In-Reply-To: <e25a451540d8eb63f35b82652e197b6e207d4317.camel@kernel.org>

On Fri, Oct 18, 2024 at 03:39:13PM -0400, Jeff Layton wrote:
> On Fri, 2024-10-18 at 13:03 -0400, Mike Snitzer wrote:
> > Multi-threaded buffered reads to the same file exposed significant
> > inode spinlock contention in nfs_clear_invalid_mapping().
> > 
> > Eliminate this spinlock contention by checking flags without locking,
> > instead using smp_rmb and smp_load_acquire accordingly, but then take
> > spinlock and double-check these inode flags.
> > 
> > Also refactor nfs_set_cache_invalid() slightly to use
> > smp_store_release() to pair with nfs_clear_invalid_mapping()'s
> > smp_load_acquire().
> > 
> > While this fix is beneficial for all multi-threaded buffered reads
> > issued by an NFS client, this issue was identified in the context of
> > surprisingly low LOCALIO performance with 4K multi-threaded buffered
> > read IO.  This fix dramatically speeds up LOCALIO performance:
> > 
> > before: read: IOPS=1583k, BW=6182MiB/s (6482MB/s)(121GiB/20002msec)
> > after:  read: IOPS=3046k, BW=11.6GiB/s (12.5GB/s)(232GiB/20001msec)
> > 
> > Fixes: 17dfeb911339 ("NFS: Fix races in nfs_revalidate_mapping")
> > Signed-off-by: Mike Snitzer <snitzer@kernel.org>
> > ---
> >  fs/nfs/inode.c | 19 ++++++++++++++-----
> >  1 file changed, 14 insertions(+), 5 deletions(-)
> > 
> > diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
> > index 542c7d97b235..130d7226b12a 100644
> > --- a/fs/nfs/inode.c
> > +++ b/fs/nfs/inode.c
> > @@ -205,12 +205,14 @@ void nfs_set_cache_invalid(struct inode *inode, unsigned long flags)
> >  		nfs_fscache_invalidate(inode, 0);
> >  	flags &= ~NFS_INO_REVAL_FORCED;
> >  
> > -	nfsi->cache_validity |= flags;
> > +	if (inode->i_mapping->nrpages == 0)
> > +		flags &= ~NFS_INO_INVALID_DATA;
> >  
> > -	if (inode->i_mapping->nrpages == 0) {
> > -		nfsi->cache_validity &= ~NFS_INO_INVALID_DATA;
> > -		nfs_ooo_clear(nfsi);
> > -	} else if (nfsi->cache_validity & NFS_INO_INVALID_DATA) {
> > +	/* pairs with nfs_clear_invalid_mapping()'s smp_load_acquire() */
> > +	smp_store_release(&nfsi->cache_validity, flags);
> > +
> 
> I don't know this code that well, but it used to do an |= of flags into
> cache_validity. Now you're replacing cache_validity wholesale with
> flags. Maybe that should do something like this?
> 
>     flags |= nfsi->cache_validity;
>     smp_store_release(&nfsi->cache_validity, flags);

Ah good catch, sorry about that, will fix.

This will allow further cleanup too, will let v2 speak to that.

Thanks!
Mike

  reply	other threads:[~2024-10-18 19:49 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-18 17:03 [PATCH] nfs: avoid i_lock contention in nfs_clear_invalid_mapping Mike Snitzer
2024-10-18 19:39 ` Jeff Layton
2024-10-18 19:49   ` Mike Snitzer [this message]
2024-10-18 21:37     ` Mike Snitzer
2024-10-30 19:51       ` Anna Schumaker
2024-10-30 20:03         ` Mike Snitzer
2024-10-30 20:08           ` Anna Schumaker
2024-10-30 20:11           ` Anna Schumaker

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=ZxK73l2yAOcLe_jl@kernel.org \
    --to=snitzer@kernel.org \
    --cc=anna@kernel.org \
    --cc=jlayton@kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trondmy@hammerspace.com \
    /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.