commit 203e4bd5d18afa8bd7762ac3e4cb78573ec8e556
Author: Wei Liu <liuw@liuw.name>
Date:   Thu Jul 14 14:12:59 2011 +0800

    virtio_ring: write machine addr into sg list instead of pseudo
    physical addr.

diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index b0043fb..9dffa40 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -22,6 +22,8 @@
 #include <linux/device.h>
 #include <linux/slab.h>
 
+#include <xen/page.h>
+
 /* virtio guest is communicating with a virtual "device" that actually runs on
  * a host processor.  Memory barriers are used to control SMP effects. */
 #ifdef CONFIG_SMP
@@ -40,6 +42,8 @@
 #define virtio_wmb() wmb()
 #endif
 
+#define DEBUG
+
 #ifdef DEBUG
 /* For development, we want to crash whenever the ring is screwed. */
 #define BAD_RING(_vq, fmt, args...)				\
@@ -166,6 +170,7 @@ int virtqueue_add_buf_gfp(struct virtqueue *_vq,
 	struct vring_virtqueue *vq = to_vvq(_vq);
 	unsigned int i, avail, uninitialized_var(prev);
 	int head;
+	xpaddr_t desc_addr;
 
 	START_USE(vq);
 
@@ -200,14 +205,16 @@ int virtqueue_add_buf_gfp(struct virtqueue *_vq,
 	head = vq->free_head;
 	for (i = vq->free_head; out; i = vq->vring.desc[i].next, out--) {
 		vq->vring.desc[i].flags = VRING_DESC_F_NEXT;
-		vq->vring.desc[i].addr = sg_phys(sg);
+		desc_addr.paddr = sg_phys(sg);
+		vq->vring.desc[i].addr = phys_to_machine(desc_addr).maddr;
 		vq->vring.desc[i].len = sg->length;
 		prev = i;
 		sg++;
 	}
 	for (; in; i = vq->vring.desc[i].next, in--) {
 		vq->vring.desc[i].flags = VRING_DESC_F_NEXT|VRING_DESC_F_WRITE;
-		vq->vring.desc[i].addr = sg_phys(sg);
+		desc_addr.paddr = sg_phys(sg);
+		vq->vring.desc[i].addr = phys_to_machine(desc_addr).maddr;
 		vq->vring.desc[i].len = sg->length;
 		prev = i;
 		sg++;
