Message ID | 20230710100714.228867-4-david@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | virtio-mem: Device unplug support | expand |
On Mon, Jul 10, 2023 at 12:07:10PM +0200, David Hildenbrand wrote: > Let's use our new helper functions. Note that virtio-pmem-pci is not > enabled for arm and, therefore, not compiled in. > > Signed-off-by: David Hildenbrand <david@redhat.com> > --- > hw/arm/virt.c | 81 ++++++++------------------------------------------- > 1 file changed, 12 insertions(+), 69 deletions(-) > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > index 8a4c663735..4ae1996d37 100644 > --- a/hw/arm/virt.c > +++ b/hw/arm/virt.c > @@ -73,11 +73,10 @@ > #include "hw/arm/smmuv3.h" > #include "hw/acpi/acpi.h" > #include "target/arm/internals.h" > -#include "hw/mem/memory-device.h" > #include "hw/mem/pc-dimm.h" > #include "hw/mem/nvdimm.h" > #include "hw/acpi/generic_event_device.h" > -#include "hw/virtio/virtio-mem-pci.h" > +#include "hw/virtio/virtio-md-pci.h" > #include "hw/virtio/virtio-iommu.h" > #include "hw/char/pl011.h" > #include "qemu/guest-random.h" > @@ -2740,64 +2739,6 @@ static void virt_memory_plug(HotplugHandler *hotplug_dev, > dev, &error_abort); > } > > -static void virt_virtio_md_pci_pre_plug(HotplugHandler *hotplug_dev, > - DeviceState *dev, Error **errp) > -{ > - HotplugHandler *hotplug_dev2 = qdev_get_bus_hotplug_handler(dev); > - Error *local_err = NULL; > - > - if (!hotplug_dev2 && dev->hotplugged) { > - /* > - * Without a bus hotplug handler, we cannot control the plug/unplug > - * order. We should never reach this point when hotplugging on ARM. > - * However, it's nice to add a safety net, similar to what we have > - * on x86. > - */ > - error_setg(errp, "hotplug of virtio based memory devices not supported" > - " on this bus."); > - return; > - } > - /* > - * First, see if we can plug this memory device at all. If that > - * succeeds, branch of to the actual hotplug handler. > - */ > - memory_device_pre_plug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev), NULL, > - &local_err); > - if (!local_err && hotplug_dev2) { > - hotplug_handler_pre_plug(hotplug_dev2, dev, &local_err); > - } > - error_propagate(errp, local_err); > -} > - > -static void virt_virtio_md_pci_plug(HotplugHandler *hotplug_dev, > - DeviceState *dev, Error **errp) > -{ > - HotplugHandler *hotplug_dev2 = qdev_get_bus_hotplug_handler(dev); > - Error *local_err = NULL; > - > - /* > - * Plug the memory device first and then branch off to the actual > - * hotplug handler. If that one fails, we can easily undo the memory > - * device bits. > - */ > - memory_device_plug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev)); > - if (hotplug_dev2) { > - hotplug_handler_plug(hotplug_dev2, dev, &local_err); > - if (local_err) { > - memory_device_unplug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev)); > - } > - } > - error_propagate(errp, local_err); > -} > - > -static void virt_virtio_md_pci_unplug_request(HotplugHandler *hotplug_dev, > - DeviceState *dev, Error **errp) > -{ > - /* We don't support hot unplug of virtio based memory devices */ > - error_setg(errp, "virtio based memory devices cannot be unplugged."); > -} > - > - > static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev, > DeviceState *dev, Error **errp) > { > @@ -2805,8 +2746,8 @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev, > > if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { > virt_memory_pre_plug(hotplug_dev, dev, errp); > - } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { > - virt_virtio_md_pci_pre_plug(hotplug_dev, dev, errp); > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { > + virtio_md_pci_pre_plug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); > } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { > hwaddr db_start = 0, db_end = 0; > char *resv_prop_str; > @@ -2855,12 +2796,11 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev, > SYS_BUS_DEVICE(dev)); > } > } > + > if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { > virt_memory_plug(hotplug_dev, dev, errp); > - } > - > - if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { > - virt_virtio_md_pci_plug(hotplug_dev, dev, errp); > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { > + virtio_md_pci_plug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); > } > > if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { How is this supposed to link if virtio-md is disabled at compile time? Indeed I see this on mingw: FAILED: qemu-system-aarch64.exe i686-w64-mingw32-gcc -m32 @qemu-system-aarch64.exe.rsp /usr/lib/gcc/i686-w64-mingw32/12.2.1/../../../../i686-w64-mingw32/bin/ld: libqemu-aarch64-softmmu.fa.p/hw_arm_virt.c.obj: in function `virt_machine_device_plug_cb': /scm/qemu-mingw32-build/../qemu/hw/arm/virt.c:2803: undefined reference to `virtio_md_pci_plug' /usr/lib/gcc/i686-w64-mingw32/12.2.1/../../../../i686-w64-mingw32/bin/ld: libqemu-aarch64-softmmu.fa.p/hw_arm_virt.c.obj: in function `virt_machine_device_unplug_request_cb': /scm/qemu-mingw32-build/../qemu/hw/arm/virt.c:2859: undefined reference to `virtio_md_pci_unplug_request' /usr/lib/gcc/i686-w64-mingw32/12.2.1/../../../../i686-w64-mingw32/bin/ld: libqemu-aarch64-softmmu.fa.p/hw_arm_virt.c.obj: in function `virt_machine_device_unplug_cb': /scm/qemu-mingw32-build/../qemu/hw/arm/virt.c:2873: undefined reference to `virtio_md_pci_unplug' /usr/lib/gcc/i686-w64-mingw32/12.2.1/../../../../i686-w64-mingw32/bin/ld: libqemu-aarch64-softmmu.fa.p/hw_arm_virt.c.obj: in function `virt_machine_device_pre_plug_cb': /scm/qemu-mingw32-build/../qemu/hw/arm/virt.c:2750: undefined reference to `virtio_md_pci_pre_plug' collect2: error: ld returned 1 exit status [795/3838] Linking target qemu-system-aarch64w.exe FAILED: qemu-system-aarch64w.exe i686-w64-mingw32-gcc -m32 @qemu-system-aarch64w.exe.rsp /usr/lib/gcc/i686-w64-mingw32/12.2.1/../../../../i686-w64-mingw32/bin/ld: libqemu-aarch64-softmmu.fa.p/hw_arm_virt.c.obj: in function `virt_machine_device_plug_cb': /scm/qemu-mingw32-build/../qemu/hw/arm/virt.c:2803: undefined reference to `virtio_md_pci_plug' /usr/lib/gcc/i686-w64-mingw32/12.2.1/../../../../i686-w64-mingw32/bin/ld: libqemu-aarch64-softmmu.fa.p/hw_arm_virt.c.obj: in function `virt_machine_device_unplug_request_cb': /scm/qemu-mingw32-build/../qemu/hw/arm/virt.c:2859: undefined reference to `virtio_md_pci_unplug_request' /usr/lib/gcc/i686-w64-mingw32/12.2.1/../../../../i686-w64-mingw32/bin/ld: libqemu-aarch64-softmmu.fa.p/hw_arm_virt.c.obj: in function `virt_machine_device_unplug_cb': /scm/qemu-mingw32-build/../qemu/hw/arm/virt.c:2873: undefined reference to `virtio_md_pci_unplug' /usr/lib/gcc/i686-w64-mingw32/12.2.1/../../../../i686-w64-mingw32/bin/ld: libqemu-aarch64-softmmu.fa.p/hw_arm_virt.c.obj: in function `virt_machine_device_pre_plug_cb': /scm/qemu-mingw32-build/../qemu/hw/arm/virt.c:2750: undefined reference to `virtio_md_pci_pre_plug' collect2: error: ld returned 1 exit status [796/3838] Compiling C object libqemu-cris-softmmu.fa.p/fpu_softfloat.c.obj [797/3838] Compiling C object libqemu-hppa-softmmu.fa.p/fpu_softfloat.c.obj ninja: build stopped: subcommand failed. make: *** [Makefile:162: run-ninja] Error 1 > @@ -2915,8 +2855,9 @@ static void virt_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev, > { > if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { > virt_dimm_unplug_request(hotplug_dev, dev, errp); > - } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { > - virt_virtio_md_pci_unplug_request(hotplug_dev, dev, errp); > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { > + virtio_md_pci_unplug_request(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), > + errp); > } else { > error_setg(errp, "device unplug request for unsupported device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -2928,6 +2869,8 @@ static void virt_machine_device_unplug_cb(HotplugHandler *hotplug_dev, > { > if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { > virt_dimm_unplug(hotplug_dev, dev, errp); > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { > + virtio_md_pci_unplug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); > } else { > error_setg(errp, "virt: device unplug for unsupported device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -2941,7 +2884,7 @@ static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine, > > if (device_is_dynamic_sysbus(mc, dev) || > object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) || > - object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI) || > + object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI) || > object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { > return HOTPLUG_HANDLER(machine); > } > -- > 2.41.0
On 10.07.23 23:40, Michael S. Tsirkin wrote: > On Mon, Jul 10, 2023 at 12:07:10PM +0200, David Hildenbrand wrote: >> Let's use our new helper functions. Note that virtio-pmem-pci is not >> enabled for arm and, therefore, not compiled in. >> >> Signed-off-by: David Hildenbrand <david@redhat.com> >> --- >> hw/arm/virt.c | 81 ++++++++------------------------------------------- >> 1 file changed, 12 insertions(+), 69 deletions(-) >> >> diff --git a/hw/arm/virt.c b/hw/arm/virt.c >> index 8a4c663735..4ae1996d37 100644 >> --- a/hw/arm/virt.c >> +++ b/hw/arm/virt.c >> @@ -73,11 +73,10 @@ >> #include "hw/arm/smmuv3.h" >> #include "hw/acpi/acpi.h" >> #include "target/arm/internals.h" >> -#include "hw/mem/memory-device.h" >> #include "hw/mem/pc-dimm.h" >> #include "hw/mem/nvdimm.h" >> #include "hw/acpi/generic_event_device.h" >> -#include "hw/virtio/virtio-mem-pci.h" >> +#include "hw/virtio/virtio-md-pci.h" >> #include "hw/virtio/virtio-iommu.h" >> #include "hw/char/pl011.h" >> #include "qemu/guest-random.h" >> @@ -2740,64 +2739,6 @@ static void virt_memory_plug(HotplugHandler *hotplug_dev, >> dev, &error_abort); >> } >> >> -static void virt_virtio_md_pci_pre_plug(HotplugHandler *hotplug_dev, >> - DeviceState *dev, Error **errp) >> -{ >> - HotplugHandler *hotplug_dev2 = qdev_get_bus_hotplug_handler(dev); >> - Error *local_err = NULL; >> - >> - if (!hotplug_dev2 && dev->hotplugged) { >> - /* >> - * Without a bus hotplug handler, we cannot control the plug/unplug >> - * order. We should never reach this point when hotplugging on ARM. >> - * However, it's nice to add a safety net, similar to what we have >> - * on x86. >> - */ >> - error_setg(errp, "hotplug of virtio based memory devices not supported" >> - " on this bus."); >> - return; >> - } >> - /* >> - * First, see if we can plug this memory device at all. If that >> - * succeeds, branch of to the actual hotplug handler. >> - */ >> - memory_device_pre_plug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev), NULL, >> - &local_err); >> - if (!local_err && hotplug_dev2) { >> - hotplug_handler_pre_plug(hotplug_dev2, dev, &local_err); >> - } >> - error_propagate(errp, local_err); >> -} >> - >> -static void virt_virtio_md_pci_plug(HotplugHandler *hotplug_dev, >> - DeviceState *dev, Error **errp) >> -{ >> - HotplugHandler *hotplug_dev2 = qdev_get_bus_hotplug_handler(dev); >> - Error *local_err = NULL; >> - >> - /* >> - * Plug the memory device first and then branch off to the actual >> - * hotplug handler. If that one fails, we can easily undo the memory >> - * device bits. >> - */ >> - memory_device_plug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev)); >> - if (hotplug_dev2) { >> - hotplug_handler_plug(hotplug_dev2, dev, &local_err); >> - if (local_err) { >> - memory_device_unplug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev)); >> - } >> - } >> - error_propagate(errp, local_err); >> -} >> - >> -static void virt_virtio_md_pci_unplug_request(HotplugHandler *hotplug_dev, >> - DeviceState *dev, Error **errp) >> -{ >> - /* We don't support hot unplug of virtio based memory devices */ >> - error_setg(errp, "virtio based memory devices cannot be unplugged."); >> -} >> - >> - >> static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev, >> DeviceState *dev, Error **errp) >> { >> @@ -2805,8 +2746,8 @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev, >> >> if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { >> virt_memory_pre_plug(hotplug_dev, dev, errp); >> - } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { >> - virt_virtio_md_pci_pre_plug(hotplug_dev, dev, errp); >> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { >> + virtio_md_pci_pre_plug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); >> } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { >> hwaddr db_start = 0, db_end = 0; >> char *resv_prop_str; >> @@ -2855,12 +2796,11 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev, >> SYS_BUS_DEVICE(dev)); >> } >> } >> + >> if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { >> virt_memory_plug(hotplug_dev, dev, errp); >> - } >> - >> - if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { >> - virt_virtio_md_pci_plug(hotplug_dev, dev, errp); >> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { >> + virtio_md_pci_plug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); >> } >> >> if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { > > > How is this supposed to link if virtio-md is disabled at compile time? > Good point. The old code unconditionally enabled MEM_DEVICE, so we never required subs for that. We either need stubs or have to wrap this in #ifdef. Stubs sound cleaner.
On Tue, Jul 11, 2023 at 10:32:31AM +0200, David Hildenbrand wrote: > On 10.07.23 23:40, Michael S. Tsirkin wrote: > > > @@ -2855,12 +2796,11 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev, > > > SYS_BUS_DEVICE(dev)); > > > } > > > } > > > + > > > if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { > > > virt_memory_plug(hotplug_dev, dev, errp); > > > - } > > > - > > > - if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { > > > - virt_virtio_md_pci_plug(hotplug_dev, dev, errp); > > > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { > > > + virtio_md_pci_plug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); > > > } > > > if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { > > > > > > How is this supposed to link if virtio-md is disabled at compile time? > > > > Good point. > > The old code unconditionally enabled MEM_DEVICE, so we never required subs > for that. > > We either need stubs or have to wrap this in #ifdef. > > Stubs sound cleaner. That is what we usually do, yes.
On 11.07.23 10:47, Michael S. Tsirkin wrote: > On Tue, Jul 11, 2023 at 10:32:31AM +0200, David Hildenbrand wrote: >> On 10.07.23 23:40, Michael S. Tsirkin wrote: >>>> @@ -2855,12 +2796,11 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev, >>>> SYS_BUS_DEVICE(dev)); >>>> } >>>> } >>>> + >>>> if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { >>>> virt_memory_plug(hotplug_dev, dev, errp); >>>> - } >>>> - >>>> - if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { >>>> - virt_virtio_md_pci_plug(hotplug_dev, dev, errp); >>>> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { >>>> + virtio_md_pci_plug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); >>>> } >>>> if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { >>> >>> >>> How is this supposed to link if virtio-md is disabled at compile time? >>> >> >> Good point. >> >> The old code unconditionally enabled MEM_DEVICE, so we never required subs >> for that. >> >> We either need stubs or have to wrap this in #ifdef. >> >> Stubs sound cleaner. > > That is what we usually do, yes. > I'm testing with the following: diff --git a/stubs/meson.build b/stubs/meson.build index a56645e2f7..160154912c 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -65,3 +65,4 @@ else endif stub_ss.add(files('semihost-all.c')) stub_ss.add(when: 'CONFIG_VFIO_USER_SERVER', if_false: files('vfio-user-obj.c')) +stub_ss.add(when: 'CONFIG_VIRTIO_MD', if_false: files('virtio_md_pci.c')) diff --git a/stubs/virtio_md_pci.c b/stubs/virtio_md_pci.c new file mode 100644 index 0000000000..ce5bba0c9d --- /dev/null +++ b/stubs/virtio_md_pci.c @@ -0,0 +1,24 @@ +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/virtio/virtio-md-pci.h" + +void virtio_md_pci_pre_plug(VirtIOMDPCI *vmd, MachineState *ms, Error **errp) +{ + error_setg(errp, "virtio based memory devices not supported"); +} + +void virtio_md_pci_plug(VirtIOMDPCI *vmd, MachineState *ms, Error **errp) +{ + error_setg(errp, "virtio based memory devices not supported"); +} + +void virtio_md_pci_unplug_request(VirtIOMDPCI *vmd, MachineState *ms, + Error **errp) +{ + error_setg(errp, "virtio based memory devices not supported"); +} + +void virtio_md_pci_unplug(VirtIOMDPCI *vmd, MachineState *ms, Error **errp) +{ + error_setg(errp, "virtio based memory devices not supported"); +} For now (not having virtio-md-ccw or virtio-md-mmio) this should do the trick I think.
On 11.07.23 11:22, David Hildenbrand wrote: > On 11.07.23 10:47, Michael S. Tsirkin wrote: >> On Tue, Jul 11, 2023 at 10:32:31AM +0200, David Hildenbrand wrote: >>> On 10.07.23 23:40, Michael S. Tsirkin wrote: >>>>> @@ -2855,12 +2796,11 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev, >>>>> SYS_BUS_DEVICE(dev)); >>>>> } >>>>> } >>>>> + >>>>> if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { >>>>> virt_memory_plug(hotplug_dev, dev, errp); >>>>> - } >>>>> - >>>>> - if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { >>>>> - virt_virtio_md_pci_plug(hotplug_dev, dev, errp); >>>>> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { >>>>> + virtio_md_pci_plug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); >>>>> } >>>>> if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { >>>> >>>> >>>> How is this supposed to link if virtio-md is disabled at compile time? >>>> >>> >>> Good point. >>> >>> The old code unconditionally enabled MEM_DEVICE, so we never required subs >>> for that. >>> >>> We either need stubs or have to wrap this in #ifdef. >>> >>> Stubs sound cleaner. >> >> That is what we usually do, yes. >> > > I'm testing with the following: > > > diff --git a/stubs/meson.build b/stubs/meson.build > index a56645e2f7..160154912c 100644 > --- a/stubs/meson.build > +++ b/stubs/meson.build > @@ -65,3 +65,4 @@ else > endif > stub_ss.add(files('semihost-all.c')) > stub_ss.add(when: 'CONFIG_VFIO_USER_SERVER', if_false: files('vfio-user-obj.c')) > +stub_ss.add(when: 'CONFIG_VIRTIO_MD', if_false: files('virtio_md_pci.c')) Needs to be diff --git a/stubs/meson.build b/stubs/meson.build index a56645e2f7..f16a365731 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -60,6 +60,7 @@ if have_system stub_ss.add(files('semihost.c')) stub_ss.add(files('usb-dev-stub.c')) stub_ss.add(files('xen-hw-stub.c')) + stub_ss.add(files('virtio_md_pci.c')) else stub_ss.add(files('qdev.c')) endif Otherwise it still fails when building for multiple targets.
diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 8a4c663735..4ae1996d37 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -73,11 +73,10 @@ #include "hw/arm/smmuv3.h" #include "hw/acpi/acpi.h" #include "target/arm/internals.h" -#include "hw/mem/memory-device.h" #include "hw/mem/pc-dimm.h" #include "hw/mem/nvdimm.h" #include "hw/acpi/generic_event_device.h" -#include "hw/virtio/virtio-mem-pci.h" +#include "hw/virtio/virtio-md-pci.h" #include "hw/virtio/virtio-iommu.h" #include "hw/char/pl011.h" #include "qemu/guest-random.h" @@ -2740,64 +2739,6 @@ static void virt_memory_plug(HotplugHandler *hotplug_dev, dev, &error_abort); } -static void virt_virtio_md_pci_pre_plug(HotplugHandler *hotplug_dev, - DeviceState *dev, Error **errp) -{ - HotplugHandler *hotplug_dev2 = qdev_get_bus_hotplug_handler(dev); - Error *local_err = NULL; - - if (!hotplug_dev2 && dev->hotplugged) { - /* - * Without a bus hotplug handler, we cannot control the plug/unplug - * order. We should never reach this point when hotplugging on ARM. - * However, it's nice to add a safety net, similar to what we have - * on x86. - */ - error_setg(errp, "hotplug of virtio based memory devices not supported" - " on this bus."); - return; - } - /* - * First, see if we can plug this memory device at all. If that - * succeeds, branch of to the actual hotplug handler. - */ - memory_device_pre_plug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev), NULL, - &local_err); - if (!local_err && hotplug_dev2) { - hotplug_handler_pre_plug(hotplug_dev2, dev, &local_err); - } - error_propagate(errp, local_err); -} - -static void virt_virtio_md_pci_plug(HotplugHandler *hotplug_dev, - DeviceState *dev, Error **errp) -{ - HotplugHandler *hotplug_dev2 = qdev_get_bus_hotplug_handler(dev); - Error *local_err = NULL; - - /* - * Plug the memory device first and then branch off to the actual - * hotplug handler. If that one fails, we can easily undo the memory - * device bits. - */ - memory_device_plug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev)); - if (hotplug_dev2) { - hotplug_handler_plug(hotplug_dev2, dev, &local_err); - if (local_err) { - memory_device_unplug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev)); - } - } - error_propagate(errp, local_err); -} - -static void virt_virtio_md_pci_unplug_request(HotplugHandler *hotplug_dev, - DeviceState *dev, Error **errp) -{ - /* We don't support hot unplug of virtio based memory devices */ - error_setg(errp, "virtio based memory devices cannot be unplugged."); -} - - static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { @@ -2805,8 +2746,8 @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev, if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { virt_memory_pre_plug(hotplug_dev, dev, errp); - } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { - virt_virtio_md_pci_pre_plug(hotplug_dev, dev, errp); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { + virtio_md_pci_pre_plug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { hwaddr db_start = 0, db_end = 0; char *resv_prop_str; @@ -2855,12 +2796,11 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev, SYS_BUS_DEVICE(dev)); } } + if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { virt_memory_plug(hotplug_dev, dev, errp); - } - - if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { - virt_virtio_md_pci_plug(hotplug_dev, dev, errp); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { + virtio_md_pci_plug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); } if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { @@ -2915,8 +2855,9 @@ static void virt_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev, { if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { virt_dimm_unplug_request(hotplug_dev, dev, errp); - } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { - virt_virtio_md_pci_unplug_request(hotplug_dev, dev, errp); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { + virtio_md_pci_unplug_request(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), + errp); } else { error_setg(errp, "device unplug request for unsupported device" " type: %s", object_get_typename(OBJECT(dev))); @@ -2928,6 +2869,8 @@ static void virt_machine_device_unplug_cb(HotplugHandler *hotplug_dev, { if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { virt_dimm_unplug(hotplug_dev, dev, errp); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) { + virtio_md_pci_unplug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp); } else { error_setg(errp, "virt: device unplug for unsupported device" " type: %s", object_get_typename(OBJECT(dev))); @@ -2941,7 +2884,7 @@ static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine, if (device_is_dynamic_sysbus(mc, dev) || object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) || - object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI) || + object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI) || object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) { return HOTPLUG_HANDLER(machine); }
Let's use our new helper functions. Note that virtio-pmem-pci is not enabled for arm and, therefore, not compiled in. Signed-off-by: David Hildenbrand <david@redhat.com> --- hw/arm/virt.c | 81 ++++++++------------------------------------------- 1 file changed, 12 insertions(+), 69 deletions(-)