All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chuck Lever <chuck.lever@oracle.com>
To: Bruce Fields <bfields@fieldses.org>
Cc: Linux NFS Mailing List <linux-nfs@vger.kernel.org>,
	Olga Kornievskaia <kolga@netapp.com>
Subject: Re: [PATCH] nfsd: don't abort copies early
Date: Thu, 25 Feb 2021 15:28:08 +0000	[thread overview]
Message-ID: <CDFF4F84-1A0C-4E4C-A18B-AC39F715E6D8@oracle.com> (raw)
In-Reply-To: <20210224223349.GB25689@fieldses.org>



> On Feb 24, 2021, at 5:33 PM, Bruce Fields <bfields@fieldses.org> wrote:
> 
> On Wed, Feb 24, 2021 at 07:34:10PM +0000, Chuck Lever wrote:
>> 
>> 
>>> On Feb 24, 2021, at 2:31 PM, J. Bruce Fields <bfields@fieldses.org> wrote:
>>> 
>>> I confess I always have to stare at these comparisons for a minute to
>>> figure out which way they should go.  And the logic in each of these
>>> loops is a little repetitive.
>>> 
>>> Would it be worth creating a little state_expired() helper to work out
>>> the comparison and the new timeout?
>> 
>> That's better, but aren't there already operators on time64_t data objects
>> that can be used for this?
> 
> No idea.

I was thinking of jiffies, I guess. time_before() and time_after().

Checking the definition of time64_t, from include/linux/time64.h:

typedef __s64 time64_t;

Signed, hrm. And no comparison helpers.

I might be a little concerned about wrapping time values. But any
concerns can be addressed in the new common helper state_expired(),
possibly as a subsequent patch.

If you feel it's ready, can you send me the below clean-up as an
official patch with description and SoB?


