Skip to content

Commit

Permalink
system/qdev-monitor: move drain_call_rcu call under if (!dev) in qmp_…
Browse files Browse the repository at this point in the history
…device_add()

Original goal of addition of drain_call_rcu to qmp_device_add was to cover
the failure case of qdev_device_add. It seems call of drain_call_rcu was
misplaced in 7bed899 what led to waiting for pending RCU callbacks
under happy path too. What led to overall performance degradation of
qmp_device_add.

In this patch call of drain_call_rcu moved under handling of failure of
qdev_device_add.

Signed-off-by: Dmitrii Gavrilov <ds-gavr@yandex-team.ru>
Message-ID: <20231103105602.90475-1-ds-gavr@yandex-team.ru>
Fixes: 7bed899 ("device_core: use drain_call_rcu in in qmp_device_add", 2020-10-12)
Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit 012b170)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
  • Loading branch information
Dmitrii Gavrilov authored and Michael Tokarev committed Mar 10, 2024
1 parent ca30a87 commit 354e19d
Showing 1 changed file with 11 additions and 12 deletions.
23 changes: 11 additions & 12 deletions softmmu/qdev-monitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -853,19 +853,18 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
return;
}
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) {
/*
* 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();

qemu_opts_del(opts);
return;
}
Expand Down

0 comments on commit 354e19d

Please sign in to comment.