Patchwork [3.5.y.z,extended,stable] Patch "virtio: force vring descriptors to be allocated from" has been added to staging queue

mail settings
Submitter Herton Ronaldo Krzesinski
Date Jan. 8, 2013, 8:56 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/210497/
State New
Headers show


Herton Ronaldo Krzesinski - Jan. 8, 2013, 8:56 p.m.
This is a note to let you know that I have just added a patch titled

    virtio: force vring descriptors to be allocated from

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From 4c08598a6cdf9aad46730478c303142d0256fd45 Mon Sep 17 00:00:00 2001
From: Will Deacon <>
Date: Fri, 19 Oct 2012 14:03:33 +0100
Subject: [PATCH 01/27] virtio: force vring descriptors to be allocated from

commit b92b1b89a33c172c075edccf6afb0edc41d851fd upstream.

Virtio devices may attempt to add descriptors to a virtqueue from atomic
context using GFP_ATOMIC allocation. This is problematic because such
allocations can fall outside of the lowmem mapping, causing virt_to_phys
to report bogus physical addresses which are subsequently passed to
userspace via the buffers for the virtual device.

This patch masks out __GFP_HIGH and __GFP_HIGHMEM from the requested
flags when allocating descriptors for a virtqueue. If an atomic
allocation is requested and later fails, we will return -ENOSPC which
will be handled by the driver.

Cc: Sasha Levin <>
Signed-off-by: Will Deacon <>
Signed-off-by: Rusty Russell <>
Signed-off-by: Herton Ronaldo Krzesinski <>
 drivers/virtio/virtio_ring.c |    7 +++++++
 1 file changed, 7 insertions(+)



diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 5aa43c3..52bfd07 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -132,6 +132,13 @@  static int vring_add_indirect(struct vring_virtqueue *vq,
 	unsigned head;
 	int i;

+	/*
+	 * We require lowmem mappings for the descriptors because
+	 * otherwise virt_to_phys will give us bogus addresses in the
+	 * virtqueue.
+	 */
+	gfp &= ~(__GFP_HIGHMEM | __GFP_HIGH);
 	desc = kmalloc((out + in) * sizeof(struct vring_desc), gfp);
 	if (!desc)
 		return -ENOMEM;