[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 12/29] postcopy+vhost-user: Split set_mem_table f
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[Qemu-devel] [PATCH v6 12/29] postcopy+vhost-user: Split set_mem_table for postcopy |
Date: |
Wed, 14 Mar 2018 11:56:01 +0000 |
From: "Dr. David Alan Gilbert" <address@hidden>
Split the set_mem_table routines in both qemu and libvhost-user
because the postcopy versions are going to be quite different
once changes in the later patches are added. However, this patch
doesn't produce any functional change, just the split.
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
---
contrib/libvhost-user/libvhost-user.c | 53 ++++++++++++++++++++++++++++++++++
hw/virtio/vhost-user.c | 54 +++++++++++++++++++++++++++++++++++
2 files changed, 107 insertions(+)
diff --git a/contrib/libvhost-user/libvhost-user.c
b/contrib/libvhost-user/libvhost-user.c
index e53b1953df..b2de8ed0a8 100644
--- a/contrib/libvhost-user/libvhost-user.c
+++ b/contrib/libvhost-user/libvhost-user.c
@@ -448,6 +448,55 @@ vu_reset_device_exec(VuDev *dev, VhostUserMsg *vmsg)
return false;
}
+static bool
+vu_set_mem_table_exec_postcopy(VuDev *dev, VhostUserMsg *vmsg)
+{
+ int i;
+ VhostUserMemory *memory = &vmsg->payload.memory;
+ dev->nregions = memory->nregions;
+ /* TODO: Postcopy specific code */
+ DPRINT("Nregions: %d\n", memory->nregions);
+ for (i = 0; i < dev->nregions; i++) {
+ void *mmap_addr;
+ VhostUserMemoryRegion *msg_region = &memory->regions[i];
+ VuDevRegion *dev_region = &dev->regions[i];
+
+ DPRINT("Region %d\n", i);
+ DPRINT(" guest_phys_addr: 0x%016"PRIx64"\n",
+ msg_region->guest_phys_addr);
+ DPRINT(" memory_size: 0x%016"PRIx64"\n",
+ msg_region->memory_size);
+ DPRINT(" userspace_addr 0x%016"PRIx64"\n",
+ msg_region->userspace_addr);
+ DPRINT(" mmap_offset 0x%016"PRIx64"\n",
+ msg_region->mmap_offset);
+
+ dev_region->gpa = msg_region->guest_phys_addr;
+ dev_region->size = msg_region->memory_size;
+ dev_region->qva = msg_region->userspace_addr;
+ dev_region->mmap_offset = msg_region->mmap_offset;
+
+ /* We don't use offset argument of mmap() since the
+ * mapped address has to be page aligned, and we use huge
+ * pages. */
+ mmap_addr = mmap(0, dev_region->size + dev_region->mmap_offset,
+ PROT_READ | PROT_WRITE, MAP_SHARED,
+ vmsg->fds[i], 0);
+
+ if (mmap_addr == MAP_FAILED) {
+ vu_panic(dev, "region mmap error: %s", strerror(errno));
+ } else {
+ dev_region->mmap_addr = (uint64_t)(uintptr_t)mmap_addr;
+ DPRINT(" mmap_addr: 0x%016"PRIx64"\n",
+ dev_region->mmap_addr);
+ }
+
+ close(vmsg->fds[i]);
+ }
+
+ return false;
+}
+
static bool
vu_set_mem_table_exec(VuDev *dev, VhostUserMsg *vmsg)
{
@@ -464,6 +513,10 @@ vu_set_mem_table_exec(VuDev *dev, VhostUserMsg *vmsg)
}
dev->nregions = memory->nregions;
+ if (dev->postcopy_listening) {
+ return vu_set_mem_table_exec_postcopy(dev, vmsg);
+ }
+
DPRINT("Nregions: %d\n", memory->nregions);
for (i = 0; i < dev->nregions; i++) {
void *mmap_addr;
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index 660183d23d..060a339914 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -374,14 +374,68 @@ static int vhost_user_prepare_msg(struct vhost_dev *dev,
VhostUserMemory *mem,
return 0;
}
+static int vhost_user_set_mem_table_postcopy(struct vhost_dev *dev,
+ struct vhost_memory *mem)
+{
+ int fds[VHOST_MEMORY_MAX_NREGIONS];
+ size_t fd_num;
+ bool reply_supported = virtio_has_feature(dev->protocol_features,
+ VHOST_USER_PROTOCOL_F_REPLY_ACK);
+ /* TODO: Add actual postcopy differences */
+ VhostUserMsg msg = {
+ .hdr.request = VHOST_USER_SET_MEM_TABLE,
+ .hdr.flags = VHOST_USER_VERSION,
+ };
+
+ if (reply_supported) {
+ msg.hdr.flags |= VHOST_USER_NEED_REPLY_MASK;
+ }
+
+ if (vhost_user_prepare_msg(dev, &msg.payload.memory, fds) < 0) {
+ error_report("Failed preparing vhost-user memory table msg");
+ return -1;
+ }
+
+ fd_num = msg.payload.memory.nregions;
+
+ if (!fd_num) {
+ error_report("Failed initializing vhost-user memory map, "
+ "consider using -object memory-backend-file share=on");
+ return -1;
+ }
+
+ msg.hdr.size = sizeof(msg.payload.memory.nregions);
+ msg.hdr.size += sizeof(msg.payload.memory.padding);
+ msg.hdr.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);
+ }
+
+ return 0;
+}
+
static int vhost_user_set_mem_table(struct vhost_dev *dev,
struct vhost_memory *mem)
{
+ struct vhost_user *u = dev->opaque;
int fds[VHOST_MEMORY_MAX_NREGIONS];
size_t fd_num;
+ bool do_postcopy = u->postcopy_listen && u->postcopy_fd.handler;
bool reply_supported = virtio_has_feature(dev->protocol_features,
VHOST_USER_PROTOCOL_F_REPLY_ACK);
+ if (do_postcopy) {
+ /* Postcopy has enough differences that it's best done in it's own
+ * version
+ */
+ return vhost_user_set_mem_table_postcopy(dev, mem);
+ }
+
VhostUserMsg msg = {
.hdr.request = VHOST_USER_SET_MEM_TABLE,
.hdr.flags = VHOST_USER_VERSION,
--
2.14.3
- [Qemu-devel] [PATCH v6 04/29] postcopy: Add notifier chain, (continued)
- [Qemu-devel] [PATCH v6 04/29] postcopy: Add notifier chain, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 01/29] migrate: Update ram_block_discard_range for shared, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 05/29] postcopy: Add vhost-user flag for postcopy and check it, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 03/29] postcopy: use UFFDIO_ZEROPAGE only when available, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 08/29] libvhost-user: Open userfaultfd, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 07/29] libvhost-user: Support sending fds back to qemu, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 06/29] vhost-user: Add 'VHOST_USER_POSTCOPY_ADVISE' message, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 09/29] postcopy: Allow registering of fd handler, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 11/29] vhost+postcopy: Transmit 'listen' to slave, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 10/29] vhost+postcopy: Register shared ufd with postcopy, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 12/29] postcopy+vhost-user: Split set_mem_table for postcopy,
Dr. David Alan Gilbert (git) <=
- [Qemu-devel] [PATCH v6 13/29] migration/ram: ramblock_recv_bitmap_test_byte_offset, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 14/29] libvhost-user+postcopy: Register new regions with the ufd, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 15/29] vhost+postcopy: Send address back to qemu, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 16/29] vhost+postcopy: Stash RAMBlock and offset, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 17/29] vhost+postcopy: Helper to send requests to source for shared pages, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 18/29] vhost+postcopy: Resolve client address, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 19/29] postcopy: helper for waking shared, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 20/29] postcopy: postcopy_notify_shared_wake, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 22/29] vhost+postcopy: Call wakeups, Dr. David Alan Gilbert (git), 2018/03/14
- [Qemu-devel] [PATCH v6 21/29] vhost+postcopy: Add vhost waker, Dr. David Alan Gilbert (git), 2018/03/14