[Midnightbsd-cvs] src [9016] trunk/sys: merge from freebsd vn_io_fault_pgmove

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Thu Sep 29 21:53:27 EDT 2016


Revision: 9016
          http://svnweb.midnightbsd.org/src/?rev=9016
Author:   laffer1
Date:     2016-09-29 21:53:27 -0400 (Thu, 29 Sep 2016)
Log Message:
-----------
merge from freebsd vn_io_fault_pgmove

Modified Paths:
--------------
    trunk/sys/kern/vfs_vnops.c
    trunk/sys/sys/vnode.h

Modified: trunk/sys/kern/vfs_vnops.c
===================================================================
--- trunk/sys/kern/vfs_vnops.c	2016-09-30 01:52:44 UTC (rev 9015)
+++ trunk/sys/kern/vfs_vnops.c	2016-09-30 01:53:27 UTC (rev 9016)
@@ -1083,6 +1083,45 @@
 	return (error);
 }
 
+int
+vn_io_fault_pgmove(vm_page_t ma[], vm_offset_t offset, int xfersize,
+    struct uio *uio)
+{
+	struct thread *td;
+	vm_offset_t iov_base;
+	int cnt, pgadv;
+
+	td = curthread;
+	if ((td->td_pflags & TDP_UIOHELD) == 0 ||
+	    uio->uio_segflg != UIO_USERSPACE)
+		return (uiomove_fromphys(ma, offset, xfersize, uio));
+
+	KASSERT(uio->uio_iovcnt == 1, ("uio_iovcnt %d", uio->uio_iovcnt));
+	cnt = xfersize > uio->uio_resid ? uio->uio_resid : xfersize;
+	iov_base = (vm_offset_t)uio->uio_iov->iov_base;
+	switch (uio->uio_rw) {
+	case UIO_WRITE:
+		pmap_copy_pages(td->td_ma, iov_base & PAGE_MASK, ma,
+		    offset, cnt);
+		break;
+	case UIO_READ:
+		pmap_copy_pages(ma, offset, td->td_ma, iov_base & PAGE_MASK,
+		    cnt);
+		break;
+	}
+	pgadv = ((iov_base + cnt) >> PAGE_SHIFT) - (iov_base >> PAGE_SHIFT);
+	td->td_ma += pgadv;
+	KASSERT(td->td_ma_cnt >= pgadv, ("consumed pages %d %d", td->td_ma_cnt,
+	    pgadv));
+	td->td_ma_cnt -= pgadv;
+	uio->uio_iov->iov_base = (char *)(iov_base + cnt);
+	uio->uio_iov->iov_len -= cnt;
+	uio->uio_resid -= cnt;
+	uio->uio_offset += cnt;
+	return (0);
+}
+
+
 /*
  * File table truncate routine.
  */

Modified: trunk/sys/sys/vnode.h
===================================================================
--- trunk/sys/sys/vnode.h	2016-09-30 01:52:44 UTC (rev 9015)
+++ trunk/sys/sys/vnode.h	2016-09-30 01:53:27 UTC (rev 9016)
@@ -690,6 +690,8 @@
 	    struct vnode **rvp);
 
 int	vn_io_fault_uiomove(char *data, int xfersize, struct uio *uio);
+int	vn_io_fault_pgmove(vm_page_t ma[], vm_offset_t offset, int xfersize,
+	    struct uio *uio);
 
 #define	vn_rangelock_unlock(vp, cookie)					\
 	rangelock_unlock(&(vp)->v_rl, (cookie), VI_MTX(vp))



More information about the Midnightbsd-cvs mailing list