Re: [PATCH 4/4] ceph: make session->s_cap_ttl atomic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Yep, I think you're right, Alex.. don't need the atomics here, either.

On Fri, 13 Jan 2012, Alex Elder wrote:

> The ceph_mds_session s_cap_ttl field is 64 bits that can be accessed
> concurrently and is used for synchronization.  Change it to be an
> atomic64_t to make guarantee it is operated on atomicly.
> 
> Signed-off-by: Alex Elder <elder@xxxxxxxxxxxxx>
> ---
>  fs/ceph/caps.c       |    2 +-
>  fs/ceph/dir.c        |    2 +-
>  fs/ceph/mds_client.c |   25 +++++++++++++++----------
>  fs/ceph/mds_client.h |    2 +-
>  4 files changed, 18 insertions(+), 13 deletions(-)
> 
> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
> index fd240e3..9b87e48 100644
> --- a/fs/ceph/caps.c
> +++ b/fs/ceph/caps.c
> @@ -643,7 +643,7 @@ static int __cap_is_valid(struct ceph_cap *cap)
>  
>  	spin_lock(&cap->session->s_gen_ttl_lock);
>  	gen = atomic_read(&cap->session->s_cap_gen);
> -	ttl = cap->session->s_cap_ttl;
> +	ttl = atomic64_read(&cap->session->s_cap_ttl);
>  	spin_unlock(&cap->session->s_gen_ttl_lock);

spinlcok

>  
>  	if (cap->cap_gen < gen || time_after_eq(jiffies, ttl)) {
> diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
> index da9427d..a182907 100644
> --- a/fs/ceph/dir.c
> +++ b/fs/ceph/dir.c
> @@ -979,7 +979,7 @@ static int dentry_lease_is_valid(struct dentry
> *dentry)
>  
>  		spin_lock(&s->s_gen_ttl_lock);
>  		gen = atomic_read(&s->s_cap_gen);
> -		ttl = s->s_cap_ttl;
> +		ttl = atomic64_read(&s->s_cap_ttl);
>  		spin_unlock(&s->s_gen_ttl_lock);

spin

>  
>  		if (di->lease_gen == gen &&
> diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
> index cd567c3..a1ecd1a 100644
> --- a/fs/ceph/mds_client.c
> +++ b/fs/ceph/mds_client.c
> @@ -400,7 +400,7 @@ static struct ceph_mds_session
> *register_session(struct ceph_mds_client *mdsc,
>  
>  	spin_lock_init(&s->s_gen_ttl_lock);
>  	atomic_set(&s->s_cap_gen, 0);
> -	s->s_cap_ttl = jiffies - 1;
> +	atomic64_set(&s->s_cap_ttl, jiffies - 1);

no sync needed

>  
>  	spin_lock_init(&s->s_cap_lock);
>  	s->s_renew_requested = 0;
> @@ -1044,9 +1044,11 @@ static int send_renew_caps(struct ceph_mds_client
> *mdsc,
>  {
>  	struct ceph_msg *msg;
>  	int state;
> +	unsigned long cap_ttl;
>  
> -	if (time_after_eq(jiffies, session->s_cap_ttl) &&
> -	    time_after_eq(session->s_cap_ttl, session->s_renew_requested))
> +	cap_ttl = atomic64_read(&session->s_cap_ttl);
> +	if (time_after_eq(jiffies, cap_ttl) &&
> +	    time_after_eq(cap_ttl, session->s_renew_requested))

this is under session mutex, i think.  if not, spin

>  		pr_info("mds%d caps stale\n", session->s_mds);
>  	session->s_renew_requested = jiffies;
>  
> @@ -1079,15 +1081,18 @@ static void renewed_caps(struct ceph_mds_client
> *mdsc,
>  {
>  	int was_stale;
>  	int wake = 0;
> +	unsigned long cap_ttl;
>  
>  	spin_lock(&session->s_cap_lock);
> -	was_stale = is_renew && time_after_eq(jiffies, session->s_cap_ttl);
> +	cap_ttl = atomic64_read(&session->s_cap_ttl);
> +	was_stale = is_renew && time_after_eq(jiffies, cap_ttl);
>  
> -	session->s_cap_ttl = session->s_renew_requested +
> -		mdsc->mdsmap->m_session_timeout*HZ;
> +	cap_ttl = session->s_renew_requested +
> +			mdsc->mdsmap->m_session_timeout*HZ;
> +	atomic64_set(&session->s_cap_ttl, cap_ttl);

spinlock is ok

>  
>  	if (was_stale) {
> -		if (time_before(jiffies, session->s_cap_ttl)) {
> +		if (time_before(jiffies, cap_ttl)) {
>  			pr_info("mds%d caps renewed\n", session->s_mds);
>  			wake = 1;
>  		} else {
> @@ -1095,8 +1100,8 @@ static void renewed_caps(struct ceph_mds_client
> *mdsc,
>  		}
>  	}
>  	dout("renewed_caps mds%d ttl now %lu, was %s, now %s\n",
> -	     session->s_mds, session->s_cap_ttl, was_stale ? "stale" :
> "fresh",
> -	     time_before(jiffies, session->s_cap_ttl) ? "stale" : "fresh");
> +	     session->s_mds, cap_ttl, was_stale ? "stale" : "fresh",
> +	     time_before(jiffies, cap_ttl) ? "stale" : "fresh");
>  	spin_unlock(&session->s_cap_lock);
>  
>  	if (wake)
> @@ -2329,7 +2334,7 @@ static void handle_session(struct ceph_mds_session
> *session,
>  			session->s_mds);
>  		spin_lock(&session->s_gen_ttl_lock);
>  		atomic_inc(&session->s_cap_gen);
> -		session->s_cap_ttl = jiffies - 1;
> +		atomic64_set(&session->s_cap_ttl, jiffies - 1);

session mutex

>  		spin_unlock(&session->s_gen_ttl_lock);
>  		send_renew_caps(mdsc, session);
>  		break;
> diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
> index 20ca17e..f3c32fb 100644
> --- a/fs/ceph/mds_client.h
> +++ b/fs/ceph/mds_client.h
> @@ -120,7 +120,7 @@ struct ceph_mds_session {
>  	/* protected by s_gen_ttl_lock */
>  	spinlock_t        s_gen_ttl_lock;
>  	atomic_t          s_cap_gen;  /* inc each time we get mds stale msg */
> -	unsigned long     s_cap_ttl;  /* when session caps expire */
> +	atomic64_t        s_cap_ttl;  /* when session caps expire */
>  
>  	/* protected by s_cap_lock */
>  	spinlock_t        s_cap_lock;
> -- 
> 1.7.5.4
> 
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux