6b3c81db8b
Current async ops allows check_completed_copies() callback to return arbitrary number of async iov segments finished from backend async devices. This design creates complexity for vhost to handle breaking transfer of a single packet (i.e. transfer completes in the middle of a async descriptor) and prevents application callbacks from leveraging hardware capability to offload the work. Thus, this patch enforces the check_completed_copies() callback to return the number of async memory descriptors, which is aligned with async transfer data ops callbacks. vhost async data path are revised to work with new ops define, which provides a clean and simplified processing. Signed-off-by: Patrick Fu <patrick.fu@intel.com> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
190 lines
4.6 KiB
C
190 lines
4.6 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2020 Intel Corporation
|
|
*/
|
|
|
|
#ifndef _RTE_VHOST_ASYNC_H_
|
|
#define _RTE_VHOST_ASYNC_H_
|
|
|
|
#include "rte_vhost.h"
|
|
|
|
/**
|
|
* iovec iterator
|
|
*/
|
|
struct rte_vhost_iov_iter {
|
|
/** offset to the first byte of interesting data */
|
|
size_t offset;
|
|
/** total bytes of data in this iterator */
|
|
size_t count;
|
|
/** pointer to the iovec array */
|
|
struct iovec *iov;
|
|
/** number of iovec in this iterator */
|
|
unsigned long nr_segs;
|
|
};
|
|
|
|
/**
|
|
* dma transfer descriptor pair
|
|
*/
|
|
struct rte_vhost_async_desc {
|
|
/** source memory iov_iter */
|
|
struct rte_vhost_iov_iter *src;
|
|
/** destination memory iov_iter */
|
|
struct rte_vhost_iov_iter *dst;
|
|
};
|
|
|
|
/**
|
|
* dma transfer status
|
|
*/
|
|
struct rte_vhost_async_status {
|
|
/** An array of application specific data for source memory */
|
|
uintptr_t *src_opaque_data;
|
|
/** An array of application specific data for destination memory */
|
|
uintptr_t *dst_opaque_data;
|
|
};
|
|
|
|
/**
|
|
* dma operation callbacks to be implemented by applications
|
|
*/
|
|
struct rte_vhost_async_channel_ops {
|
|
/**
|
|
* instruct async engines to perform copies for a batch of packets
|
|
*
|
|
* @param vid
|
|
* id of vhost device to perform data copies
|
|
* @param queue_id
|
|
* queue id to perform data copies
|
|
* @param descs
|
|
* an array of DMA transfer memory descriptors
|
|
* @param opaque_data
|
|
* opaque data pair sending to DMA engine
|
|
* @param count
|
|
* number of elements in the "descs" array
|
|
* @return
|
|
* number of descs processed
|
|
*/
|
|
uint32_t (*transfer_data)(int vid, uint16_t queue_id,
|
|
struct rte_vhost_async_desc *descs,
|
|
struct rte_vhost_async_status *opaque_data,
|
|
uint16_t count);
|
|
/**
|
|
* check copy-completed packets from the async engine
|
|
* @param vid
|
|
* id of vhost device to check copy completion
|
|
* @param queue_id
|
|
* queue id to check copy completion
|
|
* @param opaque_data
|
|
* buffer to receive the opaque data pair from DMA engine
|
|
* @param max_packets
|
|
* max number of packets could be completed
|
|
* @return
|
|
* number of async descs completed
|
|
*/
|
|
uint32_t (*check_completed_copies)(int vid, uint16_t queue_id,
|
|
struct rte_vhost_async_status *opaque_data,
|
|
uint16_t max_packets);
|
|
};
|
|
|
|
/**
|
|
* inflight async packet information
|
|
*/
|
|
struct async_inflight_info {
|
|
union {
|
|
uint32_t info;
|
|
struct {
|
|
uint16_t descs; /* num of descs inflight */
|
|
uint16_t segs; /* iov segs inflight */
|
|
};
|
|
};
|
|
};
|
|
|
|
/**
|
|
* dma channel feature bit definition
|
|
*/
|
|
struct rte_vhost_async_features {
|
|
union {
|
|
uint32_t intval;
|
|
struct {
|
|
uint32_t async_inorder:1;
|
|
uint32_t resvd_0:15;
|
|
uint32_t async_threshold:12;
|
|
uint32_t resvd_1:4;
|
|
};
|
|
};
|
|
};
|
|
|
|
/**
|
|
* register a async channel for vhost
|
|
*
|
|
* @param vid
|
|
* vhost device id async channel to be attached to
|
|
* @param queue_id
|
|
* vhost queue id async channel to be attached to
|
|
* @param features
|
|
* DMA channel feature bit
|
|
* b0 : DMA supports inorder data transfer
|
|
* b1 - b15: reserved
|
|
* b16 - b27: Packet length threshold for DMA transfer
|
|
* b28 - b31: reserved
|
|
* @param ops
|
|
* DMA operation callbacks
|
|
* @return
|
|
* 0 on success, -1 on failures
|
|
*/
|
|
__rte_experimental
|
|
int rte_vhost_async_channel_register(int vid, uint16_t queue_id,
|
|
uint32_t features, struct rte_vhost_async_channel_ops *ops);
|
|
|
|
/**
|
|
* unregister a dma channel for vhost
|
|
*
|
|
* @param vid
|
|
* vhost device id DMA channel to be detached
|
|
* @param queue_id
|
|
* vhost queue id DMA channel to be detached
|
|
* @return
|
|
* 0 on success, -1 on failures
|
|
*/
|
|
__rte_experimental
|
|
int rte_vhost_async_channel_unregister(int vid, uint16_t queue_id);
|
|
|
|
/**
|
|
* This function submit enqueue data to async engine. This function has
|
|
* no guranttee to the transfer completion upon return. Applications
|
|
* should poll transfer status by rte_vhost_poll_enqueue_completed()
|
|
*
|
|
* @param vid
|
|
* id of vhost device to enqueue data
|
|
* @param queue_id
|
|
* queue id to enqueue data
|
|
* @param pkts
|
|
* array of packets to be enqueued
|
|
* @param count
|
|
* packets num to be enqueued
|
|
* @return
|
|
* num of packets enqueued
|
|
*/
|
|
__rte_experimental
|
|
uint16_t rte_vhost_submit_enqueue_burst(int vid, uint16_t queue_id,
|
|
struct rte_mbuf **pkts, uint16_t count);
|
|
|
|
/**
|
|
* This function check async completion status for a specific vhost
|
|
* device queue. Packets which finish copying (enqueue) operation
|
|
* will be returned in an array.
|
|
*
|
|
* @param vid
|
|
* id of vhost device to enqueue data
|
|
* @param queue_id
|
|
* queue id to enqueue data
|
|
* @param pkts
|
|
* blank array to get return packet pointer
|
|
* @param count
|
|
* size of the packet array
|
|
* @return
|
|
* num of packets returned
|
|
*/
|
|
__rte_experimental
|
|
uint16_t rte_vhost_poll_enqueue_completed(int vid, uint16_t queue_id,
|
|
struct rte_mbuf **pkts, uint16_t count);
|
|
|
|
#endif /* _RTE_VHOST_ASYNC_H_ */
|