DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] net/memif: fix chained mbuf determination
@ 2021-09-09 14:42 Junxiao Shi
  2021-09-20 15:20 ` Ferruh Yigit
  0 siblings, 1 reply; 4+ messages in thread
From: Junxiao Shi @ 2021-09-09 14:42 UTC (permalink / raw)
  To: dev

Previously, TX functions call rte_pktmbuf_is_contiguous to determine
whether an mbuf is chained. However, rte_pktmbuf_is_contiguous is
designed to work on the first mbuf of a packet only. In case a packet
contains three or more segment mbufs in a chain, it may cause truncated
packets or rte_mbuf_sanity_check panics.

This patch updates TX functions to determine chained mbufs using
mbuf_head->nb_segs field, which works in all cases. Moreover, it
maintains that the second cacheline is only accessed when chained mbuf
is actually present.

Signed-off-by: Junxiao Shi <git@mail1.yoursunny.com>
---
 drivers/net/memif/rte_eth_memif.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c
index de6becd45e..fd9e877c3d 100644
--- a/drivers/net/memif/rte_eth_memif.c
+++ b/drivers/net/memif/rte_eth_memif.c
@@ -199,6 +199,7 @@ memif_dev_info(struct rte_eth_dev *dev __rte_unused, struct rte_eth_dev_info *de
 	dev_info->max_rx_queues = ETH_MEMIF_MAX_NUM_Q_PAIRS;
 	dev_info->max_tx_queues = ETH_MEMIF_MAX_NUM_Q_PAIRS;
 	dev_info->min_rx_bufsize = 0;
+	dev_info->tx_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS;
 
 	return 0;
 }
@@ -567,7 +568,7 @@ eth_memif_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 		rte_eth_devices[mq->in_port].process_private;
 	memif_ring_t *ring = memif_get_ring_from_queue(proc_private, mq);
 	uint16_t slot, saved_slot, n_free, ring_size, mask, n_tx_pkts = 0;
-	uint16_t src_len, src_off, dst_len, dst_off, cp_len;
+	uint16_t src_len, src_off, dst_len, dst_off, cp_len, nb_segs;
 	memif_ring_type_t type = mq->type;
 	memif_desc_t *d0;
 	struct rte_mbuf *mbuf;
@@ -615,6 +616,7 @@ eth_memif_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 
 	while (n_tx_pkts < nb_pkts && n_free) {
 		mbuf_head = *bufs++;
+		nb_segs = mbuf_head->nb_segs;
 		mbuf = mbuf_head;
 
 		saved_slot = slot;
@@ -659,7 +661,7 @@ eth_memif_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 			d0->length = dst_off;
 		}
 
-		if (rte_pktmbuf_is_contiguous(mbuf) == 0) {
+		if (--nb_segs > 0) {
 			mbuf = mbuf->next;
 			goto next_in_chain;
 		}
@@ -696,6 +698,7 @@ memif_tx_one_zc(struct pmd_process_private *proc_private, struct memif_queue *mq
 		uint16_t slot, uint16_t n_free)
 {
 	memif_desc_t *d0;
+	uint16_t nb_segs = mbuf->nb_segs;
 	int used_slots = 1;
 
 next_in_chain:
@@ -716,7 +719,7 @@ memif_tx_one_zc(struct pmd_process_private *proc_private, struct memif_queue *mq
 	d0->flags = 0;
 
 	/* check if buffer is chained */
-	if (rte_pktmbuf_is_contiguous(mbuf) == 0) {
+	if (--nb_segs > 0) {
 		if (n_free < 2)
 			return 0;
 		/* mark buffer as chained */
-- 
2.17.1


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

* Re: [dpdk-dev] [PATCH] net/memif: fix chained mbuf determination
  2021-09-09 14:42 [dpdk-dev] [PATCH] net/memif: fix chained mbuf determination Junxiao Shi
@ 2021-09-20 15:20 ` Ferruh Yigit
  2021-09-22  6:19   ` Jakub Grajciar -X (jgrajcia - PANTHEON TECH SRO at Cisco)
  0 siblings, 1 reply; 4+ messages in thread
From: Ferruh Yigit @ 2021-09-20 15:20 UTC (permalink / raw)
  To: Jakub Grajciar; +Cc: Junxiao Shi, dev

On 9/9/2021 3:42 PM, Junxiao Shi wrote:
> Previously, TX functions call rte_pktmbuf_is_contiguous to determine
> whether an mbuf is chained. However, rte_pktmbuf_is_contiguous is
> designed to work on the first mbuf of a packet only. In case a packet
> contains three or more segment mbufs in a chain, it may cause truncated
> packets or rte_mbuf_sanity_check panics.
> 
> This patch updates TX functions to determine chained mbufs using
> mbuf_head->nb_segs field, which works in all cases. Moreover, it
> maintains that the second cacheline is only accessed when chained mbuf
> is actually present.
> 
> Signed-off-by: Junxiao Shi <git@mail1.yoursunny.com>

+ memif maintainer, Jakub.

Jakub, can you please review the patch?

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

* Re: [dpdk-dev] [PATCH] net/memif: fix chained mbuf determination
  2021-09-20 15:20 ` Ferruh Yigit
