Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Sep 2014 11:33:42 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r271384 - in projects/sendfile/sys: kern ufs/ufs
Message-ID:  <201409101133.s8ABXgPI000645@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Wed Sep 10 11:33:42 2014
New Revision: 271384
URL: http://svnweb.freebsd.org/changeset/base/271384

Log:
  - Make default implementation of VOP_GETPAGES_ASYNC() a wrapper around
    VOP_GETPAGES(). This emulates asynchronous operation on all filesystems,
    that use their own vop_getpages(), namely: nfs, smbfs, fuse, zfs.
  - Opt-in UFS to use true asynchronous vop_stdgetpages_async().
  
  Note: other filesystems, that use default pager, need also to opt-in
  after some testing.
  
  Sponsored by:	Netflix
  Sponsored by:	Nginx, Inc.

Modified:
  projects/sendfile/sys/kern/vfs_default.c
  projects/sendfile/sys/ufs/ufs/ufs_vnops.c

Modified: projects/sendfile/sys/kern/vfs_default.c
==============================================================================
--- projects/sendfile/sys/kern/vfs_default.c	Wed Sep 10 11:27:52 2014	(r271383)
+++ projects/sendfile/sys/kern/vfs_default.c	Wed Sep 10 11:33:42 2014	(r271384)
@@ -83,6 +83,7 @@ static int vop_stdset_text(struct vop_se
 static int vop_stdunset_text(struct vop_unset_text_args *ap);
 static int vop_stdget_writecount(struct vop_get_writecount_args *ap);
 static int vop_stdadd_writecount(struct vop_add_writecount_args *ap);
+static int vop_stdgetpages_async_emulate(struct vop_getpages_async_args *ap);
 
 /*
  * This vnode table stores what we want to do if the filesystem doesn't
@@ -111,7 +112,7 @@ struct vop_vector default_vnodeops = {
 	.vop_close =		VOP_NULL,
 	.vop_fsync =		VOP_NULL,
 	.vop_getpages =		vop_stdgetpages,
-	.vop_getpages_async =	vop_stdgetpages_async,
+	.vop_getpages_async =	vop_stdgetpages_async_emulate,
 	.vop_getwritemount = 	vop_stdgetwritemount,
 	.vop_inactive =		VOP_NULL,
 	.vop_ioctl =		VOP_ENOTTY,
@@ -739,6 +740,18 @@ vop_stdgetpages_async(struct vop_getpage
 	    ap->a_count, ap->a_reqpage, ap->a_vop_getpages_iodone, ap->a_arg);
 }
 
+static int
+vop_stdgetpages_async_emulate(struct vop_getpages_async_args *ap)
+{
+	int error;
+
+	error = VOP_GETPAGES(ap->a_vp, ap->a_m, ap->a_count, ap->a_reqpage,
+	    ap->a_offset);
+	vm_page_xunbusy(ap->a_m[ap->a_reqpage]);
+	ap->a_vop_getpages_iodone(ap->a_arg);
+	return (error);
+}
+
 int
 vop_stdkqfilter(struct vop_kqfilter_args *ap)
 {

Modified: projects/sendfile/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- projects/sendfile/sys/ufs/ufs/ufs_vnops.c	Wed Sep 10 11:27:52 2014	(r271383)
+++ projects/sendfile/sys/ufs/ufs/ufs_vnops.c	Wed Sep 10 11:33:42 2014	(r271384)
@@ -2745,6 +2745,7 @@ struct vop_vector ufs_vnodeops = {
 	.vop_close =		ufs_close,
 	.vop_create =		ufs_create,
 	.vop_getattr =		ufs_getattr,
+	.vop_getpages_async =	vop_stdgetpages_async,
 	.vop_inactive =		ufs_inactive,
 	.vop_ioctl =		ufs_ioctl,
 	.vop_link =		ufs_link,



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