device_core: use drain_call_rcu in in qmp_device_add
Soon, a device removal might only happen on RCU callback execution. This is okay for device-del which provides a DEVICE_DELETED event, but not for the failure case of device-add. To avoid changing monitor semantics, just drain all pending RCU callbacks on error. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Suggested-by: Stefan Hajnoczi <stefanha@gmail.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <20200913160259.32145-4-mlevitsk@redhat.com> [Don't use it in qmp_device_del. - Paolo] Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
7a8202c521
commit
7bed89958b
@ -803,6 +803,18 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dev = qdev_device_add(opts, errp);
|
dev = qdev_device_add(opts, errp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Drain all pending RCU callbacks. This is done because
|
||||||
|
* some bus related operations can delay a device removal
|
||||||
|
* (in this case this can happen if device is added and then
|
||||||
|
* removed due to a configuration error)
|
||||||
|
* to a RCU callback, but user might expect that this interface
|
||||||
|
* will finish its job completely once qmp command returns result
|
||||||
|
* to the user
|
||||||
|
*/
|
||||||
|
drain_call_rcu();
|
||||||
|
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
qemu_opts_del(opts);
|
qemu_opts_del(opts);
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user