Lines Matching refs:server

90 void vhost_user_server_inc_in_flight(VuServer *server)  in vhost_user_server_inc_in_flight()  argument
92 assert(!server->wait_idle); in vhost_user_server_inc_in_flight()
93 qatomic_inc(&server->in_flight); in vhost_user_server_inc_in_flight()
96 void vhost_user_server_dec_in_flight(VuServer *server) in vhost_user_server_dec_in_flight() argument
98 if (qatomic_fetch_dec(&server->in_flight) == 1) { in vhost_user_server_dec_in_flight()
99 if (server->wait_idle) { in vhost_user_server_dec_in_flight()
100 aio_co_wake(server->co_trip); in vhost_user_server_dec_in_flight()
105 bool vhost_user_server_has_in_flight(VuServer *server) in vhost_user_server_has_in_flight() argument
107 return qatomic_load_acquire(&server->in_flight) > 0; in vhost_user_server_has_in_flight()
120 VuServer *server = container_of(vu_dev, VuServer, vu_dev); in vu_message_read() local
121 QIOChannel *ioc = server->ioc; in vu_message_read()
142 if (server->ctx) { in vu_message_read()
143 server->in_qio_channel_yield = true; in vu_message_read()
145 server->in_qio_channel_yield = false; in vu_message_read()
212 VuServer *server = opaque; in vu_client_trip() local
213 VuDev *vu_dev = &server->vu_dev; in vu_client_trip()
216 if (server->quiescing) { in vu_client_trip()
217 server->co_trip = NULL; in vu_client_trip()
222 if (!vu_dispatch(vu_dev) && server->ctx) { in vu_client_trip()
227 if (vhost_user_server_has_in_flight(server)) { in vu_client_trip()
229 server->wait_idle = true; in vu_client_trip()
231 server->wait_idle = false; in vu_client_trip()
233 assert(!vhost_user_server_has_in_flight(server)); in vu_client_trip()
238 assert(QTAILQ_EMPTY(&server->vu_fd_watches)); in vu_client_trip()
240 object_unref(OBJECT(server->sioc)); in vu_client_trip()
241 server->sioc = NULL; in vu_client_trip()
243 object_unref(OBJECT(server->ioc)); in vu_client_trip()
244 server->ioc = NULL; in vu_client_trip()
246 server->co_trip = NULL; in vu_client_trip()
247 if (server->restart_listener_bh) { in vu_client_trip()
248 qemu_bh_schedule(server->restart_listener_bh); in vu_client_trip()
269 VuServer *server = container_of(vu_dev, VuServer, vu_dev); in kick_handler() local
271 qio_channel_shutdown(server->ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); in kick_handler()
275 static VuFdWatch *find_vu_fd_watch(VuServer *server, int fd) in find_vu_fd_watch() argument
279 QTAILQ_FOREACH_SAFE(vu_fd_watch, &server->vu_fd_watches, next, next) { in find_vu_fd_watch()
292 VuServer *server = container_of(vu_dev, VuServer, vu_dev); in set_watch() local
297 VuFdWatch *vu_fd_watch = find_vu_fd_watch(server, fd); in set_watch()
302 QTAILQ_INSERT_TAIL(&server->vu_fd_watches, vu_fd_watch, next); in set_watch()
307 aio_set_fd_handler(server->ctx, fd, kick_handler, in set_watch()
317 VuServer *server; in remove_watch() local
321 server = container_of(vu_dev, VuServer, vu_dev); in remove_watch()
323 VuFdWatch *vu_fd_watch = find_vu_fd_watch(server, fd); in remove_watch()
328 aio_set_fd_handler(server->ctx, fd, NULL, NULL, NULL, NULL, NULL); in remove_watch()
330 QTAILQ_REMOVE(&server->vu_fd_watches, vu_fd_watch, next); in remove_watch()
338 VuServer *server = opaque; in vu_accept() local
340 if (server->sioc) { in vu_accept()
346 if (!vu_init(&server->vu_dev, server->max_queues, sioc->fd, panic_cb, in vu_accept()
347 vu_message_read, set_watch, remove_watch, server->vu_iface)) { in vu_accept()
356 qio_net_listener_set_client_func(server->listener, in vu_accept()
360 server->sioc = sioc; in vu_accept()
365 object_ref(OBJECT(server->sioc)); in vu_accept()
367 server->ioc = QIO_CHANNEL(sioc); in vu_accept()
368 object_ref(OBJECT(server->ioc)); in vu_accept()
371 qio_channel_set_blocking(server->ioc, false, NULL); in vu_accept()
373 qio_channel_set_follow_coroutine_ctx(server->ioc, true); in vu_accept()
375 vhost_user_server_attach_aio_context(server, server->ctx); in vu_accept()
379 void vhost_user_server_stop(VuServer *server) in vhost_user_server_stop() argument
381 qemu_bh_delete(server->restart_listener_bh); in vhost_user_server_stop()
382 server->restart_listener_bh = NULL; in vhost_user_server_stop()
384 if (server->sioc) { in vhost_user_server_stop()
387 QTAILQ_FOREACH(vu_fd_watch, &server->vu_fd_watches, next) { in vhost_user_server_stop()
388 aio_set_fd_handler(server->ctx, vu_fd_watch->fd, in vhost_user_server_stop()
392 qio_channel_shutdown(server->ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); in vhost_user_server_stop()
394 AIO_WAIT_WHILE(server->ctx, server->co_trip); in vhost_user_server_stop()
397 if (server->listener) { in vhost_user_server_stop()
398 qio_net_listener_disconnect(server->listener); in vhost_user_server_stop()
399 object_unref(OBJECT(server->listener)); in vhost_user_server_stop()
409 VuServer *server = opaque; in restart_listener_bh() local
411 qio_net_listener_set_client_func(server->listener, vu_accept, server, in restart_listener_bh()
416 void vhost_user_server_attach_aio_context(VuServer *server, AioContext *ctx) in vhost_user_server_attach_aio_context() argument
420 server->ctx = ctx; in vhost_user_server_attach_aio_context()
422 if (!server->sioc) { in vhost_user_server_attach_aio_context()
426 QTAILQ_FOREACH(vu_fd_watch, &server->vu_fd_watches, next) { in vhost_user_server_attach_aio_context()
431 if (server->co_trip) { in vhost_user_server_attach_aio_context()
441 AioContext *co_ctx = qemu_coroutine_get_aio_context(server->co_trip); in vhost_user_server_attach_aio_context()
443 assert(!server->quiescing); in vhost_user_server_attach_aio_context()
446 server->co_trip = qemu_coroutine_create(vu_client_trip, server); in vhost_user_server_attach_aio_context()
447 assert(!server->in_qio_channel_yield); in vhost_user_server_attach_aio_context()
448 aio_co_schedule(ctx, server->co_trip); in vhost_user_server_attach_aio_context()
453 void vhost_user_server_detach_aio_context(VuServer *server) in vhost_user_server_detach_aio_context() argument
455 if (server->sioc) { in vhost_user_server_detach_aio_context()
458 QTAILQ_FOREACH(vu_fd_watch, &server->vu_fd_watches, next) { in vhost_user_server_detach_aio_context()
459 aio_set_fd_handler(server->ctx, vu_fd_watch->fd, in vhost_user_server_detach_aio_context()
464 server->ctx = NULL; in vhost_user_server_detach_aio_context()
466 if (server->ioc) { in vhost_user_server_detach_aio_context()
467 if (server->in_qio_channel_yield) { in vhost_user_server_detach_aio_context()
469 qio_channel_wake_read(server->ioc); in vhost_user_server_detach_aio_context()
474 bool vhost_user_server_start(VuServer *server, in vhost_user_server_start() argument
497 bh = qemu_bh_new(restart_listener_bh, server); in vhost_user_server_start()
500 *server = (VuServer) { in vhost_user_server_start()
508 qio_net_listener_set_name(server->listener, "vhost-user-backend-listener"); in vhost_user_server_start()
510 qio_net_listener_set_client_func(server->listener, in vhost_user_server_start()
512 server, in vhost_user_server_start()
515 QTAILQ_INIT(&server->vu_fd_watches); in vhost_user_server_start()