2 * Sharing QEMU devices via vhost-user protocol
4 * Copyright (c) Coiby Xu <coiby.xu@gmail.com>.
5 * Copyright (c) 2020 Red Hat, Inc.
7 * This work is licensed under the terms of the GNU GPL, version 2 or
8 * later. See the COPYING file in the top-level directory.
11 #ifndef VHOST_USER_SERVER_H
12 #define VHOST_USER_SERVER_H
14 #include "contrib/libvhost-user/libvhost-user.h"
15 #include "io/channel-socket.h"
16 #include "io/channel-file.h"
17 #include "io/net-listener.h"
18 #include "qemu/error-report.h"
19 #include "qapi/error.h"
20 #include "standard-headers/linux/virtio_blk.h"
22 /* A kick fd that we monitor on behalf of libvhost-user */
23 typedef struct VuFdWatch
{
28 QTAILQ_ENTRY(VuFdWatch
) next
;
33 * A vhost-user server instance with user-defined VuDevIface callbacks.
34 * Vhost-user device backends can be implemented using VuServer. VuDevIface
35 * callbacks and virtqueue kicks run in the given AioContext.
38 QIONetListener
*listener
;
39 QEMUBH
*restart_listener_bh
;
42 const VuDevIface
*vu_iface
;
44 /* Protected by ctx lock */
46 QIOChannel
*ioc
; /* The I/O channel with the client */
47 QIOChannelSocket
*sioc
; /* The underlying data channel with the client */
48 QTAILQ_HEAD(, VuFdWatch
) vu_fd_watches
;
50 Coroutine
*co_trip
; /* coroutine for processing VhostUserMsg */
53 bool vhost_user_server_start(VuServer
*server
,
54 SocketAddress
*unix_socket
,
57 const VuDevIface
*vu_iface
,
60 void vhost_user_server_stop(VuServer
*server
);
62 void vhost_user_server_attach_aio_context(VuServer
*server
, AioContext
*ctx
);
63 void vhost_user_server_detach_aio_context(VuServer
*server
);
65 #endif /* VHOST_USER_SERVER_H */