DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD
@ 2022-05-27  3:40 Chengwen Feng
  2022-05-27  3:40 ` [PATCH 1/4] dma/hisilicon: fix return last-idx when no DMA completed Chengwen Feng
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Chengwen Feng @ 2022-05-27  3:40 UTC (permalink / raw)
  To: dev; +Cc: thomas, kevin.laatz, bruce.richardson

This patch contains four patches for Hisilicon DMA PMD. 

Chengwen Feng (4):
  dma/hisilicon: fix return last-idx when no DMA completed
  app/test: support test last-idx when no DMA completed
  dma/hisilicon: enhance robustness of scan CQ
  dma/hisilicon: support vchan-status ops

 app/test/test_dmadev.c              | 15 +++++++++
 drivers/dma/hisilicon/hisi_dmadev.c | 50 ++++++++++++++++++++++++++---
 drivers/dma/hisilicon/hisi_dmadev.h |  7 +++-
 3 files changed, 66 insertions(+), 6 deletions(-)

-- 
2.33.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/4] dma/hisilicon: fix return last-idx when no DMA completed
  2022-05-27  3:40 [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD Chengwen Feng
@ 2022-05-27  3:40 ` Chengwen Feng
  2022-05-27  3:40 ` [PATCH 2/4] app/test: support test " Chengwen Feng
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Chengwen Feng @ 2022-05-27  3:40 UTC (permalink / raw)
  To: dev; +Cc: thomas, kevin.laatz, bruce.richardson

If no DMA request is completed, the ring_idx of the last completed
operation need returned by last_idx parameter. This patch fixes it.

Fixes: 2db4f0b82360 ("dma/hisilicon: add data path")
Cc: stable@dpdk.org

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 drivers/dma/hisilicon/hisi_dmadev.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c
index 9cef2cbfbe..f5c3cd914d 100644
--- a/drivers/dma/hisilicon/hisi_dmadev.c
+++ b/drivers/dma/hisilicon/hisi_dmadev.c
@@ -702,12 +702,12 @@ hisi_dma_completed(void *dev_private,
 		}
 		sq_head = (sq_head + 1) & hw->sq_depth_mask;
 	}
+	*last_idx = hw->cridx + i - 1;
 	if (i > 0) {
 		hw->cridx += i;
-		*last_idx = hw->cridx - 1;
 		hw->sq_head = sq_head;
+		hw->completed += i;
 	}
-	hw->completed += i;
 
 	return i;
 }
@@ -761,12 +761,12 @@ hisi_dma_completed_status(void *dev_private,
 		hw->status[sq_head] = HISI_DMA_STATUS_SUCCESS;
 		sq_head = (sq_head + 1) & hw->sq_depth_mask;
 	}
+	*last_idx = hw->cridx + cpl_num - 1;
 	if (likely(cpl_num > 0)) {
 		hw->cridx += cpl_num;
-		*last_idx = hw->cridx - 1;
 		hw->sq_head = sq_head;
+		hw->completed += cpl_num;
 	}
-	hw->completed += cpl_num;
 
 	return cpl_num;
 }
-- 
2.33.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 2/4] app/test: support test last-idx when no DMA completed
  2022-05-27  3:40 [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD Chengwen Feng
  2022-05-27  3:40 ` [PATCH 1/4] dma/hisilicon: fix return last-idx when no DMA completed Chengwen Feng