@ 2021-09-22  6:19   ` Jakub Grajciar -X (jgrajcia - PANTHEON TECH SRO at Cisco)
  2021-09-27 15:25     ` Ferruh Yigit
  0 siblings, 1 reply; 4+ messages in thread
From: Jakub Grajciar -X (jgrajcia - PANTHEON TECH SRO at Cisco) @ 2021-09-22  6:19 UTC (permalink / raw)
  To: Junxiao Shi; +Cc: dev, Ferruh Yigit

> > Previously, TX functions call rte_pktmbuf_is_contiguous to determine
> > whether an mbuf is chained. However, rte_pktmbuf_is_contiguous is
> > designed to work on the first mbuf of a packet only. In case a packet
> > contains three or more segment mbufs in a chain, it may cause
> > truncated packets or rte_mbuf_sanity_check panics.
> >
> > This patch updates TX functions to determine chained mbufs using
> > mbuf_head->nb_segs field, which works in all cases. Moreover, it
> > maintains that the second cacheline is only accessed when chained mbuf
> > is actually present.
> >
> > Signed-off-by: Junxiao Shi <git@mail1.yoursunny.com>

Looks ok to me. Thanks for the patch!

Reviewed-by: Jakub Grajciar <jgrajcia@cisco.com>

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

* Re: [dpdk-dev] [PATCH] net/memif: fix chained mbuf determination
  2021-09-22  6:19   ` Jakub Grajciar -X (jgrajcia - PANTHEON TECH SRO at Cisco)
@ 2021-09-27 15:25     ` Ferruh Yigit
  0 siblings, 0 replies; 4+ messages in thread
From: Ferruh Yigit @ 2021-09-27 15:25 UTC (permalink / raw)
  To: Jakub Grajciar -X (jgrajcia - PANTHEON TECH SRO at Cisco), Junxiao Shi
  Cc: dev

On 9/22/2021 7:19 AM, Jakub Grajciar -X (jgrajcia - PANTHEON TECH SRO at Cisco)
wrote:
>>> Previously, TX functions call rte_pktmbuf_is_contiguous to determine
>>> whether an mbuf is chained. However, rte_pktmbuf_is_contiguous is
>>> designed to work on the first mbuf of a packet only. In case a packet
>>> contains three or more segment mbufs in a chain, it may cause
>>> truncated packets or rte_mbuf_sanity_check panics.
>>>
>>> This patch updates TX functions to determine chained mbufs using
>>> mbuf_head->nb_segs field, which works in all cases. Moreover, it
>>> maintains that the second cacheline is only accessed when chained mbuf
>>> is actually present.
>>>
>>> Signed-off-by: Junxiao Shi <git@mail1.yoursunny.com>
> 
> Looks ok to me. Thanks for the patch!
> 
> Reviewed-by: Jakub Grajciar <jgrajcia@cisco.com>
> 

    Fixes: 09c7e63a71f9 ("net/memif: introduce memory interface PMD")
    Fixes: 43b815d88188 ("net/memif: support zero-copy slave")
    Cc: stable@dpdk.org

Applied to dpdk-next-net/main, thanks.

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

end of thread, other threads:[~2021-09-27 15:26 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-09 14:42 [dpdk-dev] [PATCH] net/memif: fix chained mbuf determination Junxiao Shi
2021-09-20 15:20 ` Ferruh Yigit
2021-09-22  6:19   ` Jakub Grajciar -X (jgrajcia - PANTHEON TECH SRO at Cisco)
2021-09-27 15:25     ` Ferruh Yigit

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).