[v1,1/2] vhost: introduce DMA vchannel unconfiguration
Checks
Commit Message
From: Xuan Ding <xuan.ding@intel.com>
This patch adds a new API rte_vhost_async_dma_unconfigure() to unconfigure
DMA vchannels in vhost async data path.
Signed-off-by: Xuan Ding <xuan.ding@intel.com>
---
doc/guides/prog_guide/vhost_lib.rst | 5 ++++
doc/guides/rel_notes/release_22_11.rst | 2 ++
lib/vhost/rte_vhost_async.h | 17 ++++++++++++
lib/vhost/version.map | 3 +++
lib/vhost/vhost.c | 37 ++++++++++++++++++++++++++
5 files changed, 64 insertions(+)
@@ -323,6 +323,11 @@ The following is an overview of some key Vhost API functions:
Get device type of vDPA device, such as VDPA_DEVICE_TYPE_NET,
VDPA_DEVICE_TYPE_BLK.
+* ``rte_vhost_async_dma_unconfigure(dma_id, vchan_id)``
+
+ Clear DMA vChannels finished to use. This function needs to
+ be called after async unregister.
+
Vhost-user Implementations
--------------------------
@@ -55,6 +55,8 @@ New Features
Also, make sure to start the actual text at the margin.
=======================================================
+* **Added vhost API to unconfigure DMA vchannels.**
+ Added an API which helps to unconfigure DMA vchannels.
Removed Items
-------------
@@ -266,6 +266,23 @@ rte_vhost_async_try_dequeue_burst(int vid, uint16_t queue_id,
struct rte_mempool *mbuf_pool, struct rte_mbuf **pkts, uint16_t count,
int *nr_inflight, int16_t dma_id, uint16_t vchan_id);
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice.
+ *
+ * Unconfigure DMA vChannels in asynchronous data path.
+ *
+ * @param dma_id
+ * the identifier of DMA device
+ * @param vchan_id
+ * the identifier of virtual DMA channel
+ * @return
+ * 0 on success, and -1 on failure
+ */
+__rte_experimental
+int
+rte_vhost_async_dma_unconfigure(int16_t dma_id, uint16_t vchan_id);
+
#ifdef __cplusplus
}
#endif
@@ -96,6 +96,9 @@ EXPERIMENTAL {
rte_vhost_async_try_dequeue_burst;
rte_vhost_driver_get_vdpa_dev_type;
rte_vhost_clear_queue;
+
+ # added in 22.11
+ rte_vhost_async_dma_unconfigure;
};
INTERNAL {
@@ -1863,6 +1863,43 @@ rte_vhost_async_channel_unregister_thread_unsafe(int vid, uint16_t queue_id)
return 0;
}
+int
+rte_vhost_async_dma_unconfigure(int16_t dma_id, uint16_t vchan_id)
+{
+ struct rte_dma_info info;
+ void *pkts_cmpl_flag_addr;
+
+ if (!rte_dma_is_valid(dma_id)) {
+ VHOST_LOG_CONFIG("dma", ERR, "DMA %d is not found.\n", dma_id);
+ return -1;
+ }
+
+ if (rte_dma_info_get(dma_id, &info) != 0) {
+ VHOST_LOG_CONFIG("dma", ERR, "Fail to get DMA %d information.\n", dma_id);
+ return -1;
+ }
+
+ if (vchan_id >= info.max_vchans) {
+ VHOST_LOG_CONFIG("dma", ERR, "Invalid DMA %d vChannel %u.\n", dma_id, vchan_id);
+ return -1;
+ }
+
+ pkts_cmpl_flag_addr = dma_copy_track[dma_id].vchans[vchan_id].pkts_cmpl_flag_addr;
+ if (pkts_cmpl_flag_addr) {
+ rte_free(pkts_cmpl_flag_addr);
+ pkts_cmpl_flag_addr = NULL;
+ }
+
+ if (dma_copy_track[dma_id].vchans) {
+ rte_free(dma_copy_track[dma_id].vchans);
+ dma_copy_track[dma_id].vchans = NULL;
+ }
+
+ dma_copy_track[dma_id].nr_vchans--;
+
+ return 0;
+}
+
int
rte_vhost_async_dma_configure(int16_t dma_id, uint16_t vchan_id)
{