On Wed, 8 Apr 2020 10:25:42 +0800 Li Feng <fen...@smartx.com> wrote: > Hi all, > > Hotplug of vhost-user-blk doesn't not work in qemu master branch and > all previous version. > > The action I insert a vhost-user-blk disk is: > (qemu) chardev-add socket,id=spdk_vhost_blk2,path=/vhost-blk.0,reconnect=1 > (qemu) device_add > vhost-user-blk-pci,chardev=spdk_vhost_blk2,id=spdk_vhost_blk2,num-queues=4 > > Until here, it's well. > > Then I unplug it from qemu: > (qemu) device_del spdk_vhost_blk2 > (qemu) chardev-remove spdk_vhost_blk2 > Error: Chardev 'spdk_vhost_blk2' is busy > > The related code is here: > qmp_chardev_remove > -> qemu_chr_is_busy > -> object_unparent(OBJECT(chr)); > > 330 static bool qemu_chr_is_busy(Chardev *s) > 331 { > 332 if (CHARDEV_IS_MUX(s)) { > 333 MuxChardev *d = MUX_CHARDEV(s); > 334 return d->mux_cnt >= 0; > 335 } else { > 336 return s->be != NULL; > 337 } > 338 } > > My question is: > 1. s->be is set to NULL when qemu_chr_fe_deinit is called. > However, the qmp_chardev_remove is blocked at qemu_chr_is_busy check, > then the object_unparent will not be called. > 2. Is there a path that device_del will trigger the s->be that been set to > NULL?
device_del is request for guest to eject device and once it's done backend could be removed. what's you command line? (so I could point out entry point where ejection happens for you to troubleshoot it further) > > How should I fix this issue? > I have tested that comment the qemu_chr_is_busy works well. > > Thanks in advance. > > Feng Li >