git: af14713d49fd - main - Support run-time configuration of the PIPE_MINDIRECT threshold. PIPE_MINDIRECT determines at what (blocking) write size one-copy optimizations are applied in pipe(2) I/O. That threshold hasn't been tuned since the 1990s when this code was originally committed, and allowing run-time reconfiguration will make it easier to assess whether contemporary microarchitectures would prefer a different threshold.
Robert Watson
rwatson at FreeBSD.org
Sat Apr 24 19:05:07 UTC 2021
The branch main has been updated by rwatson:
URL: https://cgit.FreeBSD.org/src/commit/?id=af14713d49fdb30c84969588f6e5cb66d65dc4c4
commit af14713d49fdb30c84969588f6e5cb66d65dc4c4
Author: Robert Watson <rwatson at FreeBSD.org>
AuthorDate: 2021-01-02 16:42:28 +0000
Commit: Robert Watson <rwatson at FreeBSD.org>
CommitDate: 2021-04-24 19:04:28 +0000
Support run-time configuration of the PIPE_MINDIRECT threshold.
PIPE_MINDIRECT determines at what (blocking) write size one-copy
optimizations are applied in pipe(2) I/O. That threshold hasn't
been tuned since the 1990s when this code was originally
committed, and allowing run-time reconfiguration will make it
easier to assess whether contemporary microarchitectures would
prefer a different threshold.
(On our local RPi4 baords, the 8k default would ideally be at least
32k, but it's not clear how generalizable that observation is.)
MFC after: 3 weeks
Reviewers: jrtc27, arichardson
Differential Revision: https://reviews.freebsd.org/D29819
---
sys/kern/sys_pipe.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
index 558337794950..fee9d95e179c 100644
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -209,6 +209,7 @@ static int pipefragretry;
static int pipeallocfail;
static int piperesizefail;
static int piperesizeallowed = 1;
+static long pipe_mindirect = PIPE_MINDIRECT;
SYSCTL_LONG(_kern_ipc, OID_AUTO, maxpipekva, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
&maxpipekva, 0, "Pipe KVA limit");
@@ -263,6 +264,29 @@ pipeinit(void *dummy __unused)
KASSERT(pipedev_ino > 0, ("pipe dev inode not initialized"));
}
+static int
+sysctl_handle_pipe_mindirect(SYSCTL_HANDLER_ARGS)
+{
+ int error = 0;
+ long tmp_pipe_mindirect = pipe_mindirect;
+
+ error = sysctl_handle_long(oidp, &tmp_pipe_mindirect, arg2, req);
+ if (error != 0 || req->newptr == NULL)
+ return (error);
+
+ /*
+ * Don't allow pipe_mindirect to be set so low that we violate
+ * atomicity requirements.
+ */
+ if (tmp_pipe_mindirect <= PIPE_BUF)
+ return (EINVAL);
+ pipe_mindirect = tmp_pipe_mindirect;
+ return (0);
+}
+SYSCTL_OID(_kern_ipc, OID_AUTO, pipe_mindirect, CTLTYPE_LONG | CTLFLAG_RW,
+ &pipe_mindirect, 0, sysctl_handle_pipe_mindirect, "L",
+ "Minimum write size triggering VM optimization");
+
static int
pipe_zone_ctor(void *mem, int size, void *arg, int flags)
{
@@ -1140,8 +1164,8 @@ pipe_write(struct file *fp, struct uio *uio, struct ucred *active_cred,
* away on us.
*/
if (uio->uio_segflg == UIO_USERSPACE &&
- uio->uio_iov->iov_len >= PIPE_MINDIRECT &&
- wpipe->pipe_buffer.size >= PIPE_MINDIRECT &&
+ uio->uio_iov->iov_len >= pipe_mindirect &&
+ wpipe->pipe_buffer.size >= pipe_mindirect &&
(fp->f_flag & FNONBLOCK) == 0) {
error = pipe_direct_write(wpipe, uio);
if (error != 0)
More information about the dev-commits-src-main
mailing list