1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2020 Intel Corporation
5 #ifndef _RTE_VHOST_ASYNC_H_
6 #define _RTE_VHOST_ASYNC_H_
13 struct rte_vhost_iov_iter {
14 /** offset to the first byte of interesting data */
16 /** total bytes of data in this iterator */
18 /** pointer to the iovec array */
20 /** number of iovec in this iterator */
21 unsigned long nr_segs;
25 * dma transfer descriptor pair
27 struct rte_vhost_async_desc {
28 /** source memory iov_iter */
29 struct rte_vhost_iov_iter *src;
30 /** destination memory iov_iter */
31 struct rte_vhost_iov_iter *dst;
37 struct rte_vhost_async_status {
38 /** An array of application specific data for source memory */
39 uintptr_t *src_opaque_data;
40 /** An array of application specific data for destination memory */
41 uintptr_t *dst_opaque_data;
45 * dma operation callbacks to be implemented by applications
47 struct rte_vhost_async_channel_ops {
49 * instruct async engines to perform copies for a batch of packets
52 * id of vhost device to perform data copies
54 * queue id to perform data copies
56 * an array of DMA transfer memory descriptors
58 * opaque data pair sending to DMA engine
60 * number of elements in the "descs" array
62 * number of descs processed, negative value means error
64 int32_t (*transfer_data)(int vid, uint16_t queue_id,
65 struct rte_vhost_async_desc *descs,
66 struct rte_vhost_async_status *opaque_data,
69 * check copy-completed packets from the async engine
71 * id of vhost device to check copy completion
73 * queue id to check copy completion
75 * buffer to receive the opaque data pair from DMA engine
77 * max number of packets could be completed
79 * number of async descs completed, negative value means error
81 int32_t (*check_completed_copies)(int vid, uint16_t queue_id,
82 struct rte_vhost_async_status *opaque_data,
83 uint16_t max_packets);
87 * inflight async packet information
89 struct async_inflight_info {
90 struct rte_mbuf *mbuf;
91 uint16_t descs; /* num of descs inflight */
92 uint16_t nr_buffers; /* num of buffers inflight for packed ring */
96 * async channel features
99 RTE_VHOST_ASYNC_INORDER = 1U << 0,
103 * async channel configuration
105 struct rte_vhost_async_config {
111 * Register an async channel for a vhost queue
114 * vhost device id async channel to be attached to
116 * vhost queue id async channel to be attached to
118 * Async channel configuration structure
120 * Async channel operation callbacks
122 * 0 on success, -1 on failures
125 int rte_vhost_async_channel_register(int vid, uint16_t queue_id,
126 struct rte_vhost_async_config config,
127 struct rte_vhost_async_channel_ops *ops);
130 * Unregister an async channel for a vhost queue
133 * vhost device id async channel to be detached from
135 * vhost queue id async channel to be detached from
137 * 0 on success, -1 on failures
140 int rte_vhost_async_channel_unregister(int vid, uint16_t queue_id);
143 * Register an async channel for a vhost queue without performing any
146 * @note This function does not perform any locking, and is only safe to
147 * call in vhost callback functions.
150 * vhost device id async channel to be attached to
152 * vhost queue id async channel to be attached to
154 * Async channel configuration
156 * Async channel operation callbacks
158 * 0 on success, -1 on failures
161 int rte_vhost_async_channel_register_thread_unsafe(int vid, uint16_t queue_id,
162 struct rte_vhost_async_config config,
163 struct rte_vhost_async_channel_ops *ops);
166 * Unregister an async channel for a vhost queue without performing any
169 * @note This function does not perform any locking, and is only safe to
170 * call in vhost callback functions.
173 * vhost device id async channel to be detached from
175 * vhost queue id async channel to be detached from
177 * 0 on success, -1 on failures
180 int rte_vhost_async_channel_unregister_thread_unsafe(int vid,
184 * This function submits enqueue packets to async copy engine. Users
185 * need to poll transfer status by rte_vhost_poll_enqueue_completed()
186 * for successfully enqueued packets.
189 * id of vhost device to enqueue data
191 * queue id to enqueue data
193 * array of packets to be enqueued
195 * packets num to be enqueued
197 * num of packets enqueued
200 uint16_t rte_vhost_submit_enqueue_burst(int vid, uint16_t queue_id,
201 struct rte_mbuf **pkts, uint16_t count);
204 * This function checks async completion status for a specific vhost
205 * device queue. Packets which finish copying (enqueue) operation
206 * will be returned in an array.
209 * id of vhost device to enqueue data
211 * queue id to enqueue data
213 * blank array to get return packet pointer
215 * size of the packet array
217 * num of packets returned
220 uint16_t rte_vhost_poll_enqueue_completed(int vid, uint16_t queue_id,
221 struct rte_mbuf **pkts, uint16_t count);
224 * This function returns the amount of in-flight packets for the vhost
225 * queue which uses async channel acceleration.
228 * id of vhost device to enqueue data
230 * queue id to enqueue data
232 * the amount of in-flight packets on success; -1 on failure
235 int rte_vhost_async_get_inflight(int vid, uint16_t queue_id);
238 * This function checks async completion status and clear packets for
239 * a specific vhost device queue. Packets which are inflight will be
240 * returned in an array.
242 * @note This function does not perform any locking
245 * ID of vhost device to clear data
247 * Queue id to clear data
249 * Blank array to get return packet pointer
251 * Size of the packet array
253 * Number of packets returned
256 uint16_t rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id,
257 struct rte_mbuf **pkts, uint16_t count);
259 #endif /* _RTE_VHOST_ASYNC_H_ */