[dpdk-dev] [PATCH v2 1/6] examples/ioat: always use same lcore for both DMA requests enqueue and dequeue

Conor Walsh conor.walsh at intel.com
Mon Sep 20 13:24:34 CEST 2021


> From: Konstantin Ananyev <konstantin.ananyev at intel.com>
>
> Few changes in ioat sample behaviour:
> - Always do SW copy for packet metadata (mbuf fields)
> - Always use same lcore for both DMA requests enqueue and dequeue
>
> Main reasons for that:
> a) it is safer, as idxd PMD doesn't support MT safe enqueue/dequeue (yet).
> b) sort of more apples to apples comparison with sw copy.
> c) from my testing things are faster that way.
>
> Signed-off-by: Konstantin Ananyev <konstantin.ananyev at intel.com>
> ---
>   examples/ioat/ioatfwd.c | 185 ++++++++++++++++++++++------------------
>   1 file changed, 101 insertions(+), 84 deletions(-)
>
> diff --git a/examples/ioat/ioatfwd.c b/examples/ioat/ioatfwd.c
> index b3977a8be5..1498343492 100644
> --- a/examples/ioat/ioatfwd.c
> +++ b/examples/ioat/ioatfwd.c
> @@ -331,43 +331,36 @@ update_mac_addrs(struct rte_mbuf *m, uint32_t dest_portid)
>   
>   /* Perform packet copy there is a user-defined function. 8< */
>   static inline void
> -pktmbuf_sw_copy(struct rte_mbuf *src, struct rte_mbuf *dst)
> +pktmbuf_metadata_copy(const struct rte_mbuf *src, struct rte_mbuf *dst)
>   {
> -	/* Copy packet metadata */
> -	rte_memcpy(&dst->rearm_data,
> -		&src->rearm_data,
> -		offsetof(struct rte_mbuf, cacheline1)
> -		- offsetof(struct rte_mbuf, rearm_data));
> +	dst->data_off = src->data_off;
> +	memcpy(&dst->rx_descriptor_fields1, &src->rx_descriptor_fields1,
> +		offsetof(struct rte_mbuf, buf_len) -
> +		offsetof(struct rte_mbuf, rx_descriptor_fields1));
> +}
>   
> -	/* Copy packet data */
> +/* Copy packet data */
> +static inline void
> +pktmbuf_sw_copy(struct rte_mbuf *src, struct rte_mbuf *dst)
> +{
>   	rte_memcpy(rte_pktmbuf_mtod(dst, char *),
>   		rte_pktmbuf_mtod(src, char *), src->data_len);
>   }
>   /* >8 End of perform packet copy there is a user-defined function. */

Might need to redo these snippet markers as the function is now split in 
two.

<snip>

> +static inline uint32_t
> +ioat_dequeue(struct rte_mbuf *src[], struct rte_mbuf *dst[], uint32_t num,
> +	uint16_t dev_id)
> +{
> +	int32_t rc;

rc should be uint32_t, but this is removed in patch 4 of this set during 
the change from raw to dma so it shouldn't really matter.

> +	/* Dequeue the mbufs from IOAT device. Since all memory
> +	 * is DPDK pinned memory and therefore all addresses should
> +	 * be valid, we don't check for copy errors
> +	 */
> +	rc = rte_ioat_completed_ops(dev_id, num, NULL, NULL,
> +		(void *)src, (void *)dst);
> +	if (rc < 0) {
> +		RTE_LOG(CRIT, IOAT,
> +			"rte_ioat_completed_ops(%hu) failedi, error: %d\n",
> +			dev_id, rte_errno);
> +		rc = 0;
> +	}
> +	return rc;
> +}

Reviewed-by: Conor Walsh <conor.walsh at intel.com>



More information about the dev mailing list