Message ID | 20200220165556.39388-1-jusual@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qdev-monitor: Forbid repeated device_del | expand |
On Thu, Feb 20, 2020 at 05:55:56PM +0100, Julia Suvorova wrote: > 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> > --- > qdev-monitor.c | 6 ++++++ > 1 file changed, 6 insertions(+) Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
On 21/02/20 14:53, Stefan Hajnoczi wrote: > On Thu, Feb 20, 2020 at 05:55:56PM +0100, Julia Suvorova wrote: >> 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> >> --- >> qdev-monitor.c | 6 ++++++ >> 1 file changed, 6 insertions(+) > > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> > Queued, thanks. Paolo
diff --git a/qdev-monitor.c b/qdev-monitor.c index 8ce71a206b..8a2a9538cd 100644 --- a/qdev-monitor.c +++ b/qdev-monitor.c @@ -887,6 +887,12 @@ void qmp_device_del(const char *id, Error **errp) { DeviceState *dev = find_device_state(id, errp); 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); } }
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> --- qdev-monitor.c | 6 ++++++ 1 file changed, 6 insertions(+)