vhost-user-blk: use different event handlers on initialization
It is useful to use different connect/disconnect event handlers on device initialization and operation as seen from the further commit fixing a bug on device initialization. This patch refactors the code to make use of them: we don't rely any more on the VM state for choosing how to cleanup the device, instead we explicitly use the proper event handler depending on whether the device has been initialized. Signed-off-by: Denis Plotnikov <den-plotnikov@yandex-team.ru> Reviewed-by: Raphael Norwitz <raphael.norwitz@nutanix.com> Message-Id: <20210325151217.262793-2-den-plotnikov@yandex-team.ru> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
1bd16067b6
commit
0c99d722e7
@ -362,7 +362,18 @@ static void vhost_user_blk_disconnect(DeviceState *dev)
|
|||||||
vhost_dev_cleanup(&s->dev);
|
vhost_dev_cleanup(&s->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vhost_user_blk_event(void *opaque, QEMUChrEvent event);
|
static void vhost_user_blk_event(void *opaque, QEMUChrEvent event,
|
||||||
|
bool realized);
|
||||||
|
|
||||||
|
static void vhost_user_blk_event_realize(void *opaque, QEMUChrEvent event)
|
||||||
|
{
|
||||||
|
vhost_user_blk_event(opaque, event, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void vhost_user_blk_event_oper(void *opaque, QEMUChrEvent event)
|
||||||
|
{
|
||||||
|
vhost_user_blk_event(opaque, event, true);
|
||||||
|
}
|
||||||
|
|
||||||
static void vhost_user_blk_chr_closed_bh(void *opaque)
|
static void vhost_user_blk_chr_closed_bh(void *opaque)
|
||||||
{
|
{
|
||||||
@ -371,11 +382,12 @@ static void vhost_user_blk_chr_closed_bh(void *opaque)
|
|||||||
VHostUserBlk *s = VHOST_USER_BLK(vdev);
|
VHostUserBlk *s = VHOST_USER_BLK(vdev);
|
||||||
|
|
||||||
vhost_user_blk_disconnect(dev);
|
vhost_user_blk_disconnect(dev);
|
||||||
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, vhost_user_blk_event,
|
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL,
|
||||||
NULL, opaque, NULL, true);
|
vhost_user_blk_event_oper, NULL, opaque, NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vhost_user_blk_event(void *opaque, QEMUChrEvent event)
|
static void vhost_user_blk_event(void *opaque, QEMUChrEvent event,
|
||||||
|
bool realized)
|
||||||
{
|
{
|
||||||
DeviceState *dev = opaque;
|
DeviceState *dev = opaque;
|
||||||
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
|
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
|
||||||
@ -406,7 +418,7 @@ static void vhost_user_blk_event(void *opaque, QEMUChrEvent event)
|
|||||||
* TODO: maybe it is a good idea to make the same fix
|
* TODO: maybe it is a good idea to make the same fix
|
||||||
* for other vhost-user devices.
|
* for other vhost-user devices.
|
||||||
*/
|
*/
|
||||||
if (runstate_is_running()) {
|
if (realized) {
|
||||||
AioContext *ctx = qemu_get_current_aio_context();
|
AioContext *ctx = qemu_get_current_aio_context();
|
||||||
|
|
||||||
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, NULL, NULL,
|
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, NULL, NULL,
|
||||||
@ -473,8 +485,9 @@ static void vhost_user_blk_device_realize(DeviceState *dev, Error **errp)
|
|||||||
s->vhost_vqs = g_new0(struct vhost_virtqueue, s->num_queues);
|
s->vhost_vqs = g_new0(struct vhost_virtqueue, s->num_queues);
|
||||||
s->connected = false;
|
s->connected = false;
|
||||||
|
|
||||||
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, vhost_user_blk_event,
|
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL,
|
||||||
NULL, (void *)dev, NULL, true);
|
vhost_user_blk_event_realize, NULL, (void *)dev,
|
||||||
|
NULL, true);
|
||||||
|
|
||||||
reconnect:
|
reconnect:
|
||||||
if (qemu_chr_fe_wait_connected(&s->chardev, &err) < 0) {
|
if (qemu_chr_fe_wait_connected(&s->chardev, &err) < 0) {
|
||||||
@ -494,6 +507,10 @@ reconnect:
|
|||||||
goto reconnect;
|
goto reconnect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* we're fully initialized, now we can operate, so change the handler */
|
||||||
|
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL,
|
||||||
|
vhost_user_blk_event_oper, NULL, (void *)dev,
|
||||||
|
NULL, true);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
virtio_err:
|
virtio_err:
|
||||||
|
Loading…
Reference in New Issue
Block a user