[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] xen-block: Fix removal of backend instance via xenstore
- To: Anthony PERARD <anthony.perard@xxxxxxxxxx>, qemu-devel@xxxxxxxxxx
- From: Paul Durrant <xadimgnik@xxxxxxxxx>
- Date: Mon, 22 Mar 2021 15:03:31 +0000
- Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx>, Stefan Hajnoczi <stefanha@xxxxxxxxxx>, Maxim Levitsky <mlevitsk@xxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Kevin Wolf <kwolf@xxxxxxxxxx>, Max Reitz <mreitz@xxxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx, qemu-block@xxxxxxxxxx
- Delivery-date: Mon, 22 Mar 2021 15:04:00 +0000
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
On 08/03/2021 14:32, Anthony PERARD wrote:
From: Anthony PERARD <anthony.perard@xxxxxxxxxx>
Whenever a Xen block device is detach via xenstore, the image
associated with it remained open by the backend QEMU and an error is
logged:
qemu-system-i386: failed to destroy drive: Node xvdz-qcow2 is in use
This happened since object_unparent() doesn't immediately frees the
object and thus keep a reference to the node we are trying to free.
The reference is hold by the "drive" property and the call
xen_block_drive_destroy() fails.
In order to fix that, we call drain_call_rcu() to run the callback
setup by bus_remove_child() via object_unparent().
Fixes: 2d24a6466154 ("device-core: use RCU for list of children of a bus")
Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
---
CCing people whom introduced/reviewed the change to use RCU to give
them a chance to say if the change is fine.
---
hw/block/xen-block.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index a3b69e27096f..fe5f828e2d25 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -972,6 +972,15 @@ static void xen_block_device_destroy(XenBackendInstance
*backend,
object_unparent(OBJECT(xendev));
+ /*
+ * Drall all pending RCU callbacks as object_unparent() frees `xendev'
s/Drall/Drain ?
+ * in a RCU callback.
+ * And due to the property "drive" still existing in `xendev', we
+ * cann't destroy the XenBlockDrive associated with `xendev' with
s/cann't/can't
With those fixed...
Reviewed-by: Paul Durrant <paul@xxxxxxx>
+ * xen_block_drive_destroy() below.
+ */
+ drain_call_rcu();
+
if (iothread) {
xen_block_iothread_destroy(iothread, errp);
if (*errp) {
|