[1/3] net/ark: add recovery code for lack of mbufs during runtime
diff mbox series

Message ID 1539033410-21422-1-git-send-email-ed.czeck@atomicrules.com
State Changes Requested, archived
Delegated to: Ferruh Yigit
Headers show
Series
  • [1/3] net/ark: add recovery code for lack of mbufs during runtime
Related show

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Ed Czeck Oct. 8, 2018, 9:16 p.m. UTC
Fail with rte_exit() when the lack of mbufs is not recoverable.

Signed-off-by: Ed Czeck <ed.czeck@atomicrules.com>
---
 drivers/net/ark/ark_ethdev_rx.c | 52 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 46 insertions(+), 6 deletions(-)

Comments

Ferruh Yigit Oct. 9, 2018, 3:57 p.m. UTC | #1
On 10/8/2018 10:16 PM, Ed Czeck wrote:
> Fail with rte_exit() when the lack of mbufs is not recoverable.
> 
> Signed-off-by: Ed Czeck <ed.czeck@atomicrules.com>

<...>

> @@ -495,6 +508,33 @@ eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue)
>  	return 0;
>  }
>  
> +int
> +eth_ark_rx_seed_recovery(struct ark_rx_queue *queue,
> +			 uint32_t *pnb,
> +			 struct rte_mbuf **mbufs)
> +{
> +	int status = -1;
> +
> +	/* Ignore small allocation failures */
> +	if (*pnb <= 64)
> +		return -1;
> +
> +	*pnb = 64U;
> +	status = rte_pktmbuf_alloc_bulk(queue->mb_pool, mbufs, *pnb);
> +	if (status != 0) {
> +		PMD_DRV_LOG(ERR,
> +			    "ARK: Could not allocate %u mbufs from pool for RX queue %u;"
> +			    " %u free buffers remaining in queue\n",
> +			    *pnb, queue->queue_index,
> +			    queue->seed_index - queue->cons_index);
> +		if (queue->seed_index - queue->cons_index < 64) {
> +			rte_exit(EXIT_FAILURE,
> +				 "ARK: No mbufs in pool;  do you have a leak?\n");

Hi Ed,

We are trying to get rid of rte_exit() calls, reasoning is DPDK is a library and
application should decide to exit or not, and a DPDK application may be using
multiple NICs/libraries/functionalities, failure in one of them should not cause
all application to exit.

Can you please replace rte_exit() usage?

Patch
diff mbox series

diff --git a/drivers/net/ark/ark_ethdev_rx.c b/drivers/net/ark/ark_ethdev_rx.c
index 16f0d11..77149f6 100644
--- a/drivers/net/ark/ark_ethdev_rx.c
+++ b/drivers/net/ark/ark_ethdev_rx.c
@@ -25,6 +25,9 @@  static uint32_t eth_ark_rx_jumbo(struct ark_rx_queue *queue,
 				 struct rte_mbuf *mbuf0,
 				 uint32_t cons_index);
 static inline int eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue);
+static int eth_ark_rx_seed_recovery(struct ark_rx_queue *queue,
+				    uint32_t *pnb,
+				    struct rte_mbuf **mbufs);
 
 /* ************************************************************************* */
 struct ark_rx_queue {
@@ -196,20 +199,25 @@  eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev,
 	/* populate mbuf reserve */
 	status = eth_ark_rx_seed_mbufs(queue);
 
+	if (queue->seed_index != nb_desc) {
+		PMD_DRV_LOG(ERR, "ARK: Failed to allocate %u mbufs for RX queue %d\n",
+			    nb_desc, qidx);
+		status = -1;
+	}
 	/* MPU Setup */
 	if (status == 0)
 		status = eth_ark_rx_hw_setup(dev, queue, qidx, queue_idx);
 
 	if (unlikely(status != 0)) {
-		struct rte_mbuf *mbuf;
+		struct rte_mbuf **mbuf;
 
 		PMD_DRV_LOG(ERR, "Failed to initialize RX queue %d %s\n",
 			    qidx,
 			    __func__);
 		/* Free the mbufs allocated */
-		for (i = 0, mbuf = queue->reserve_q[0];
-		     i < nb_desc; ++i, mbuf++) {
-			rte_pktmbuf_free(mbuf);
+		for (i = 0, mbuf = queue->reserve_q;
+		     i < queue->seed_index; ++i, mbuf++) {
+			rte_pktmbuf_free(*mbuf);
 		}
 		rte_free(queue->reserve_q);
 		rte_free(queue->paddress_q);
@@ -446,8 +454,13 @@  eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue)
 	struct rte_mbuf **mbufs = &queue->reserve_q[seed_m];
 	int status = rte_pktmbuf_alloc_bulk(queue->mb_pool, mbufs, nb);
 
-	if (unlikely(status != 0))
-		return -1;
+	if (unlikely(status != 0)) {
+		/* Try to recover from lack of mbufs in pool */
+		status = eth_ark_rx_seed_recovery(queue, &nb, mbufs);
+		if (unlikely(status != 0)) {
+			return -1;
+		}
+	}
 
 	if (ARK_RX_DEBUG) {		/* DEBUG */
 		while (count != nb) {
@@ -495,6 +508,33 @@  eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue)
 	return 0;
 }
 
+int
+eth_ark_rx_seed_recovery(struct ark_rx_queue *queue,
+			 uint32_t *pnb,
+			 struct rte_mbuf **mbufs)
+{
+	int status = -1;
+
+	/* Ignore small allocation failures */
+	if (*pnb <= 64)
+		return -1;
+
+	*pnb = 64U;
+	status = rte_pktmbuf_alloc_bulk(queue->mb_pool, mbufs, *pnb);
+	if (status != 0) {
+		PMD_DRV_LOG(ERR,
+			    "ARK: Could not allocate %u mbufs from pool for RX queue %u;"
+			    " %u free buffers remaining in queue\n",
+			    *pnb, queue->queue_index,
+			    queue->seed_index - queue->cons_index);
+		if (queue->seed_index - queue->cons_index < 64) {
+			rte_exit(EXIT_FAILURE,
+				 "ARK: No mbufs in pool;  do you have a leak?\n");
+		}
+	}
+	return status;
+}
+
 void
 eth_ark_rx_dump_queue(struct rte_eth_dev *dev, uint16_t queue_id,
 		      const char *msg)