qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] Revert "vhost-user: Attempt to fix a race with


From: Prerna Saxena
Subject: Re: [Qemu-devel] [PATCH] Revert "vhost-user: Attempt to fix a race with set_mem_table."
Date: Mon, 15 Aug 2016 13:40:16 +0000

Ack. You beat me to the patch by a few minutes :)

Prerna





On 15/08/16 7:05 pm, "Michael S. Tsirkin" <address@hidden> wrote:

>This reverts commit 28ed5ef16384f12500abd3647973ee21b03cbe23.
>
>I still think it's the right thing to do, but
>tests have been failing sporadically.
>
>Revert for now, and hope to fix it before the release.
>
>Cc: Prerna Saxena <address@hidden>
>Cc: Peter Maydell <address@hidden>
>Cc: Marc-André Lureau <address@hidden>
>Signed-off-by: Michael S. Tsirkin <address@hidden>
>---
> hw/virtio/vhost-user.c | 127 +++++++++++++++++++++++--------------------------
> 1 file changed, 60 insertions(+), 67 deletions(-)
>
>diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
>index 1a7d53c..b57454a 100644
>--- a/hw/virtio/vhost-user.c
>+++ b/hw/virtio/vhost-user.c
>@@ -263,6 +263,66 @@ static int vhost_user_set_log_base(struct vhost_dev *dev, 
>uint64_t base,
>     return 0;
> }
> 
>+static int vhost_user_set_mem_table(struct vhost_dev *dev,
>+                                    struct vhost_memory *mem)
>+{
>+    int fds[VHOST_MEMORY_MAX_NREGIONS];
>+    int i, fd;
>+    size_t fd_num = 0;
>+    bool reply_supported = virtio_has_feature(dev->protocol_features,
>+                                              
>VHOST_USER_PROTOCOL_F_REPLY_ACK);
>+
>+    VhostUserMsg msg = {
>+        .request = VHOST_USER_SET_MEM_TABLE,
>+        .flags = VHOST_USER_VERSION,
>+    };
>+
>+    if (reply_supported) {
>+        msg.flags |= VHOST_USER_NEED_REPLY_MASK;
>+    }
>+
>+    for (i = 0; i < dev->mem->nregions; ++i) {
>+        struct vhost_memory_region *reg = dev->mem->regions + i;
>+        ram_addr_t offset;
>+        MemoryRegion *mr;
>+
>+        assert((uintptr_t)reg->userspace_addr == reg->userspace_addr);
>+        mr = memory_region_from_host((void *)(uintptr_t)reg->userspace_addr,
>+                                     &offset);
>+        fd = memory_region_get_fd(mr);
>+        if (fd > 0) {
>+            msg.payload.memory.regions[fd_num].userspace_addr = 
>reg->userspace_addr;
>+            msg.payload.memory.regions[fd_num].memory_size  = 
>reg->memory_size;
>+            msg.payload.memory.regions[fd_num].guest_phys_addr = 
>reg->guest_phys_addr;
>+            msg.payload.memory.regions[fd_num].mmap_offset = offset;
>+            assert(fd_num < VHOST_MEMORY_MAX_NREGIONS);
>+            fds[fd_num++] = fd;
>+        }
>+    }
>+
>+    msg.payload.memory.nregions = fd_num;
>+
>+    if (!fd_num) {
>+        error_report("Failed initializing vhost-user memory map, "
>+                     "consider using -object memory-backend-file share=on");
>+        return -1;
>+    }
>+
>+    msg.size = sizeof(msg.payload.memory.nregions);
>+    msg.size += sizeof(msg.payload.memory.padding);
>+    msg.size += fd_num * sizeof(VhostUserMemoryRegion);
>+
>+    if (vhost_user_write(dev, &msg, fds, fd_num) < 0) {
>+        return -1;
>+    }
>+
>+    if (reply_supported) {
>+        return process_message_reply(dev, msg.request);
>+    }
>+
>+    return 0;
>+}
>+
> static int vhost_user_set_vring_addr(struct vhost_dev *dev,
>                                      struct vhost_vring_addr *addr)
> {
>@@ -477,73 +537,6 @@ static int vhost_user_get_features(struct vhost_dev *dev, 
>uint64_t *features)
>     return vhost_user_get_u64(dev, VHOST_USER_GET_FEATURES, features);
> }
> 
>-static int vhost_user_set_mem_table(struct vhost_dev *dev,
>-                                    struct vhost_memory *mem)
>-{
>-    int fds[VHOST_MEMORY_MAX_NREGIONS];
>-    int i, fd;
>-    size_t fd_num = 0;
>-    uint64_t features;
>-    bool reply_supported = virtio_has_feature(dev->protocol_features,
>-                                              
>VHOST_USER_PROTOCOL_F_REPLY_ACK);
>-
>-    VhostUserMsg msg = {
>-        .request = VHOST_USER_SET_MEM_TABLE,
>-        .flags = VHOST_USER_VERSION,
>-    };
>-
>-    if (reply_supported) {
>-        msg.flags |= VHOST_USER_NEED_REPLY_MASK;
>-    }
>-
>-    for (i = 0; i < dev->mem->nregions; ++i) {
>-        struct vhost_memory_region *reg = dev->mem->regions + i;
>-        ram_addr_t offset;
>-        MemoryRegion *mr;
>-
>-        assert((uintptr_t)reg->userspace_addr == reg->userspace_addr);
>-        mr = memory_region_from_host((void *)(uintptr_t)reg->userspace_addr,
>-                                     &offset);
>-        fd = memory_region_get_fd(mr);
>-        if (fd > 0) {
>-            msg.payload.memory.regions[fd_num].userspace_addr
>-                                             = reg->userspace_addr;
>-            msg.payload.memory.regions[fd_num].memory_size  = 
>reg->memory_size;
>-            msg.payload.memory.regions[fd_num].guest_phys_addr
>-                                             = reg->guest_phys_addr;
>-            msg.payload.memory.regions[fd_num].mmap_offset = offset;
>-            assert(fd_num < VHOST_MEMORY_MAX_NREGIONS);
>-            fds[fd_num++] = fd;
>-        }
>-    }
>-
>-    msg.payload.memory.nregions = fd_num;
>-
>-    if (!fd_num) {
>-        error_report("Failed initializing vhost-user memory map, "
>-                     "consider using -object memory-backend-file share=on");
>-        return -1;
>-    }
>-
>-    msg.size = sizeof(msg.payload.memory.nregions);
>-    msg.size += sizeof(msg.payload.memory.padding);
>-    msg.size += fd_num * sizeof(VhostUserMemoryRegion);
>-
>-    vhost_user_write(dev, &msg, fds, fd_num);
>-
>-    if (reply_supported) {
>-        return process_message_reply(dev, msg.request);
>-    } else {
>-        /* Note: It is (yet) unknown when the client application has finished
>-         * remapping the GPA.
>-         * Attempt to prevent a race by sending a command that requires a 
>reply.
>-         */
>-        vhost_user_get_features(dev, &features);
>-    }
>-
>-    return 0;
>-}
>-
> static int vhost_user_set_owner(struct vhost_dev *dev)
> {
>     VhostUserMsg msg = {
>-- 
>MST

reply via email to

[Prev in Thread] Current Thread [Next in Thread]