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 void vhost_user_stop(VhostUserState *s) { if (vhost_user_running(s)) { vhost_net_cleanup(s->vhost_net); } s->vhost_net = 0; }
static void vhost_user_cleanup(NetClientState *nc) { VhostUserState *s = DO_UPCAST(VhostUserState, nc, nc); if (s->vhost_net) { vhost_net_cleanup(s->vhost_net); s->vhost_net = NULL; } qemu_purge_queued_packets(nc); }
static void vhost_user_cleanup(NetClientState *nc) { VhostUserState *s = DO_UPCAST(VhostUserState, nc, nc); if (s->vhost_net) { vhost_net_cleanup(s->vhost_net); g_free(s->vhost_net); s->vhost_net = NULL; } if (nc->queue_index == 0) { qemu_chr_fe_deinit(&s->chr); } qemu_purge_queued_packets(nc); }
static void vhost_user_cleanup(NetClientState *nc) { VhostUserState *s = DO_UPCAST(VhostUserState, nc, nc); if (s->vhost_net) { vhost_net_cleanup(s->vhost_net); s->vhost_net = NULL; } if (s->chr) { qemu_chr_add_handlers(s->chr, NULL, NULL, NULL, NULL); qemu_chr_fe_release(s->chr); s->chr = NULL; } qemu_purge_queued_packets(nc); }
static void tap_cleanup(VLANClientState *nc) { TAPState *s = DO_UPCAST(TAPState, nc, nc); if (s->vhost_net) { vhost_net_cleanup(s->vhost_net); } qemu_purge_queued_packets(nc); if (s->down_script[0]) launch_script(s->down_script, s->down_script_arg, s->fd); tap_read_poll(s, 0); tap_write_poll(s, 0); close(s->fd); }
static void vhost_user_cleanup(NetClientState *nc) { NetVhostUserState *s = DO_UPCAST(NetVhostUserState, nc, nc); if (s->vhost_net) { vhost_net_cleanup(s->vhost_net); g_free(s->vhost_net); s->vhost_net = NULL; } if (nc->queue_index == 0) { if (s->watch) { g_source_remove(s->watch); s->watch = 0; } qemu_chr_fe_deinit(&s->chr, true); } qemu_purge_queued_packets(nc); }
static void tap_cleanup(NetClientState *nc) { TAPState *s = DO_UPCAST(TAPState, nc, nc); if (s->vhost_net) { vhost_net_cleanup(s->vhost_net); s->vhost_net = NULL; } qemu_purge_queued_packets(nc); tap_exit_notify(&s->exit, NULL); qemu_remove_exit_notifier(&s->exit); tap_read_poll(s, false); tap_write_poll(s, false); close(s->fd); s->fd = -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_DRIVER_VHOST_USER); s = DO_UPCAST(VhostUserState, nc, ncs[i]); if (s->vhost_net) { /* save acked features */ uint64_t features = vhost_net_get_acked_features(s->vhost_net); if (features) { s->acked_features = features; } vhost_net_cleanup(s->vhost_net); } } }
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; } } }
static void tap_cleanup(NetClientState *nc) { TAPState *s = DO_UPCAST(TAPState, nc, nc); Error *err = NULL; if (s->vhost_net) { vhost_net_cleanup(s->vhost_net); s->vhost_net = NULL; } qemu_purge_queued_packets(nc); if (s->down_script[0]) { launch_script(s->down_script, s->down_script_arg, s->fd, &err); if (err) { error_report_err(err); } } tap_read_poll(s, false); tap_write_poll(s, false); close(s->fd); s->fd = -1; }