static int vhost_user_start(VhostUserState *s) { VhostNetOptions options; if (vhost_user_running(s)) { return 0; } options.backend_type = VHOST_BACKEND_TYPE_USER; options.net_backend = &s->nc; options.opaque = s->chr; s->vhost_net = vhost_net_init(&options); return vhost_user_running(s) ? 0 : -1; }
static void vhost_user_stop(VhostUserState *s) { if (vhost_user_running(s)) { vhost_net_cleanup(s->vhost_net); } s->vhost_net = 0; }
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; }
static void vhost_user_stop(int queues, NetClientState *ncs[]) { VhostUserState *s; int i; 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; } if (s->vhost_net) { /* save acked features */ s->acked_features = vhost_net_get_acked_features(s->vhost_net); vhost_net_cleanup(s->vhost_net); s->vhost_net = NULL; } } }