aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2021-05-18 23:17:58 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2021-06-01 01:29:03 +0000
commit4ce25ce4776fd4b4d62aaa11beee69d74192612e (patch)
tree5453fc40eef6da3513b9edeca8c6192913fdb97d
parent6b6758888f42f078217a39ca2aa816427eaf3967 (diff)
nfsd: Reduce the callback timeout to 800msec
Recent discussion on the nfsv4@ietf.org mailing list confirmed that an NFSv4 server should reply to an RPC in less than 1second. If an NFSv4 RPC requires a delegation be recalled, the server will attempt a CB_RECALL callback. If the client is not responsive, the RPC reply will be delayed until the callback times out. Without this patch, the timeout is set to 4 seconds (set in ticks, but used as seconds), resulting in the RPC reply taking over 4sec. This patch redefines the constant as being in milliseconds and it implements that for a value of 800msec, to ensure the RPC reply is sent in less than 1second. This patch only affects mounts from clients when delegations are enabled on the server and the client is unresponsive to callbacks. (cherry picked from commit fc0dc94029df8150301b925bda690b20d9d0bcbf)
-rw-r--r--sys/fs/nfs/nfs.h2
-rw-r--r--sys/fs/nfs/nfs_commonkrpc.c10
2 files changed, 7 insertions, 5 deletions
diff --git a/sys/fs/nfs/nfs.h b/sys/fs/nfs/nfs.h
index 44b6042a2ce7..272b8dbfee22 100644
--- a/sys/fs/nfs/nfs.h
+++ b/sys/fs/nfs/nfs.h
@@ -50,7 +50,7 @@
#define NFS_MAXRCVTIMEO 60 /* 1 minute in seconds */
#define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/
#define NFS_MAXREXMIT 100 /* Stop counting after this many */
-#define NFSV4_CALLBACKTIMEO (2 * NFS_HZ) /* Timeout in ticks */
+#define NFSV4_CALLBACKTIMEO 800 /* Timeout in msec */
#define NFSV4_CALLBACKRETRY 5 /* Number of retries before failure */
#define NFSV4_SLOTS 64 /* Number of slots, fore channel */
#define NFSV4_CBSLOTS 8 /* Number of slots, back channel */
diff --git a/sys/fs/nfs/nfs_commonkrpc.c b/sys/fs/nfs/nfs_commonkrpc.c
index 49c68da45a69..04ef04955ce0 100644
--- a/sys/fs/nfs/nfs_commonkrpc.c
+++ b/sys/fs/nfs/nfs_commonkrpc.c
@@ -767,11 +767,13 @@ tryagain:
* use the same xid.
*/
if (nmp == NULL) {
- timo.tv_usec = 0;
- if (clp == NULL)
+ if (clp == NULL) {
timo.tv_sec = NFSV4_UPCALLTIMEO;
- else
- timo.tv_sec = NFSV4_CALLBACKTIMEO;
+ timo.tv_usec = 0;
+ } else {
+ timo.tv_sec = NFSV4_CALLBACKTIMEO / 1000;
+ timo.tv_usec = NFSV4_CALLBACKTIMEO * 1000;
+ }
} else {
if (nrp->nr_sotype != SOCK_DGRAM) {
timo.tv_usec = 0;