75a234904f
This change adds the necessary files for the qemu package to be built for Debian. This review follows the same approach used on the virt/libvirt [1]. The base version selected comes from the Debian archive [2] since the salsa-debian [3] version was not fully compatible with stx build tools. The full upstream build was quite long (time) and big (size) so we patched the Debian files with debian_patches to drop unnecessary packages, that is, packages that starlingx does not need. The patches dir will contain source code patches required for stx-qemu, that is, the code that was earlier added on top of 3.0.0 qemu release to add StarlingX required functionalities. The work done on this change is simply porting the code changes, copying it and doing the minimum required updates when it is needed. The list of commits follow, where the "-" character indicates that the commit was dropped now that we are based on 5.2: d3400d STX: virtio-serial: don't touch virtqueue if vm is stopped 71dc08 STX: Modify live migration auto-converge threshold 9be81b STX: Suspend/Resume for VMs with PCIPT+Virtio 876a3c STX: realtime uses mlock instead of mlockall 007444 STX: qemu dpdk custom config 3f6344 STX: add libdl dbda73 STX: qemu: add compile define for CONFIG_DPDK 626bfd STX: qemu: add -enable-dpdk runtime flag 79ea26 STX: qemu dpdk changes for openvswitch dpdk 9c83db STX: migration thread affinity and priority qmp e7fbe5 STX: Add support statement to -help output -48de9c STX: Changes for running on CentOS -32b6f0 Upstream: Workaround: make sure vdev->vq[i].inuse never goes below 0 -246b26 virtio: Return true from virtio_queue_empty if broken [1] https://review.opendev.org/c/starlingx/integ/+/863561 [2] https://snapshot.debian.org/archive/debian/20221109T211529Z/pool/main/q/qemu/ [3] https://salsa.debian.org/qemu-team/qemu/-/tree/debian-bullseye Test Plan: PASS: Build the qemu packages PASS: Build iso with qemu packages PASS: Bootstrap Debian ISO on AIO-SX PASS: Ensure qemu packages are installed (apt list --installed) PASS: Lock/Unlock AIO-SX * * Future tests regarding the libvirt/qemu runtime features will be done once all the pieces are in place in the ISO. Depends-On: https://review.opendev.org/c/starlingx/root/+/864942 Story: 2010317 Task: 46390 Signed-off-by: Rafael Falcao <rafael.vieirafalcao@windriver.com> Co-Authored-by: Thales Elero Cervi <thaleselero.cervi@windriver.com> Change-Id: I424debf7eb24c024ba82a490cda746dbd5af0019
96 lines
3.4 KiB
Diff
96 lines
3.4 KiB
Diff
From ad19f7aad9e2ff9a007eddbd9a19b61a9c1af769 Mon Sep 17 00:00:00 2001
|
|
From: Jim Somerville <Jim.Somerville@windriver.com
|
|
Date: Fri, 26 Apr 2019 17:41:04 -0300
|
|
Subject: [PATCH] STX: Suspend/Resume for VMs with PCIPT+Virtio
|
|
|
|
When we have a Passthrough or a SR-IOV device, the plug/unplug of these
|
|
devices causes the guest memory map to change.
|
|
|
|
When the vhost code in qemu detects that the guest memory map changed,
|
|
it verifies that the virtio vring mappings into its own address space
|
|
did not change and sends the vhost backend the VHOST_SET_MEM_TABLE
|
|
message so that the backend can update its mapping based on the new
|
|
guest memory map.
|
|
|
|
If this guest memory map change happens after the virtio device has
|
|
been initialized and started, we get into the situation where ports
|
|
are brought down as part of the VHOST_SET_MEM_TABLE message handling
|
|
and has nothing to restart the device.
|
|
|
|
The root cause of this issue was that the mappings for the vring was
|
|
changing when we get a new VHOST_USER_SET_MEM_TABLE message and we
|
|
were trying to restart the device with the old vring mapping.
|
|
|
|
The correct fix is to send a VHOST_SET_VRING_ADDR message from qemu
|
|
which will force the mapping to be recalculated based on the new
|
|
memory map.
|
|
|
|
Signed-off-by: Jim Somerville <Jim.Somerville@windriver.com>
|
|
[ Trimmed the shortlog ]
|
|
Signed-off-by: Rafael Falcao <Rafael.VieiraFalcao@windriver.com>
|
|
---
|
|
hw/virtio/vhost.c | 26 +++++++++++++++++++++++++-
|
|
1 file changed, 25 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
|
|
index 614ccc2bcb..05c045925a 100644
|
|
--- a/hw/virtio/vhost.c
|
|
+++ b/hw/virtio/vhost.c
|
|
@@ -61,6 +61,10 @@ bool vhost_has_free_slot(void)
|
|
return slots_limit > used_memslots;
|
|
}
|
|
|
|
+static int vhost_virtqueue_set_addr(struct vhost_dev *dev,
|
|
+ struct vhost_virtqueue *vq,
|
|
+ unsigned idx, bool enable_log);
|
|
+
|
|
static void vhost_dev_sync_region(struct vhost_dev *dev,
|
|
MemoryRegionSection *section,
|
|
uint64_t mfirst, uint64_t mlast,
|
|
@@ -448,6 +452,21 @@ static void vhost_begin(MemoryListener *listener)
|
|
dev->n_tmp_sections = 0;
|
|
}
|
|
|
|
+static void vhost_update_backend_ring_mappings(struct vhost_dev *dev)
|
|
+{
|
|
+ int i,r;
|
|
+
|
|
+ if(dev->vhost_ops->backend_type != VHOST_BACKEND_TYPE_USER) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ for (i = 0; i < dev->nvqs; ++i) {
|
|
+ r = vhost_virtqueue_set_addr(dev, dev->vqs + i, i, dev->log_enabled);
|
|
+ assert(r >= 0);
|
|
+ }
|
|
+ return;
|
|
+}
|
|
+
|
|
static void vhost_commit(MemoryListener *listener)
|
|
{
|
|
struct vhost_dev *dev = container_of(listener, struct vhost_dev,
|
|
@@ -524,7 +543,7 @@ static void vhost_commit(MemoryListener *listener)
|
|
if (r < 0) {
|
|
VHOST_OPS_DEBUG("vhost_set_mem_table failed");
|
|
}
|
|
- goto out;
|
|
+ goto vring_mapping;
|
|
}
|
|
log_size = vhost_get_log_size(dev);
|
|
/* We allocate an extra 4K bytes to log,
|
|
@@ -543,6 +562,11 @@ static void vhost_commit(MemoryListener *listener)
|
|
vhost_dev_log_resize(dev, log_size);
|
|
}
|
|
|
|
+vring_mapping:
|
|
+ /* For vhost-user backend, update the vring mappings after we sent a new
|
|
+ * guest memory map. */
|
|
+ vhost_update_backend_ring_mappings(dev);
|
|
+
|
|
out:
|
|
/* Deref the old list of sections, this must happen _after_ the
|
|
* vhost_set_mem_table to ensure the client isn't still using the
|
|
--
|
|
2.25.1
|
|
|