qdev-monitor: Forbid repeated device_del

Device unplug can be done asynchronously. Thus, sending the second
device_del before the previous unplug is complete may lead to
unexpected results. On PCIe devices, this cancels the hot-unplug
process.

Signed-off-by: Julia Suvorova <jusual@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-Id: <20200220165556.39388-1-jusual@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Julia Suvorova 2020-02-20 17:55:56 +01:00 committed by Paolo Bonzini
parent 037fb5eb39
commit cce8944cc9

View File

@ -887,6 +887,12 @@ void qmp_device_del(const char *id, Error **errp)
{ {
DeviceState *dev = find_device_state(id, errp); DeviceState *dev = find_device_state(id, errp);
if (dev != NULL) { if (dev != NULL) {
if (dev->pending_deleted_event) {
error_setg(errp, "Device %s is already in the "
"process of unplug", id);
return;
}
qdev_unplug(dev, errp); qdev_unplug(dev, errp);
} }
} }