All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benny Halevy <bhalevy@panasas.com>
To: Fred Isaman <iisaman@netapp.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 04/18] pnfs-submit: change layout state seqlock to a spinlock
Date: Thu, 11 Nov 2010 17:00:16 +0200	[thread overview]
Message-ID: <4CDC0500.90805@panasas.com> (raw)
In-Reply-To: <1288884151-11128-5-git-send-email-iisaman@netapp.com>

On 2010-11-04 17:22, Fred Isaman wrote:
> This prepares for future changes, where the layout state needs
> to change atomically with several other variables.  In particular,
> it will need to know if lo->segs is empty.  Moreover, the
> layoutstateid is not really a read-mostly structure, as it is
> written on each LAYOUTGET.
> 
> Signed-off-by: Fred Isaman <iisaman@netapp.com>
> ---
>  fs/nfs/callback_proc.c |    8 +++---
>  fs/nfs/nfs4xdr.c       |    2 +
>  fs/nfs/pnfs.c          |   55 ++++++++++++++---------------------------------
>  fs/nfs/pnfs.h          |    4 +--
>  4 files changed, 24 insertions(+), 45 deletions(-)
> 
> diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
> index 84c5a1b..3e022a8 100644
> --- a/fs/nfs/callback_proc.c
> +++ b/fs/nfs/callback_proc.c
> @@ -135,12 +135,11 @@ static bool
>  pnfs_is_next_layout_stateid(const struct pnfs_layout_hdr *lo,
>  			    const nfs4_stateid stateid)
>  {
> -	int seqlock;
>  	bool res;
>  	u32 oldseqid, newseqid;
>  
> -	do {
> -		seqlock = read_seqbegin(&lo->seqlock);
> +	spin_lock(&lo->inode->i_lock);
> +	{
>  		oldseqid = be32_to_cpu(lo->stateid.stateid.seqid);
>  		newseqid = be32_to_cpu(stateid.stateid.seqid);
>  		res = !memcmp(lo->stateid.stateid.other,
> @@ -158,7 +157,8 @@ pnfs_is_next_layout_stateid(const struct pnfs_layout_hdr *lo,
>  			if (res)
>  				res = (newseqid == 1);
>  		}
> -	} while (read_seqretry(&lo->seqlock, seqlock));
> +	}
> +	spin_unlock(&lo->inode->i_lock);
>  
>  	return res;
>  }
> diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
> index 6d9ef2b..b71a482 100644
> --- a/fs/nfs/nfs4xdr.c
> +++ b/fs/nfs/nfs4xdr.c
> @@ -1915,7 +1915,9 @@ encode_layoutreturn(struct xdr_stream *xdr,
>  		p = reserve_space(xdr, 16 + NFS4_STATEID_SIZE);
>  		p = xdr_encode_hyper(p, args->range.offset);
>  		p = xdr_encode_hyper(p, args->range.length);
> +		spin_lock(&args->inode->i_lock);
>  		pnfs_copy_layout_stateid(&stateid, NFS_I(args->inode)->layout);
> +		spin_unlock(&args->inode->i_lock);
>  		p = xdr_encode_opaque_fixed(p, &stateid.data,
>  					    NFS4_STATEID_SIZE);
>  		p = reserve_space(xdr, 4);
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 4e5c68b..01ecb95 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -456,7 +456,7 @@ pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo,
>  	nfs4_stateid *old = &lo->stateid;
>  	bool overwrite = false;
>  
> -	write_seqlock(&lo->seqlock);
> +	assert_spin_locked(&lo->inode->i_lock);
>  	if (!test_bit(NFS_LAYOUT_STATEID_SET, &lo->state) ||
>  	    memcmp(old->stateid.other, new->stateid.other, sizeof(new->stateid.other)))
>  		overwrite = true;
> @@ -470,54 +470,34 @@ pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo,
>  	}
>  	if (overwrite)
>  		memcpy(&old->stateid, &new->stateid, sizeof(new->stateid));
> -	write_sequnlock(&lo->seqlock);
> -}
> -
> -static void
> -pnfs_layout_from_open_stateid(struct pnfs_layout_hdr *lo,
> -			      struct nfs4_state *state)
> -{
> -	int seq;
> -
> -	dprintk("--> %s\n", __func__);
> -	write_seqlock(&lo->seqlock);
> -	do {
> -		seq = read_seqbegin(&state->seqlock);
> -		memcpy(lo->stateid.data, state->stateid.data,
> -		       sizeof(state->stateid.data));
> -	} while (read_seqretry(&state->seqlock, seq));
> -	set_bit(NFS_LAYOUT_STATEID_SET, &lo->state);
> -	write_sequnlock(&lo->seqlock);
> -	dprintk("<-- %s\n", __func__);
>  }
>  
>  /* Layoutreturn may use an invalid stateid, just copy what is there */
>  void pnfs_copy_layout_stateid(nfs4_stateid *dst, struct pnfs_layout_hdr *lo)
>  {
> -	int seq;
> -
> -	do {
> -		seq = read_seqbegin(&lo->seqlock);
> -		memcpy(dst->data, lo->stateid.data, sizeof(lo->stateid.data));
> -	} while (read_seqretry(&lo->seqlock, seq));
> +	assert_spin_locked(&lo->inode->i_lock);
> +	memcpy(dst->data, lo->stateid.data, sizeof(lo->stateid.data));

This function is just redundant now.
Let's just open code its two users.

Benny

>  }
>  
>  void
>  pnfs_get_layout_stateid(nfs4_stateid *dst, struct pnfs_layout_hdr *lo,
>  			struct nfs4_state *open_state)
>  {
> -	int seq;
> -
>  	dprintk("--> %s\n", __func__);
> -	do {
> -		seq = read_seqbegin(&lo->seqlock);
> -		if (!test_bit(NFS_LAYOUT_STATEID_SET, &lo->state)) {
> -			/* This will trigger retry of the read */
> -			pnfs_layout_from_open_stateid(lo, open_state);
> -		} else
> -			memcpy(dst->data, lo->stateid.data,
> -			       sizeof(lo->stateid.data));
> -	} while (read_seqretry(&lo->seqlock, seq));
> +	spin_lock(&lo->inode->i_lock);
> +	if (!test_bit(NFS_LAYOUT_STATEID_SET, &lo->state)) {
> +		int seq;
> +
> +		do {
> +			seq = read_seqbegin(&open_state->seqlock);
> +			memcpy(dst->data, open_state->stateid.data,
> +			       sizeof(open_state->stateid.data));
> +		} while (read_seqretry(&open_state->seqlock, seq));
> +		set_bit(NFS_LAYOUT_STATEID_SET, &lo->state);
> +	} else
> +		memcpy(dst->data, lo->stateid.data,
> +		       sizeof(lo->stateid.data));
> +	spin_unlock(&lo->inode->i_lock);
>  	dprintk("<-- %s\n", __func__);
>  }
>  
> @@ -791,7 +771,6 @@ alloc_init_layout_hdr(struct inode *ino)
>  	lo->refcount = 1;
>  	INIT_LIST_HEAD(&lo->layouts);
>  	INIT_LIST_HEAD(&lo->segs);
> -	seqlock_init(&lo->seqlock);
>  	lo->inode = ino;
>  	return lo;
>  }
> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
> index 000acf0..de4eaa8 100644
> --- a/fs/nfs/pnfs.h
> +++ b/fs/nfs/pnfs.h
> @@ -96,7 +96,6 @@ struct pnfs_layout_hdr {
>  	struct list_head	layouts;   /* other client layouts */
>  	struct list_head	segs;      /* layout segments list */
>  	int			roc_iomode;/* return on close iomode, 0=none */
> -	seqlock_t		seqlock;   /* Protects the stateid */
>  	nfs4_stateid		stateid;
>  	unsigned long		state;
>  	struct rpc_cred		*cred;     /* layoutcommit credential */
> @@ -224,9 +223,8 @@ static inline int lo_fail_bit(u32 iomode)
>  
>  static inline void pnfs_invalidate_layout_stateid(struct pnfs_layout_hdr *lo)
>  {
> -	write_seqlock(&lo->seqlock);
> +	assert_spin_locked(&lo->inode->i_lock);
>  	clear_bit(NFS_LAYOUT_STATEID_SET, &lo->state);
> -	write_sequnlock(&lo->seqlock);
>  }
>  
>  static inline void get_lseg(struct pnfs_layout_segment *lseg)

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

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-04 15:22 [PATCH 00/18] rewrite of CB_LAYOUTRECALL and layoutstate code Fred Isaman
2010-11-04 15:22 ` [PATCH 01/18] NFSv4.1: Callback share session between ops Fred Isaman
2010-11-10 13:37   ` Benny Halevy
2010-11-10 13:41     ` [PATCH] SQUASHME: pnfs-submit: fixups for nfsv4.1 callbacks Benny Halevy
2010-11-10 14:53       ` Fred Isaman
2010-11-04 15:22 ` [PATCH 02/18] pnfs-submit: change pnfs_layout_segment refcounting from kref to atomic_t Fred Isaman
2010-11-04 15:22 ` [PATCH 03/18] pnfs-submit: remove _pnfs_can_return_lseg call from pnfs_clear_lseg_list Fred Isaman
2010-11-10 14:35   ` Benny Halevy
2010-11-10 14:46     ` Fred Isaman
2010-11-11  7:00       ` Benny Halevy
2010-11-11 13:52         ` Fred Isaman
2010-11-11 14:39           ` Benny Halevy
2010-11-04 15:22 ` [PATCH 04/18] pnfs-submit: change layout state seqlock to a spinlock Fred Isaman
2010-11-11 15:00   ` Benny Halevy [this message]
2010-11-11 15:09     ` Fred Isaman
2010-11-04 15:22 ` [PATCH 05/18] pnfs-submit: layoutreturn' rpc_call_op functions need to handle bulk returns Fred Isaman
2010-11-11 15:01   ` Benny Halevy
2010-11-04 15:22 ` [PATCH 06/18] pnfs_submit: nfs4_layoutreturn_release should not reference results Fred Isaman
2010-11-11 15:16   ` Benny Halevy
2010-11-04 15:22 ` [PATCH 07/18] pnfs-submit: reorganize struct cb_layoutrecallargs Fred Isaman
2010-11-04 15:22 ` [PATCH 08/18] pnfs-submit: rename lo->state to lo->plh_flags Fred Isaman
2010-11-04 15:22 ` [PATCH 09/18] pnfs-submit: change pnfs_layout_hdr refcount to atomic_t Fred Isaman
2010-11-04 15:22 ` [PATCH 10/18] pnfs-submit: argument to should_free_lseg changed from lseg to range Fred Isaman
2010-11-04 15:22 ` [PATCH 11/18] pnfs-submit: remove unnecessary field lgp->status Fred Isaman
2010-11-04 15:22 ` [PATCH 12/18] pnfs-submit: remove RPC_ASSASSINATED(task) checks Fred Isaman
2010-11-04 15:22 ` [PATCH 13/18] pnfs-submit: rewrite of layout state handling and cb_layoutrecall Fred Isaman
2010-11-04 15:22 ` [PATCH 14/18] pnfs-submit: increase number of outstanding CB_LAYOUTRECALLS we can handle Fred Isaman
2010-11-04 15:22 ` [PATCH 15/18] pnfs-submit: roc add layoutreturn op to close compound Fred Isaman
2010-11-04 15:22 ` [PATCH 16/18] pnfs-submit refactor layoutcommit xdr structures Fred Isaman
2010-11-04 15:22 ` [PATCH 17/18] pnfs-submit refactor pnfs_layoutcommit_setup Fred Isaman
2010-11-04 15:22 ` [PATCH 18/18] pnfs_submit: roc add layoutcommit op to close compound Fred Isaman

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=4CDC0500.90805@panasas.com \
    --to=bhalevy@panasas.com \
    --cc=iisaman@netapp.com \
    --cc=linux-nfs@vger.kernel.org \
    /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.