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 "subprojects/libvhost-user/libvhost-user.h" /* only for the type definitions */
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 */
45 unsigned int refcount
;
48 QIOChannel
*ioc
; /* The I/O channel with the client */
49 QIOChannelSocket
*sioc
; /* The underlying data channel with the client */
50 QTAILQ_HEAD(, VuFdWatch
) vu_fd_watches
;
52 Coroutine
*co_trip
; /* coroutine for processing VhostUserMsg */
55 bool vhost_user_server_start(VuServer
*server
,
56 SocketAddress
*unix_socket
,
59 const VuDevIface
*vu_iface
,
62 void vhost_user_server_stop(VuServer
*server
);
64 void vhost_user_server_ref(VuServer
*server
);
65 void vhost_user_server_unref(VuServer
*server
);
67 void vhost_user_server_attach_aio_context(VuServer
*server
, AioContext
*ctx
);
68 void vhost_user_server_detach_aio_context(VuServer
*server
);
70 #endif /* VHOST_USER_SERVER_H */