[dpdk-dev] [PATCH v3] app/test: fix reorder test failure

Hunt, David david.hunt at intel.com
Thu May 3 19:02:39 CEST 2018


Hi Reshma,


On 3/5/2018 5:36 PM, Reshma Pattan wrote:
> mbufs are being freed twice in error, once in rte_mempool_put_bulk()
> and then in rte_reorder_free(). Refactor the code so that we use
> rte_reorder_free() to free mbufs in the reorder buffer, and use
> rte_pktmbuf_free() to free any unused or drained mbufs.
>
> Fixes: d0c9b58d71 ("app/test: new reorder unit test")
> Cc: stable at dpdk.org backport
> Cc: david.hunt at intel.com
> Signed-off-by: Reshma Pattan <reshma.pattan at intel.com>
> ---
> v3
> fix the indentation
> ---
>   test/test/test_reorder.c | 35 +++++++++++++++++++++++++----------
>   1 file changed, 25 insertions(+), 10 deletions(-)
>
> diff --git a/test/test/test_reorder.c b/test/test/test_reorder.c
> index 65e4f38b2..b7f664f66 100644
> --- a/test/test/test_reorder.c
> +++ b/test/test/test_reorder.c
> @@ -146,11 +146,11 @@ test_reorder_insert(void)
>   	b = rte_reorder_create("test_insert", rte_socket_id(), size);
>   	TEST_ASSERT_NOT_NULL(b, "Failed to create reorder buffer");
>   
> -	ret = rte_mempool_get_bulk(p, (void *)bufs, num_bufs);
> -	TEST_ASSERT_SUCCESS(ret, "Error getting mbuf from pool");
> -
> -	for (i = 0; i < num_bufs; i++)
> +	for (i = 0; i < num_bufs; i++) {
> +		bufs[i] = rte_pktmbuf_alloc(p);
> +		TEST_ASSERT_NOT_NULL(bufs[i], "Packet allocation failed\n");
>   		bufs[i]->seqn = i;
> +	}
>   
>   	/* This should fill up order buffer:
>   	 * reorder_seq = 0
> @@ -165,6 +165,7 @@ test_reorder_insert(void)
>   			ret = -1;
>   			goto exit;
>   		}
> +		bufs[i] = NULL;
>   	}
>   
>   	/* early packet - should move mbufs to ready buf and move sequence window
> @@ -179,6 +180,7 @@ test_reorder_insert(void)
>   		ret = -1;
>   		goto exit;
>   	}
> +	bufs[4] = NULL;
>   
>   	/* early packet from current sequence window - full ready buffer */
>   	bufs[5]->seqn = 2 * size;
> @@ -189,6 +191,7 @@ test_reorder_insert(void)
>   		ret = -1;
>   		goto exit;
>   	}
> +	bufs[5] = NULL;
>   
>   	/* late packet */
>   	bufs[6]->seqn = 3 * size;
> @@ -199,11 +202,15 @@ test_reorder_insert(void)
>   		ret = -1;
>   		goto exit;
>   	}
> +	bufs[6] = NULL;
>   
>   	ret = 0;
>   exit:
> -	rte_mempool_put_bulk(p, (void *)bufs, num_bufs);
>   	rte_reorder_free(b);
> +	for (i = 0; i < num_bufs; i++) {
> +		if (bufs[i] != NULL)
> +			rte_pktmbuf_free(bufs[i]);
> +	}
>   	return ret;
>   }
>   
> @@ -227,9 +234,6 @@ test_reorder_drain(void)
>   	b = rte_reorder_create("test_drain", rte_socket_id(), size);
>   	TEST_ASSERT_NOT_NULL(b, "Failed to create reorder buffer");
>   
> -	ret = rte_mempool_get_bulk(p, (void *)bufs, num_bufs);
> -	TEST_ASSERT_SUCCESS(ret, "Error getting mbuf from pool");
> -
>   	/* Check no drained packets if reorder is empty */
>   	cnt = rte_reorder_drain(b, robufs, 1);
>   	if (cnt != 0) {
> @@ -239,8 +243,11 @@ test_reorder_drain(void)
>   		goto exit;
>   	}
>   
> -	for (i = 0; i < num_bufs; i++)
> +	for (i = 0; i < num_bufs; i++) {
> +		bufs[i] = rte_pktmbuf_alloc(p);
> +		TEST_ASSERT_NOT_NULL(bufs[i], "Packet allocation failed\n");
>   		bufs[i]->seqn = i;
> +	}
>   
>   	/* Insert packet with seqn 1:
>   	 * reorder_seq = 0
> @@ -248,6 +255,7 @@ test_reorder_drain(void)
>   	 * OB[] = {1, NULL, NULL, NULL}
>   	 */
>   	rte_reorder_insert(b, bufs[1]);
> +	bufs[1] = NULL;
>   
>   	cnt = rte_reorder_drain(b, robufs, 1);

I think we need a loop here to pktmbuf_free() each of the mbufs in the 
robufs array that was populated by the drain() function.


>   	if (cnt != 1) {
> @@ -263,18 +271,22 @@ test_reorder_drain(void)
>   	 */
>   	rte_reorder_insert(b, bufs[2]);
>   	rte_reorder_insert(b, bufs[3]);
> +	bufs[2] = NULL;
> +	bufs[3] = NULL;
>   
>   	/* Insert more packets
>   	 * RB[] = {NULL, NULL, NULL, NULL}
>   	 * OB[] = {NULL, 2, 3, 4}
>   	 */
>   	rte_reorder_insert(b, bufs[4]);
> +	bufs[4] = NULL;
>   
>   	/* Insert more packets
>   	 * RB[] = {2, 3, 4, NULL}
>   	 * OB[] = {NULL, NULL, 7, NULL}
>   	 */
>   	rte_reorder_insert(b, bufs[7]);
> +	bufs[7] = NULL;
>   
>   	/* drained expected packets */
>   	cnt = rte_reorder_drain(b, robufs, 4);

And again here.

> @@ -298,8 +310,11 @@ test_reorder_drain(void)
>   	}
>   	ret = 0;
>   exit:
> -	rte_mempool_put_bulk(p, (void *)bufs, num_bufs);
>   	rte_reorder_free(b);
> +	for (i = 0; i < num_bufs; i++) {
> +		if (bufs[i] != NULL)
> +			rte_pktmbuf_free(bufs[i]);
> +	}
>   	return ret;
>   }
>   

Reviewed-by: David Hunt <david.hunt at intel.com>

Thanks,
Dave.


More information about the dev mailing list