On 260805 17:02, Farhan Ali wrote:
On 8/3/2026 7:44 PM, Konstantin Shkolnyy wrote:
Implement zPCI device state migration, consequently enabling migration
of VMs that have emulated PCI devices, whether virtio or not.
Migration is allowed for devices whose function handle has the
FH_SHM_EMUL bit set. For these devices QEMU will save and restore the
state of its zPCI emulator.
This will enable emulated PCI migration starting with s390-ccw-
virtio-11.1.
Passthrough devices will continue to block migration.
Signed-off-by: Konstantin Shkolnyy<[email protected]>
---
hw/s390x/s390-pci-bus.c | 189 +++++++++++++++++++++++++++++++-
hw/s390x/s390-pci-inst.c | 2 +-
hw/s390x/s390-virtio-ccw.c | 4 +
include/hw/s390x/s390-pci-bus.h | 4 +
4 files changed, 193 insertions(+), 6 deletions(-)
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index a94e24a2ac..9441c80ef4 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -26,6 +26,7 @@
#include "hw/pci/pci_bridge.h"
#include "hw/pci/msi.h"
#include "exec/cpu-common.h"
+#include "migration/blocker.h"
#include "qemu/error-report.h"
#include "qemu/module.h"
#include "system/physmem.h"
@@ -34,6 +35,11 @@
#include "trace.h"
+static const Property phb_props[] = {
+ DEFINE_PROP_BOOL("x-zpci-emul-dev-migr-enabled", S390pciState,
+ emul_dev_migr_enabled, true),
+};
+
S390pciState *s390_get_phb(void)
{
static S390pciState *phb;
@@ -917,6 +923,23 @@ static void set_pbdev_info(S390PCIBusDevice *pbdev)
pbdev->pci_group = s390_group_find(ZPCI_DEFAULT_FN_GRP);
}
+static int s390_set_emul_dev_migration_blocker(S390pciState *s, Error
**errp)
+{
+ if (s->emul_dev_migr_enabled) {
+ return 0;
+ }
+ error_setg(&s->emul_dev_migr_blocker,
+ "Migration disabled for emulated zPCI devices on this
machine type");
+ return migrate_add_blocker(&s->emul_dev_migr_blocker, errp);
+}
+
I was trying to test this patch series, and something i tried was doing
was a save/restore of a VM with just CCW devices. But with this patch
the save/restore of the VM fails with error:
error: Requested operation is not valid: cannot migrate domain:
Migration disabled for emulated zPCI devices on this machine type
I think this is a regression, as the save/restore works with the same
guest definition with current master branch. I also think this may break
live migration for guest with just CCW devices. Something to also note,
by default libvirt auto adds a pci-root controller to the guest
definition [1]. So i wonder if that's tripping up the migration blocker?
[1] https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/
html/virtualization_deployment_and_administration_guide/sect-
guest_virtual_machine_device_configuration-configuring_device_controllers
Yes, indeed there is this device in qtree, even without any PCI devices
configured in the libvirt XML, and it blocks migration:
dev: s390-pcihost, id ""
x-zpci-emul-dev-migr-enabled = false
x-config-reg-migration-enabled = true
bypass-iommu = false
bus: s390-pcibus.0
type s390-pcibus
bus: pci.0
type PCI
Instead of creating a single migration blocker for this s390-pcihost,
I'll create one for each PCI device if this x-zpci-emul-dev-migr-enabled
flag if false.