Module Name: src
Committed By: mlelstv
Date: Sun Oct 7 12:00:07 UTC 2018
Modified Files:
src/sys/dev: vnd.c
Log Message:
Use IO_DIRECT for file I/O to reduce buffer cache contention.
Restore old behaviour to flush pages only when usage exceeds 1MB.
No longer use PGO_SYNCIO, regular writes to the device do not require
the data to reach stable storage, the DIOCCACHESYNC ioctl is used
for that.
To generate a diff of this commit:
cvs rdiff -u -r1.268 -r1.269 src/sys/dev/vnd.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/vnd.c
diff -u src/sys/dev/vnd.c:1.268 src/sys/dev/vnd.c:1.269
--- src/sys/dev/vnd.c:1.268 Sun Oct 7 11:54:14 2018
+++ src/sys/dev/vnd.c Sun Oct 7 12:00:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: vnd.c,v 1.268 2018/10/07 11:54:14 mlelstv Exp $ */
+/* $NetBSD: vnd.c,v 1.269 2018/10/07 12:00:07 mlelstv Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.268 2018/10/07 11:54:14 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.269 2018/10/07 12:00:07 mlelstv Exp $");
#if defined(_KERNEL_OPT)
#include "opt_vnd.h"
@@ -159,6 +159,7 @@ struct vndxfer {
(MAKEDISKDEV(major((dev)), vndunit((dev)), RAW_PART))
#define VND_MAXPENDING(vnd) ((vnd)->sc_maxactive * 4)
+#define VND_MAXPAGES(vnd) (1024 * 1024 / PAGE_SIZE)
static void vndclear(struct vnd_softc *, int);
@@ -810,12 +811,22 @@ handle_with_rdwr(struct vnd_softc *vnd,
bp->b_error =
vn_rdwr(doread ? UIO_READ : UIO_WRITE,
vp, bp->b_data, len, offset, UIO_SYSSPACE,
- IO_ADV_ENCODE(POSIX_FADV_NOREUSE), vnd->sc_cred, &resid, NULL);
+ IO_ADV_ENCODE(POSIX_FADV_NOREUSE) | IO_DIRECT,
+ vnd->sc_cred, &resid, NULL);
bp->b_resid = resid;
+ /*
+ * Avoid caching too many pages, the vnd user
+ * is usually a filesystem and caches itself.
+ * We need some amount of caching to not hinder
+ * read-ahead and write-behind operations.
+ */
mutex_enter(vp->v_interlock);
- (void) VOP_PUTPAGES(vp, 0, 0,
- PGO_ALLPAGES | PGO_CLEANIT | PGO_FREE | PGO_SYNCIO);
+ if (vp->v_uobj.uo_npages > VND_MAXPAGES(vnd))
+ (void) VOP_PUTPAGES(vp, 0, 0,
+ PGO_ALLPAGES | PGO_CLEANIT | PGO_FREE);
+ else
+ mutex_exit(vp->v_interlock);
fstrans_done(vp->v_mount);