On Wed, Feb 07, 2018 at 08:03:27PM +0100, Andrew Jones wrote: > Before 031755db ("arm: enable vmalloc") we were allocating the > queue with two pages of zeroed memory using memalign(), but > afterwards with only one uninitialized page using alloc_pages(). > We can keep alloc_pages(), but we need two pages, and they need > to be clean, otherwise QEMU gets angry when we attempt to migrate > a unit test as the used vring index is corrupted by the page > allocator's next page link. > > Signed-off-by: Andrew Jones <drjones@xxxxxxxxxx> > --- > lib/virtio-mmio.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/lib/virtio-mmio.c b/lib/virtio-mmio.c > index e5e8f660b5cd..cbc9e6217bbe 100644 > --- a/lib/virtio-mmio.c > +++ b/lib/virtio-mmio.c > @@ -55,7 +55,8 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, > > vq = calloc(1, sizeof(*vq)); > assert(VIRTIO_MMIO_QUEUE_SIZE_MIN <= 2*PAGE_SIZE); > - queue = alloc_pages(1); > + queue = alloc_pages(2); Whoops. As usual my brain engages right after posting patches. The 1 was ok here because alloc_pages() takes an order, not a number. The memset below is still key to avoid the migration bug though. I'll send a v2 of this patch - mostly to fix the commit message. drew > + memset(queue, 0, 2*PAGE_SIZE); > assert(vq && queue); > > writel(index, vm_dev->base + VIRTIO_MMIO_QUEUE_SEL); > -- > 2.13.6 >