qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 1/2] dataplane: simplify indirect descriptor read
@ 2015-10-28 15:48 Michael S. Tsirkin
  2015-10-28 15:48 ` [Qemu-devel] [PATCH 2/2] dataplane: support non-contigious s/g Michael S. Tsirkin
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2015-10-28 15:48 UTC (permalink / raw)
  To: qemu-devel; +Cc: Igor Mammedov, qemu-block, Stefan Hajnoczi

Use address_space_read to make sure we handle the case of an indirect
descriptor crossing DIMM boundary correctly.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---

Warning: compile-tested only.

 hw/virtio/dataplane/vring.c | 28 ++++++++++++++++++----------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c
index 68f1994..0b92fcf 100644
--- a/hw/virtio/dataplane/vring.c
+++ b/hw/virtio/dataplane/vring.c
@@ -257,6 +257,21 @@ static void copy_in_vring_desc(VirtIODevice *vdev,
     host->next = virtio_lduw_p(vdev, &guest->next);
 }
 
+static bool read_vring_desc(VirtIODevice *vdev,
+                            hwaddr guest,
+                            struct vring_desc *host)
+{
+    if (address_space_read(&address_space_memory, guest, MEMTXATTRS_UNSPECIFIED,
+                           (uint8_t *)host, sizeof *host)) {
+        return false;
+    }
+    host->addr = virtio_tswap64(vdev, host->addr);
+    host->len = virtio_tswap32(vdev, host->len);
+    host->flags = virtio_tswap16(vdev, host->flags);
+    host->next = virtio_tswap16(vdev, host->next);
+    return true;
+}
+
 /* This is stolen from linux/drivers/vhost/vhost.c. */
 static int get_indirect(VirtIODevice *vdev, Vring *vring,
                         VirtQueueElement *elem, struct vring_desc *indirect)
@@ -284,23 +299,16 @@ static int get_indirect(VirtIODevice *vdev, Vring *vring,
     }
 
     do {
-        struct vring_desc *desc_ptr;
-        MemoryRegion *mr;
-
         /* Translate indirect descriptor */
-        desc_ptr = vring_map(&mr,
-                             indirect->addr + found * sizeof(desc),
-                             sizeof(desc), false);
-        if (!desc_ptr) {
-            error_report("Failed to map indirect descriptor "
+        if (!read_vring_desc(vdev, indirect->addr + found * sizeof(desc),
+                             &desc)) {
+            error_report("Failed to read indirect descriptor "
                          "addr %#" PRIx64 " len %zu",
                          (uint64_t)indirect->addr + found * sizeof(desc),
                          sizeof(desc));
             vring->broken = true;
             return -EFAULT;
         }
-        copy_in_vring_desc(vdev, desc_ptr, &desc);
-        memory_region_unref(mr);
 
         /* Ensure descriptor has been loaded before accessing fields */
         barrier(); /* read_barrier_depends(); */
-- 
MST

^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2015-11-03 11:25 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-10-28 15:48 [Qemu-devel] [PATCH 1/2] dataplane: simplify indirect descriptor read Michael S. Tsirkin
2015-10-28 15:48 ` [Qemu-devel] [PATCH 2/2] dataplane: support non-contigious s/g Michael S. Tsirkin
2015-10-29 10:30   ` Igor Mammedov
2015-10-29 10:28 ` [Qemu-devel] [PATCH 1/2] dataplane: simplify indirect descriptor read Igor Mammedov
2015-10-30 16:59   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2015-10-29 10:29 ` [Qemu-devel] " Igor Mammedov
2015-10-30 16:59 ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2015-11-02 17:42 ` Stefan Hajnoczi
2015-11-02 17:43 ` Stefan Hajnoczi
2015-11-03 11:25   ` Igor Mammedov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).