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