[v4,7/8] dma/cnxk: add completion ring tail wrap check

Message ID 20230821174942.3165191-7-amitprakashs@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: Jerin Jacob
Headers
Series [v4,1/8] common/cnxk: use unique name for DPI memzone |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Amit Prakash Shukla Aug. 21, 2023, 5:49 p.m. UTC
  From: Vamsi Attunuru <vattunuru@marvell.com>

Adds a check to avoid tail wrap when completion desc ring
is full. Also patch increase max desc size to 2048.

Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

 drivers/dma/cnxk/cnxk_dmadev.c | 22 ++++++++++++++++++++--
 drivers/dma/cnxk/cnxk_dmadev.h |  2 +-
 2 files changed, 21 insertions(+), 3 deletions(-)
  

Patch

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 9fb3bb264a..288606bb3d 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -434,6 +434,11 @@  cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
 
@@ -494,6 +499,11 @@  cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	/*
 	 * For inbound case, src pointers are last pointers.
 	 * For all other cases, src pointers are first pointers.
@@ -561,6 +571,11 @@  cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
 
@@ -613,6 +628,11 @@  cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
 	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
 	fptr = &src[0];
@@ -695,8 +715,6 @@  cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(last_idx);
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		comp_ptr = c_desc->compl_ptr[c_desc->head];
 		status[cnt] = comp_ptr->cdata;
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index f375143b16..9c6c898d23 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -9,7 +9,7 @@ 
 #define DPI_MAX_POINTER	     15
 #define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC	     1024
+#define DPI_MAX_DESC	     2048
 #define DPI_MIN_DESC	     2
 #define MAX_VCHANS_PER_QUEUE 4