Hot-unplug takes some time due to communication with the guest. Do not change the device while freeing up resources.
Signed-off-by: Julia Suvorova <jus...@redhat.com> --- balloon.c | 2 +- hw/virtio/virtio-balloon.c | 9 ++++++++- include/sysemu/balloon.h | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/balloon.c b/balloon.c index f104b42961..998ec53a0f 100644 --- a/balloon.c +++ b/balloon.c @@ -119,5 +119,5 @@ void qmp_balloon(int64_t target, Error **errp) } trace_balloon_event(balloon_opaque, target); - balloon_event_fn(balloon_opaque, target); + balloon_event_fn(balloon_opaque, target, errp); } diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c index 57f3b9f22d..0fa4e4454b 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c @@ -717,12 +717,19 @@ static void virtio_balloon_stat(void *opaque, BalloonInfo *info) VIRTIO_BALLOON_PFN_SHIFT); } -static void virtio_balloon_to_target(void *opaque, ram_addr_t target) +static void virtio_balloon_to_target(void *opaque, ram_addr_t target, + Error **errp) { + DeviceState *bus_dev = qdev_get_bus_device(DEVICE(opaque)); VirtIOBalloon *dev = VIRTIO_BALLOON(opaque); VirtIODevice *vdev = VIRTIO_DEVICE(dev); ram_addr_t vm_ram_size = get_current_ram_size(); + if (bus_dev && bus_dev->pending_deleted_event) { + error_setg(errp, "Hot-unplug of %s is in progress", vdev->name); + return; + } + if (target > vm_ram_size) { target = vm_ram_size; } diff --git a/include/sysemu/balloon.h b/include/sysemu/balloon.h index aea0c44985..b3a09ca946 100644 --- a/include/sysemu/balloon.h +++ b/include/sysemu/balloon.h @@ -17,7 +17,7 @@ #include "exec/cpu-common.h" #include "qapi/qapi-types-misc.h" -typedef void (QEMUBalloonEvent)(void *opaque, ram_addr_t target); +typedef void (QEMUBalloonEvent)(void *opaque, ram_addr_t target, Error **errp); typedef void (QEMUBalloonStatus)(void *opaque, BalloonInfo *info); int qemu_add_balloon_handler(QEMUBalloonEvent *event_func, -- 2.24.1