src/qemu/qemu_domain_address.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
Since commit f23f8ff91a virtio-mem supports also CCW. When hotplugging a
virtio-mem device with a CCW address results in a PCI device getting
attached. The method qemuDomainAssignMemoryDeviceSlot is only
considering PCI as address type and overwriting the CCW address. Adding
support for address type CCW.
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
---
src/qemu/qemu_domain_address.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index d38983bf63..b0289c2337 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -3067,6 +3067,7 @@ qemuDomainAssignMemoryDeviceSlot(virDomainObj *vm,
virDomainMemoryDef *mem)
{
g_autoptr(virBitmap) slotmap = NULL;
+ virDomainCCWAddressSet *ccwaddrs = NULL;
virDomainDeviceDef dev = {.type = VIR_DOMAIN_DEVICE_MEMORY, .data.memory = mem};
switch (mem->model) {
@@ -3080,7 +3081,20 @@ qemuDomainAssignMemoryDeviceSlot(virDomainObj *vm,
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
- return qemuDomainEnsurePCIAddress(vm, &dev);
+ if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
+ if (qemuDomainIsS390CCW(vm->def))
+ mem->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW;
+ }
+
+ if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
+ mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
+ return qemuDomainEnsurePCIAddress(vm, &dev);
+ } else if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
+ if (!(ccwaddrs = virDomainCCWAddressSetCreateFromDomain(vm->def)))
+ return -1;
+ return virDomainCCWAddressAssign(&mem->info, ccwaddrs,
+ !mem->info.addr.ccw.assigned);
+ }
break;
case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
--
2.47.0
On Tue, Mar 18, 2025 at 09:53:22AM +0100, Boris Fiuczynski wrote: >Since commit f23f8ff91a virtio-mem supports also CCW. When hotplugging a >virtio-mem device with a CCW address results in a PCI device getting >attached. The method qemuDomainAssignMemoryDeviceSlot is only >considering PCI as address type and overwriting the CCW address. Adding >support for address type CCW. > >Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com> >--- > src/qemu/qemu_domain_address.c | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > >diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c >index d38983bf63..b0289c2337 100644 >--- a/src/qemu/qemu_domain_address.c >+++ b/src/qemu/qemu_domain_address.c >@@ -3067,6 +3067,7 @@ qemuDomainAssignMemoryDeviceSlot(virDomainObj *vm, > virDomainMemoryDef *mem) > { > g_autoptr(virBitmap) slotmap = NULL; >+ virDomainCCWAddressSet *ccwaddrs = NULL; > virDomainDeviceDef dev = {.type = VIR_DOMAIN_DEVICE_MEMORY, .data.memory = mem}; > > switch (mem->model) { >@@ -3080,7 +3081,20 @@ qemuDomainAssignMemoryDeviceSlot(virDomainObj *vm, > > case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: > case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: >- return qemuDomainEnsurePCIAddress(vm, &dev); >+ if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { >+ if (qemuDomainIsS390CCW(vm->def)) >+ mem->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW; >+ } >+ >+ if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE || >+ mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { >+ return qemuDomainEnsurePCIAddress(vm, &dev); >+ } else if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) { >+ if (!(ccwaddrs = virDomainCCWAddressSetCreateFromDomain(vm->def))) >+ return -1; >+ return virDomainCCWAddressAssign(&mem->info, ccwaddrs, >+ !mem->info.addr.ccw.assigned); >+ } You leak ccwaddrs here, I'd suggest squashing something like this in: diff --git i/src/conf/domain_addr.h w/src/conf/domain_addr.h index e72fb4884758..d1c2539e7ea6 100644 --- i/src/conf/domain_addr.h +++ w/src/conf/domain_addr.h @@ -310,3 +310,5 @@ int virDomainUSBAddressRelease(virDomainUSBAddressSet *addrs, virDomainDeviceInfo *info) ATTRIBUTE_NONNULL(2); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainCCWAddressSet, virDomainCCWAddressSetFree); diff --git i/src/qemu/qemu_domain_address.c w/src/qemu/qemu_domain_address.c index b0289c2337ae..2dedff9c95d9 100644 --- i/src/qemu/qemu_domain_address.c +++ w/src/qemu/qemu_domain_address.c @@ -3067,7 +3067,7 @@ qemuDomainAssignMemoryDeviceSlot(virDomainObj *vm, virDomainMemoryDef *mem) { g_autoptr(virBitmap) slotmap = NULL; - virDomainCCWAddressSet *ccwaddrs = NULL; + g_autoptr(virDomainCCWAddressSet) ccwaddrs = NULL; virDomainDeviceDef dev = {.type = VIR_DOMAIN_DEVICE_MEMORY, .data.memory = mem}; switch (mem->model) { -- > break; > > case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: >-- >2.47.0 >
On 3/18/25 13:00, Martin Kletzander via Devel wrote: > On Tue, Mar 18, 2025 at 09:53:22AM +0100, Boris Fiuczynski wrote: >> Since commit f23f8ff91a virtio-mem supports also CCW. When hotplugging a >> virtio-mem device with a CCW address results in a PCI device getting >> attached. The method qemuDomainAssignMemoryDeviceSlot is only >> considering PCI as address type and overwriting the CCW address. Adding >> support for address type CCW. >> >> Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com> >> --- >> src/qemu/qemu_domain_address.c | 16 +++++++++++++++- >> 1 file changed, 15 insertions(+), 1 deletion(-) >> >> diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/ >> qemu_domain_address.c >> index d38983bf63..b0289c2337 100644 >> --- a/src/qemu/qemu_domain_address.c >> +++ b/src/qemu/qemu_domain_address.c >> @@ -3067,6 +3067,7 @@ qemuDomainAssignMemoryDeviceSlot(virDomainObj *vm, >> virDomainMemoryDef *mem) >> { >> g_autoptr(virBitmap) slotmap = NULL; >> + virDomainCCWAddressSet *ccwaddrs = NULL; >> virDomainDeviceDef dev = {.type = >> VIR_DOMAIN_DEVICE_MEMORY, .data.memory = mem}; >> >> switch (mem->model) { >> @@ -3080,7 +3081,20 @@ qemuDomainAssignMemoryDeviceSlot(virDomainObj *vm, >> >> case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: >> case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: >> - return qemuDomainEnsurePCIAddress(vm, &dev); >> + if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { >> + if (qemuDomainIsS390CCW(vm->def)) >> + mem->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW; >> + } >> + >> + if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE || >> + mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { >> + return qemuDomainEnsurePCIAddress(vm, &dev); >> + } else if (mem->info.type == >> VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) { >> + if (!(ccwaddrs = >> virDomainCCWAddressSetCreateFromDomain(vm->def))) >> + return -1; >> + return virDomainCCWAddressAssign(&mem->info, ccwaddrs, >> + !mem- >> >info.addr.ccw.assigned); >> + } > > You leak ccwaddrs here, I'd suggest squashing something like this in: Thanks for your feedback. I am going to send a v2 shortly. It will make reuse of qemuDomainEnsureVirtioAddress reducing changes to a minimum. -- Mit freundlichen Grüßen/Kind regards Boris Fiuczynski IBM Deutschland Research & Development GmbH Vorsitzender des Aufsichtsrats: Wolfgang Wendt Geschäftsführung: David Faller Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294
© 2016 - 2025 Red Hat, Inc.