From: Marc-André Lureau <marcandre.lur...@redhat.com> The chardev waits for an initial connection before starting qemu, vhost-user wants the backend negotiation to be completed. vhost-user is started in the net_vhost_user_event callback, which is synchronously called after the socket is connected.
Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- net/vhost-user.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/net/vhost-user.c b/net/vhost-user.c index 95ed2d2..4badd9e 100644 --- a/net/vhost-user.c +++ b/net/vhost-user.c @@ -24,6 +24,7 @@ typedef struct VhostUserState { VHostNetState *vhost_net; int watch; uint64_t acked_features; + bool started; } VhostUserState; typedef struct VhostUserChardevProps { @@ -211,6 +212,7 @@ static void net_vhost_user_event(void *opaque, int event) return; } qmp_set_link(name, true, &err); + s->started = true; break; case CHR_EVENT_CLOSED: qmp_set_link(name, false, &err); @@ -248,7 +250,15 @@ static int net_vhost_user_init(NetClientState *peer, const char *device, s->chr = chr; } - qemu_chr_add_handlers(chr, NULL, NULL, net_vhost_user_event, nc[0].name); + do { + Error *err = NULL; + if (qemu_chr_wait_connected(chr, &err) < 0) { + error_report_err(err); + return -1; + } + qemu_chr_add_handlers(chr, NULL, NULL, + net_vhost_user_event, nc[0].name); + } while (!s->started); assert(s->vhost_net != NULL); -- 2.9.0