From owner-dev-commits-src-all@freebsd.org Wed Sep 8 00:39:00 2021 Return-Path: Delivered-To: dev-commits-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 482A067126C; Wed, 8 Sep 2021 00:39:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4H43D41YZ0z4jc2; Wed, 8 Sep 2021 00:39:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 151F01C5CD; Wed, 8 Sep 2021 00:39:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 1880cxdQ090721; Wed, 8 Sep 2021 00:38:59 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 1880cxvH090720; Wed, 8 Sep 2021 00:38:59 GMT (envelope-from git) Date: Wed, 8 Sep 2021 00:38:59 GMT Message-Id: <202109080038.1880cxvH090720@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Rick Macklem Subject: git: c5128c48df3c - main - VOP_COPY_FILE_RANGE: Add a COPY_FILE_RANGE_TIMEO1SEC flag MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: rmacklem X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: c5128c48df3c2f3828432aff2ea536bb9c887e14 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for all branches of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Sep 2021 00:39:00 -0000 The branch main has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=c5128c48df3c2f3828432aff2ea536bb9c887e14 commit c5128c48df3c2f3828432aff2ea536bb9c887e14 Author: Rick Macklem AuthorDate: 2021-09-08 00:35:26 +0000 Commit: Rick Macklem CommitDate: 2021-09-08 00:35:26 +0000 VOP_COPY_FILE_RANGE: Add a COPY_FILE_RANGE_TIMEO1SEC flag Although it is not specified in the RFCs, the concept that the NFSv4 server should reply to an RPC request within a reasonable time is accepted practice within the NFSv4 community. Without this patch, the NFSv4.2 server attempts to reply to a Copy operation within 1second by limiting the copy to vfs.nfs.maxcopyrange bytes (default 10Mbytes). This is crude at best, given the large variation in I/O subsystem performance. This patch adds a kernel only flag COPY_FILE_RANGE_TIMEO1SEC that the NFSv4.2 can specify, which tells VOP_COPY_FILE_RANGE() to return after approximately 1 second with a partial result and implements this in vn_generic_copy_file_range(), used by vop_stdcopyfilerange(). Modifying the NFSv4.2 server to set this flag will be done in a separate patch. Also under consideration is exposing the COPY_FILE_RANGE_TIMEO1SEC to userland for use on the FreeBSD copy_file_range(2) syscall. MFC after: 2 weeks Reviewed by: khng Differential Revision: https://reviews.freebsd.org/D31829 --- sys/kern/vfs_vnops.c | 31 +++++++++++++++++++++++++++++-- sys/sys/vnode.h | 4 ++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index bf1270dc8ad8..93d5a9e6b127 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -3162,6 +3162,7 @@ vn_generic_copy_file_range(struct vnode *invp, off_t *inoffp, size_t copylen, len, rem, savlen; char *dat; long holein, holeout; + struct timespec curts, endts; holein = holeout = 0; savlen = len = *lenp; @@ -3258,7 +3259,15 @@ vn_generic_copy_file_range(struct vnode *invp, off_t *inoffp, * in the inner loop where the data copying is done. * Note that some file systems such as NFSv3, NFSv4.0 and NFSv4.1 may * support holes on the server, but do not support FIOSEEKHOLE. + * The kernel flag COPY_FILE_RANGE_TIMEO1SEC is used to indicate + * that this function should return after 1second with a partial + * completion. */ + if ((flags & COPY_FILE_RANGE_TIMEO1SEC) != 0) { + getnanouptime(&endts); + endts.tv_sec++; + } else + timespecclear(&endts); holetoeof = eof = false; while (len > 0 && error == 0 && !eof && interrupted == 0) { endoff = 0; /* To shut up compilers. */ @@ -3327,8 +3336,17 @@ vn_generic_copy_file_range(struct vnode *invp, off_t *inoffp, *inoffp += xfer; *outoffp += xfer; len -= xfer; - if (len < savlen) + if (len < savlen) { interrupted = sig_intr(); + if (timespecisset(&endts) && + interrupted == 0) { + getnanouptime(&curts); + if (timespeccmp(&curts, + &endts, >=)) + interrupted = + EINTR; + } + } } } copylen = MIN(len, endoff - startoff); @@ -3391,8 +3409,17 @@ vn_generic_copy_file_range(struct vnode *invp, off_t *inoffp, *outoffp += xfer; copylen -= xfer; len -= xfer; - if (len < savlen) + if (len < savlen) { interrupted = sig_intr(); + if (timespecisset(&endts) && + interrupted == 0) { + getnanouptime(&curts); + if (timespeccmp(&curts, + &endts, >=)) + interrupted = + EINTR; + } + } } } xfer = blksize; diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 61c6a13010f6..81f3f3d5489c 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -616,6 +616,10 @@ typedef void vop_getpages_iodone_t(void *, vm_page_t *, int, int); #define VN_OPEN_NAMECACHE 0x00000004 #define VN_OPEN_INVFS 0x00000008 +/* copy_file_range kernel flags */ +#define COPY_FILE_RANGE_KFLAGS 0xff000000 +#define COPY_FILE_RANGE_TIMEO1SEC 0x01000000 /* Return after 1sec. */ + /* * Public vnode manipulation functions. */