static int vhost_user_start(int queues, NetClientState *ncs[], CharBackend *be) { VhostNetOptions options; struct vhost_net *net = NULL; NetVhostUserState *s; int max_queues; int i; options.backend_type = VHOST_BACKEND_TYPE_USER; for (i = 0; i < queues; i++) { assert(ncs[i]->info->type == NET_CLIENT_DRIVER_VHOST_USER); s = DO_UPCAST(NetVhostUserState, nc, ncs[i]); options.net_backend = ncs[i]; options.opaque = be; options.busyloop_timeout = 0; net = vhost_net_init(&options); if (!net) { error_report("failed to init vhost_net for queue %d", i); goto err; } if (i == 0) { max_queues = vhost_net_get_max_queues(net); if (queues > max_queues) { error_report("you are asking more queues than supported: %d", max_queues); goto err; } } if (s->vhost_net) { vhost_net_cleanup(s->vhost_net); g_free(s->vhost_net); } s->vhost_net = net; } return 0; err: if (net) { vhost_net_cleanup(net); g_free(net); } vhost_user_stop(i, ncs); return -1; }
static int vhost_user_start(int queues, NetClientState *ncs[]) { VhostNetOptions options; VhostUserState *s; int max_queues; int i; options.backend_type = VHOST_BACKEND_TYPE_USER; for (i = 0; i < queues; i++) { assert (ncs[i]->info->type == NET_CLIENT_OPTIONS_KIND_VHOST_USER); s = DO_UPCAST(VhostUserState, nc, ncs[i]); if (vhost_user_running(s)) { continue; } options.net_backend = ncs[i]; options.opaque = s->chr; s->vhost_net = vhost_net_init(&options); if (!s->vhost_net) { error_report("failed to init vhost_net for queue %d\n", i); goto err; } if (i == 0) { max_queues = vhost_net_get_max_queues(s->vhost_net); if (queues > max_queues) { error_report("you are asking more queues than " "supported: %d\n", max_queues); goto err; } } } return 0; err: vhost_user_stop(i + 1, ncs); return -1; }