Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Jan 2013 11:27:33 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        Rick Macklem <rmacklem@freebsd.org>, bde@freebsd.org, fs@freebsd.org
Subject:   Re: [PATCH] More time cleanups in the NFS code
Message-ID:  <201301241127.33274.jhb@freebsd.org>
In-Reply-To: <20130124184756.O1180@besplex.bde.org>
References:  <201301231338.39056.jhb@freebsd.org> <20130124184756.O1180@besplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday, January 24, 2013 3:15:26 am Bruce Evans wrote:
> On Wed, 23 Jan 2013, John Baldwin wrote:
> 
> > This patch removes all calls to get*time().  Most of them it replaces with
> > time_uptime (especially ones that are attempting to handle time intervals for
> > which time_uptime is far better suited than time_second).  One specific case
> > it replaces with nanotime() as suggested by Bruce previously.  A few of the
> > timestamps were not used (nd_starttime and the curtime in the lease expiry
> > function).
> 
> Looks good.
> 
> I didn't check for completeness.
> 
> oldnfs might benefit from use of NFSD_MONOSEC.
> 
> Both nfs's might benefit from use of NFS_REALSEC (doesn't exist but
> would be #defined as time_second if acceses to this global are atomic
> (which I think is implied by its existence)).

Accesses should be atomic.

> > Index: fs/nfs/nfs_commonkrpc.c
> > ===================================================================
> > --- fs/nfs/nfs_commonkrpc.c	(revision 245742)
> > +++ fs/nfs/nfs_commonkrpc.c	(working copy)
> > @@ -459,18 +459,17 @@
> > {
> > 	struct nfs_feedback_arg *nf = (struct nfs_feedback_arg *) arg;
> > 	struct nfsmount *nmp = nf->nf_mount;
> > -	struct timeval now;
> > +	time_t now;
> >
> > -	getmicrouptime(&now);
> > -
> > 	switch (type) {
> > 	case FEEDBACK_REXMIT2:
> > 	case FEEDBACK_RECONNECT:
> > -		if (nf->nf_lastmsg + nmp->nm_tprintf_delay < now.tv_sec) {
> > +		now = NFSD_MONOSEC;
> 
> It's confusing for 'now' to be in mono-time.

'now' is all relative anyway. :)

> > +		if (nf->nf_lastmsg + nmp->nm_tprintf_delay < now) {
> > 			nfs_down(nmp, nf->nf_td,
> > 			    "not responding", 0, NFSSTA_TIMEO);
> > 			nf->nf_tprintfmsg = TRUE;
> > -			nf->nf_lastmsg = now.tv_sec;
> > +			nf->nf_lastmsg = now;
> > 		}
> > 		break;
> 
> It's safest but probably unnecessary (uncritical) to copy the (not quite
> volatile) variable NFSD_MONOSEC to a local variable, since it is used
> twice.
> 
> Now I don't like the NFSD_MONOSEC macro.  It looks like a constant, but
> is actually a not quite volatile variable.

I have a separate patch to make both time_second and time_uptime volatile.
The global 'ticks' should also be made volatile for the same reason.

> > @@ -4684,11 +4682,9 @@
> > 		} else
> > 			error = EPERM;
> > 		if (error == NFSERR_DELAY) {
> > -			NFSGETNANOTIME(&mytime);
> > -			if (((u_int32_t)mytime.tv_sec - starttime) >
> > -			    NFS_REMOVETIMEO &&
> > -			    ((u_int32_t)mytime.tv_sec - starttime) <
> > -			    100000)
> > +			mytime = NFSD_MONOSEC;
> > +			if (((u_int32_t)mytime - starttime) > NFS_REMOVETIMEO &&
> > +			    ((u_int32_t)mytime - starttime) < 100000)
> > 				break;
> > 			/* Sleep for a short period of time */
> > 			(void) nfs_catnap(PZERO, 0, "nfsremove");
> 
> Should use time_t for all times in seconds and no casts to u_int32_t
> (unless the times are put in data structures -- then 64-bit times are
> wasteful).

Ah, for some reason I had thought starttime was stuffed into a packet or some
such.  It is not, so I redid this as:

@@ -4650,8 +4648,7 @@ out:
 APPLESTATIC void
 nfsd_recalldelegation(vnode_t vp, NFSPROC_T *p)
 {
-	struct timespec mytime;
-	int32_t starttime;
+	time_t starttime, elapsed;
 	int error;
 
 	/*
@@ -4675,8 +4672,7 @@ nfsd_recalldelegation(vnode_t vp, NFSPROC_T *p)
 	 * Now, call nfsrv_checkremove() in a loop while it returns
 	 * NFSERR_DELAY. Return upon any other error or when timed out.
 	 */
-	NFSGETNANOTIME(&mytime);
-	starttime = (u_int32_t)mytime.tv_sec;
+	starttime = NFSD_MONOSEC;
 	do {
 		if (NFSVOPLOCK(vp, LK_EXCLUSIVE) == 0) {
 			error = nfsrv_checkremove(vp, 0, p);
@@ -4684,11 +4680,8 @@ nfsd_recalldelegation(vnode_t vp, NFSPROC_T *p)
 		} else
 			error = EPERM;
 		if (error == NFSERR_DELAY) {
-			NFSGETNANOTIME(&mytime);
-			if (((u_int32_t)mytime.tv_sec - starttime) >
-			    NFS_REMOVETIMEO &&
-			    ((u_int32_t)mytime.tv_sec - starttime) <
-			    100000)
+			elapsed = NFSD_MONOSEC - starttime;
+			if (elapsed > NFS_REMOVETIMEO && elapsed < 100000)
 				break;
 			/* Sleep for a short period of time */
 			(void) nfs_catnap(PZERO, 0, "nfsremove");


-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201301241127.33274.jhb>