svn commit: r271384 - in projects/sendfile/sys: kern ufs/ufs

Gleb Smirnoff glebius at FreeBSD.org
Wed Sep 10 11:33:43 UTC 2014


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,


More information about the svn-src-projects mailing list