[Bug 228335] [patch] virtio indirect descriptors should use contiguous memory

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Fri May 18 14:46:10 UTC 2018


            Bug ID: 228335
           Summary: [patch] virtio indirect descriptors should use
                    contiguous memory
           Product: Base System
           Version: 11.1-RELEASE
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: kern
          Assignee: bugs at FreeBSD.org
          Reporter: nreilly at blackberry.com

virtio is allocating the standard descriptors using contigmalloc() but the
indirect descriptors using malloc(). This doesn't normally cause an issue
because the malloc() happens to get contiguous memory, but I was using a
different memory allocator and ran into this issue. In my scenario then the
virtio network driver caused QEMU on Linux to exit. 

Index: sys/dev/virtio/virtqueue.c
--- sys/dev/virtio/virtqueue.c  (revision 330873)
+++ sys/dev/virtio/virtqueue.c  (working copy)
@@ -249,7 +249,8 @@
        for (i = 0; i < vq->vq_nentries; i++) {
                dxp = &vq->vq_descx[i];

-               dxp->indirect = malloc(size, M_DEVBUF, M_NOWAIT);
+               dxp->indirect = contigmalloc(size, M_DEVBUF, M_NOWAIT,
+                   0, 0xFFFFFFFFUL, PAGE_SIZE, 0);
                if (dxp->indirect == NULL) {
                        device_printf(dev, "cannot allocate indirect list\n");
                        return (ENOMEM);
@@ -274,7 +275,7 @@
                if (dxp->indirect == NULL)

-               free(dxp->indirect, M_DEVBUF);
+               contigfree(dxp->indirect, vq->vq_indirect_mem_size, M_DEVBUF);
                dxp->indirect = NULL;
                dxp->indirect_paddr = 0;

You are receiving this mail because:
You are the assignee for the bug.

More information about the freebsd-bugs mailing list