@ 2022-05-27  3:40 ` Chengwen Feng
  2022-05-30 11:40   ` Kevin Laatz
  2022-05-27  3:40 ` [PATCH 3/4] dma/hisilicon: enhance robustness of scan CQ Chengwen Feng
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 7+ messages in thread
From: Chengwen Feng @ 2022-05-27  3:40 UTC (permalink / raw)
  To: dev; +Cc: thomas, kevin.laatz, bruce.richardson

If no DMA request is completed, the ring_idx of the last completed
operation need returned by last_idx parameter. This patch adds
testcase for it.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 app/test/test_dmadev.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/app/test/test_dmadev.c b/app/test/test_dmadev.c
index 2b097e0f47..a7651a486f 100644
--- a/app/test/test_dmadev.c
+++ b/app/test/test_dmadev.c
@@ -177,6 +177,7 @@ do_multi_copies(int16_t dev_id, uint16_t vchan,
 static int
 test_enqueue_copies(int16_t dev_id, uint16_t vchan)
 {
+	enum rte_dma_status_code status;
 	unsigned int i;
 	uint16_t id;
 
@@ -215,6 +216,20 @@ test_enqueue_copies(int16_t dev_id, uint16_t vchan)
 			ERR_RETURN("Error:incorrect job id received, %u [expected %u]\n",
 					id, id_count);
 
+		/* check for completed and id when no job done */
+		if (rte_dma_completed(dev_id, vchan, 1, &id, NULL) != 0)
+			ERR_RETURN("Error with rte_dma_completed when no job done\n");
+		if (id != id_count)
+			ERR_RETURN("Error:incorrect job id received when no job done, %u [expected %u]\n",
+					id, id_count);
+
+		/* check for completed_status and id when no job done */
+		if (rte_dma_completed_status(dev_id, vchan, 1, &id, &status) != 0)
+			ERR_RETURN("Error with rte_dma_completed_status when no job done\n");
+		if (id != id_count)
+			ERR_RETURN("Error:incorrect job id received when no job done, %u [expected %u]\n",
+					id, id_count);
+
 		rte_pktmbuf_free(src);
 		rte_pktmbuf_free(dst);
 
-- 
2.33.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 3/4] dma/hisilicon: enhance robustness of scan CQ
  2022-05-27  3:40 [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD Chengwen Feng
  2022-05-27  3:40 ` [PATCH 1/4] dma/hisilicon: fix return last-idx when no DMA completed Chengwen Feng
  2022-05-27  3:40 ` [PATCH 2/4] app/test: support test " Chengwen Feng
@ 2022-05-27  3:40 ` Chengwen Feng
  2022-05-27  3:40 ` [PATCH 4/4] dma/hisilicon: support vchan-status ops Chengwen Feng
  2022-06-07 10:44 ` [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD Thomas Monjalon
  4 siblings, 0 replies; 7+ messages in thread
From: Chengwen Feng @ 2022-05-27  3:40 UTC (permalink / raw)
  To: dev; +Cc: thomas, kevin.laatz, bruce.richardson

The CQ (completion queue) descriptors were updated by hardware, and then
scanned by driver to retrieve hardware completion status.

This patch enhances robustness by following:
1. replace while (true) with a finite loop to avoid potential dead loop.
2. check the csq_head field in CQ descriptor to avoid status array
overflows.

Fixes: 2db4f0b82360 ("dma/hisilicon: add data path")
Cc: stable@dpdk.org

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 drivers/dma/hisilicon/hisi_dmadev.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c
index f5c3cd914d..fbe09284ed 100644
--- a/drivers/dma/hisilicon/hisi_dmadev.c
+++ b/drivers/dma/hisilicon/hisi_dmadev.c
@@ -634,7 +634,7 @@ hisi_dma_scan_cq(struct hisi_dma_dev *hw)
 	uint16_t count = 0;
 	uint64_t misc;
 
-	while (true) {
+	while (count < hw->cq_depth) {
 		cqe = &hw->cqe[cq_head];
 		misc = cqe->misc;
 		misc = rte_le_to_cpu_64(misc);
@@ -642,6 +642,16 @@ hisi_dma_scan_cq(struct hisi_dma_dev *hw)
 			break;
 
 		csq_head = FIELD_GET(CQE_SQ_HEAD_MASK, misc);
+		if (unlikely(csq_head > hw->sq_depth_mask)) {
+			/**
+			 * Defensive programming to prevent overflow of the
+			 * status array indexed by csq_head. Only error logs
+			 * are used for prompting.
+			 */
+			HISI_DMA_ERR(hw, "invalid csq_head:%u!\n", csq_head);
+			count = 0;
+			break;
+		}
 		if (unlikely(misc & CQE_STATUS_MASK))
 			hw->status[csq_head] = FIELD_GET(CQE_STATUS_MASK,
 							 misc);
-- 
2.33.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 4/4] dma/hisilicon: support vchan-status ops
  2022-05-27  3:40 [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD Chengwen Feng
                   ` (2 preceding siblings ...)
  2022-05-27  3:40 ` [PATCH 3/4] dma/hisilicon: enhance robustness of scan CQ Chengwen Feng
@ 2022-05-27  3:40 ` Chengwen Feng
  2022-06-07 10:44 ` [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD Thomas Monjalon
  4 siblings, 0 replies; 7+ messages in thread
From: Chengwen Feng @ 2022-05-27  3:40 UTC (permalink / raw)
  To: dev; +Cc: thomas, kevin.laatz, bruce.richardson

This patch adds support for vchan-status ops.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 drivers/dma/hisilicon/hisi_dmadev.c | 30 +++++++++++++++++++++++++++++
 drivers/dma/hisilicon/hisi_dmadev.h |  7 ++++++-
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c
index fbe09284ed..9494b60779 100644
--- a/drivers/dma/hisilicon/hisi_dmadev.c
+++ b/drivers/dma/hisilicon/hisi_dmadev.c
@@ -461,6 +461,27 @@ hisi_dma_stats_reset(struct rte_dma_dev *dev, uint16_t vchan)
 	return 0;
 }
 
+static int
+hisi_dma_vchan_status(const struct rte_dma_dev *dev, uint16_t vchan,
+		      enum rte_dma_vchan_status *status)
+{
+	struct hisi_dma_dev *hw = dev->data->dev_private;
+	uint32_t val;
+
+	RTE_SET_USED(vchan);
+
+	val = hisi_dma_read_queue(hw, HISI_DMA_QUEUE_FSM_REG);
+	val = FIELD_GET(HISI_DMA_QUEUE_FSM_STS_M, val);
+	if (val == HISI_DMA_STATE_RUN)
+		*status = RTE_DMA_VCHAN_ACTIVE;
+	else if (val == HISI_DMA_STATE_CPL)
+		*status = RTE_DMA_VCHAN_IDLE;
+	else
+		*status = RTE_DMA_VCHAN_HALTED_ERROR;
+
+	return 0;
+}
+
 static void
 hisi_dma_dump_range(struct hisi_dma_dev *hw, FILE *f, uint32_t start,
 		    uint32_t end)
@@ -816,6 +837,14 @@ hisi_dma_gen_dev_name(const struct rte_pci_device *pci_dev,
  *                           dev_stop|          |
  *                                   |          v
  *                                ------------------
+ *                                |      CPL       |
+ *                                ------------------
+ *                                   ^          |
+ *                      hardware     |          |
+ *                      completed all|          |dev_submit
+ *                      descriptors  |          |
+ *                                   |          |
+ *                                ------------------
  *                                |      RUN       |
  *                                ------------------
  *
@@ -829,6 +858,7 @@ static const struct rte_dma_dev_ops hisi_dmadev_ops = {
 	.vchan_setup      = hisi_dma_vchan_setup,
 	.stats_get        = hisi_dma_stats_get,
 	.stats_reset      = hisi_dma_stats_reset,
+	.vchan_status     = hisi_dma_vchan_status,
 	.dev_dump         = hisi_dma_dump,
 };
 
diff --git a/drivers/dma/hisilicon/hisi_dmadev.h b/drivers/dma/hisilicon/hisi_dmadev.h
index 90b85322ca..deb1357eea 100644
--- a/drivers/dma/hisilicon/hisi_dmadev.h
+++ b/drivers/dma/hisilicon/hisi_dmadev.h
@@ -132,11 +132,16 @@ enum {
 
 /**
  * In fact, there are multiple states, but it need to pay attention to
- * the following two states for the driver:
+ * the following three states for the driver:
  */
 enum {
 	HISI_DMA_STATE_IDLE = 0,
 	HISI_DMA_STATE_RUN,
+	/**
+	 * All of the submitted descriptor are finished, and the queue
+	 * is waiting for new descriptors.
+	 */
+	HISI_DMA_STATE_CPL,
 };
 
 /**
-- 
2.33.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/4] app/test: support test last-idx when no DMA completed
  2022-05-27  3:40 ` [PATCH 2/4] app/test: support test " Chengwen Feng
@ 2022-05-30 11:40   ` Kevin Laatz
  0 siblings, 0 replies; 7+ messages in thread
From: Kevin Laatz @ 2022-05-30 11:40 UTC (permalink / raw)
  To: Chengwen Feng, dev; +Cc: thomas, bruce.richardson

Tested with IOAT and IDXD, both pass unit tests.

Tested-by: Kevin Laatz <kevin.laatz@intel.com>

On 27/05/2022 04:40, Chengwen Feng wrote:
> If no DMA request is completed, the ring_idx of the last completed
> operation need returned by last_idx parameter. This patch adds
> testcase for it.
>
> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
> ---
>   app/test/test_dmadev.c | 15 +++++++++++++++
>   1 file changed, 15 insertions(+)
>
> diff --git a/app/test/test_dmadev.c b/app/test/test_dmadev.c
> index 2b097e0f47..a7651a486f 100644
> --- a/app/test/test_dmadev.c
> +++ b/app/test/test_dmadev.c
> @@ -177,6 +177,7 @@ do_multi_copies(int16_t dev_id, uint16_t vchan,
>   static int
>   test_enqueue_copies(int16_t dev_id, uint16_t vchan)
>   {
> +	enum rte_dma_status_code status;
>   	unsigned int i;
>   	uint16_t id;
>   
> @@ -215,6 +216,20 @@ test_enqueue_copies(int16_t dev_id, uint16_t vchan)
>   			ERR_RETURN("Error:incorrect job id received, %u [expected %u]\n",
>   					id, id_count);
>   
> +		/* check for completed and id when no job done */
> +		if (rte_dma_completed(dev_id, vchan, 1, &id, NULL) != 0)
> +			ERR_RETURN("Error with rte_dma_completed when no job done\n");
> +		if (id != id_count)
> +			ERR_RETURN("Error:incorrect job id received when no job done, %u [expected %u]\n",
> +					id, id_count);
> +
> +		/* check for completed_status and id when no job done */
> +		if (rte_dma_completed_status(dev_id, vchan, 1, &id, &status) != 0)
> +			ERR_RETURN("Error with rte_dma_completed_status when no job done\n");
> +		if (id != id_count)
> +			ERR_RETURN("Error:incorrect job id received when no job done, %u [expected %u]\n",
> +					id, id_count);
> +
>   		rte_pktmbuf_free(src);
>   		rte_pktmbuf_free(dst);
>   

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD
  2022-05-27  3:40 [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD Chengwen Feng
                   ` (3 preceding siblings ...)
  2022-05-27  3:40 ` [PATCH 4/4] dma/hisilicon: support vchan-status ops Chengwen Feng
@ 2022-06-07 10:44 ` Thomas Monjalon
  4 siblings, 0 replies; 7+ messages in thread
From: Thomas Monjalon @ 2022-06-07 10:44 UTC (permalink / raw)
  To: Chengwen Feng; +Cc: dev, kevin.laatz, bruce.richardson

27/05/2022 05:40, Chengwen Feng:
> This patch contains four patches for Hisilicon DMA PMD. 
> 
> Chengwen Feng (4):
>   dma/hisilicon: fix return last-idx when no DMA completed
>   app/test: support test last-idx when no DMA completed
>   dma/hisilicon: enhance robustness of scan CQ
>   dma/hisilicon: support vchan-status ops

Series applied, thanks.




^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-06-07 10:44 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-27  3:40 [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD Chengwen Feng
2022-05-27  3:40 ` [PATCH 1/4] dma/hisilicon: fix return last-idx when no DMA completed Chengwen Feng
2022-05-27  3:40 ` [PATCH 2/4] app/test: support test " Chengwen Feng
2022-05-30 11:40   ` Kevin Laatz
2022-05-27  3:40 ` [PATCH 3/4] dma/hisilicon: enhance robustness of scan CQ Chengwen Feng
2022-05-27  3:40 ` [PATCH 4/4] dma/hisilicon: support vchan-status ops Chengwen Feng
2022-06-07 10:44 ` [PATCH 0/4] bugfix and feature for Hisilicon DMA PMD Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).