> --b.
> 
>> 
>> 
>>> --b.
>>> 
>>> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
>>> index 61552e89bd89..00fb3603c29e 100644
>>> --- a/fs/nfsd/nfs4state.c
>>> +++ b/fs/nfsd/nfs4state.c
>>> @@ -5363,6 +5363,22 @@ static bool clients_still_reclaiming(struct nfsd_net *nn)
>>> 	return true;
>>> }
>>> 
>>> +struct laundry_time {
>>> +	time64_t cutoff;
>>> +	time64_t new_timeo;
>>> +};
>>> +
>>> +bool state_expired(struct laundry_time *lt, time64_t last_refresh)
>>> +{
>>> +	time64_t time_remaining;
>>> +
>>> +	if (last_refresh > lt->cutoff)
>>> +		return true;
>>> +	time_remaining = lt->cutoff - last_refresh;
>>> +	lt->new_timeo = min(lt->new_timeo, time_remaining);
>>> +	return false;
>>> +}
>>> +
>>> static time64_t
>>> nfs4_laundromat(struct nfsd_net *nn)
>>> {
>>> @@ -5372,14 +5388,16 @@ nfs4_laundromat(struct nfsd_net *nn)
>>> 	struct nfs4_ol_stateid *stp;
>>> 	struct nfsd4_blocked_lock *nbl;
>>> 	struct list_head *pos, *next, reaplist;
>>> -	time64_t cutoff = ktime_get_boottime_seconds() - nn->nfsd4_lease;
>>> -	time64_t t, new_timeo = nn->nfsd4_lease;
>>> +	struct laundry_time lt = {
>>> +		.cutoff = ktime_get_boottime_seconds() - nn->nfsd4_lease,
>>> +		.new_timeo = nn->nfsd4_lease
>>> +	};
>>> 	struct nfs4_cpntf_state *cps;
>>> 	copy_stateid_t *cps_t;
>>> 	int i;
>>> 
>>> 	if (clients_still_reclaiming(nn)) {
>>> -		new_timeo = 0;
>>> +		lt.new_timeo = 0;
>>> 		goto out;
>>> 	}
>>> 	nfsd4_end_grace(nn);
>>> @@ -5389,7 +5407,7 @@ nfs4_laundromat(struct nfsd_net *nn)
>>> 	idr_for_each_entry(&nn->s2s_cp_stateids, cps_t, i) {
>>> 		cps = container_of(cps_t, struct nfs4_cpntf_state, cp_stateid);
>>> 		if (cps->cp_stateid.sc_type == NFS4_COPYNOTIFY_STID &&
>>> -				cps->cpntf_time < cutoff)
>>> +				state_expired(&lt, cps->cpntf_time))
>>> 			_free_cpntf_state_locked(nn, cps);
>>> 	}
>>> 	spin_unlock(&nn->s2s_cp_lock);
>>> @@ -5397,11 +5415,8 @@ nfs4_laundromat(struct nfsd_net *nn)
>>> 	spin_lock(&nn->client_lock);
>>> 	list_for_each_safe(pos, next, &nn->client_lru) {
>>> 		clp = list_entry(pos, struct nfs4_client, cl_lru);
>>> -		if (clp->cl_time > cutoff) {
>>> -			t = clp->cl_time - cutoff;
>>> -			new_timeo = min(new_timeo, t);
>>> +		if (!state_expired(&lt, clp->cl_time))
>>> 			break;
>>> -		}
>>> 		if (mark_client_expired_locked(clp)) {
>>> 			trace_nfsd_clid_expired(&clp->cl_clientid);
>>> 			continue;
>>> @@ -5418,11 +5433,8 @@ nfs4_laundromat(struct nfsd_net *nn)
>>> 	spin_lock(&state_lock);
>>> 	list_for_each_safe(pos, next, &nn->del_recall_lru) {
>>> 		dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
>>> -		if (dp->dl_time > cutoff) {
>>> -			t = dp->dl_time - cutoff;
>>> -			new_timeo = min(new_timeo, t);
>>> +		if (!state_expired(&lt, clp->cl_time))
>>> 			break;
>>> -		}
>>> 		WARN_ON(!unhash_delegation_locked(dp));
>>> 		list_add(&dp->dl_recall_lru, &reaplist);
>>> 	}
>>> @@ -5438,11 +5450,8 @@ nfs4_laundromat(struct nfsd_net *nn)
>>> 	while (!list_empty(&nn->close_lru)) {
>>> 		oo = list_first_entry(&nn->close_lru, struct nfs4_openowner,
>>> 					oo_close_lru);
>>> -		if (oo->oo_time > cutoff) {
>>> -			t = oo->oo_time - cutoff;
>>> -			new_timeo = min(new_timeo, t);
>>> +		if (!state_expired(&lt, oo->oo_time))
>>> 			break;
>>> -		}
>>> 		list_del_init(&oo->oo_close_lru);
>>> 		stp = oo->oo_last_closed_stid;
>>> 		oo->oo_last_closed_stid = NULL;
>>> @@ -5468,11 +5477,8 @@ nfs4_laundromat(struct nfsd_net *nn)
>>> 	while (!list_empty(&nn->blocked_locks_lru)) {
>>> 		nbl = list_first_entry(&nn->blocked_locks_lru,
>>> 					struct nfsd4_blocked_lock, nbl_lru);
>>> -		if (nbl->nbl_time > cutoff) {
>>> -			t = nbl->nbl_time - cutoff;
>>> -			new_timeo = min(new_timeo, t);
>>> +		if (!state_expired(&lt, oo->oo_time))
>>> 			break;
>>> -		}
>>> 		list_move(&nbl->nbl_lru, &reaplist);
>>> 		list_del_init(&nbl->nbl_list);
>>> 	}
>>> @@ -5485,8 +5491,7 @@ nfs4_laundromat(struct nfsd_net *nn)
>>> 		free_blocked_lock(nbl);
>>> 	}
>>> out:
>>> -	new_timeo = max_t(time64_t, new_timeo, NFSD_LAUNDROMAT_MINTIMEOUT);
>>> -	return new_timeo;
>>> +	return max_t(time64_t, lt.new_timeo, NFSD_LAUNDROMAT_MINTIMEOUT);
>>> }
>>> 
>>> static struct workqueue_struct *laundry_wq;
>> 
>> --
>> Chuck Lever
>> 
>> 

--
Chuck Lever




  reply	other threads:[~2021-02-25 15:29 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-24 18:39 [PATCH] nfsd: don't abort copies early J. Bruce Fields
2021-02-24 18:47 ` Chuck Lever
2021-02-24 19:31 ` J. Bruce Fields
2021-02-24 19:34   ` Chuck Lever
2021-02-24 22:33     ` Bruce Fields
2021-02-25 15:28       ` Chuck Lever [this message]
2021-02-25 15:33         ` Olga Kornievskaia
2021-02-25 15:57           ` Bruce Fields
2021-02-25 18:39             ` Tom Talpey
2021-02-25 19:21               ` Bruce Fields

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=CDFF4F84-1A0C-4E4C-A18B-AC39F715E6D8@oracle.com \
    --to=chuck.lever@oracle.com \
    --cc=bfields@fieldses.org \
    --cc=kolga@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.