Add a new flag, XIOF_VMLINEAR, which requires that the buffer being mapped
authorMatthew Dillon <dillon@dragonflybsd.org>
Fri, 29 Jun 2007 05:09:15 +0000 (05:09 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Fri, 29 Jun 2007 05:09:15 +0000 (05:09 +0000)
be contiguous within a single VM object.

sys/kern/kern_xio.c
sys/sys/xio.h

index 03442d2..9fa7e92 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/kern_xio.c,v 1.13 2007/06/29 00:18:05 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_xio.c,v 1.14 2007/06/29 05:09:15 dillon Exp $
  */
 /*
  * Kernel XIO interface.  An initialized XIO is basically a collection of
@@ -94,6 +94,7 @@ xio_init_ubuf(xio_t xio, void *ubase, size_t ubytes, int flags)
 {
     vm_offset_t addr;
     vm_page_t m;
+    vm_page_t m0;
     int error;
     int i;
     int n;
@@ -112,6 +113,7 @@ xio_init_ubuf(xio_t xio, void *ubase, size_t ubytes, int flags)
        xio->xio_pages = xio->xio_internal_pages;
        if ((n = PAGE_SIZE - xio->xio_offset) > ubytes)
            n = ubytes;
+       m0 = NULL;
        for (i = 0; n && i < XIO_INTERNAL_PAGES; ++i) {
            m = vm_fault_page_quick(addr, vmprot, &error);
            if (m == NULL)
@@ -122,6 +124,19 @@ xio_init_ubuf(xio_t xio, void *ubase, size_t ubytes, int flags)
            if ((n = ubytes) > PAGE_SIZE)
                n = PAGE_SIZE;
            addr += PAGE_SIZE;
+
+           /*
+            * Check linearity, used by syslink to memory map DMA buffers.
+            */
+           if (flags & XIOF_VMLINEAR) {
+               if (i == 0) {
+                   m0 = m;
+               } else 
+               if (m->object != m0->object || m->pindex != m0->pindex + i) {
+                   error = EINVAL;
+                   break;
+               }
+           }
        }
        xio->xio_npages = i;
 
index 6105412..7c129a9 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/sys/xio.h,v 1.8 2007/06/29 00:18:03 dillon Exp $
+ * $DragonFly: src/sys/sys/xio.h,v 1.9 2007/06/29 05:09:14 dillon Exp $
  */
 
 /*
@@ -84,6 +84,7 @@ typedef struct xio *xio_t;
 
 #define XIOF_READ      0x0001
 #define XIOF_WRITE     0x0002
+#define XIOF_VMLINEAR  0x0004  /* must be VM object linear */
 
 #endif