patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Yongseok Koh <yskoh@mellanox.com>
To: "stable@dpdk.org" <stable@dpdk.org>,
	Martin Weiser <martin.weiser@allegro-packets.com>
Subject: Re: [dpdk-stable] [PATCH] net/mlx5: fix deadlock due to buffered slots in Rx SW ring
Date: Fri, 6 Oct 2017 22:18:46 +0000	[thread overview]
Message-ID: <A1490F05-1EBF-4C6C-AF64-47E147C29FE0@mellanox.com> (raw)
In-Reply-To: <20171006221340.23793-1-yskoh@mellanox.com>

My apologies. I put a wrong list of recipients.
Please disregard this email, will send out again.

Thanks
Yongseok

> On Oct 6, 2017, at 3:13 PM, Yongseok Koh <yskoh@mellanox.com> wrote:
> 
> When replenishing Rx ring, there're always buffered slots reserved between
> consumed entries and HW owned entries. These have to be filled with fake
> mbufs to protect from possible overflow rather than optimistically
> expecting successful replenishment which can cause deadlock with
> small-sized queue.
> 
> Fixes: 951649d21edf ("net/mlx5: fix overflow of Rx SW ring")
> Cc: stable@dpdk.org
> Cc: martin.weiser@allegro-packets.com
> 
> Reported-by: Martin Weiser <martin.weiser@allegro-packets.com>
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> ---
> 
> This patch actually reverts "net/mlx5: fix overflow of Rx SW ring". If possible,
> these two can be squashed by disregrading the old one.
> 
> drivers/net/mlx5/mlx5_rxtx_vec_sse.c | 20 ++++++++------------
> 1 file changed, 8 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_sse.c b/drivers/net/mlx5/mlx5_rxtx_vec_sse.c
> index 075dce908..3f92ce559 100644
> --- a/drivers/net/mlx5/mlx5_rxtx_vec_sse.c
> +++ b/drivers/net/mlx5/mlx5_rxtx_vec_sse.c
> @@ -548,7 +548,7 @@ rxq_replenish_bulk_mbuf(struct rxq *rxq, uint16_t n)
> {
> 	const uint16_t q_n = 1 << rxq->elts_n;
> 	const uint16_t q_mask = q_n - 1;
> -	const uint16_t elts_idx = rxq->rq_ci & q_mask;
> +	uint16_t elts_idx = rxq->rq_ci & q_mask;
> 	struct rte_mbuf **elts = &(*rxq->elts)[elts_idx];
> 	volatile struct mlx5_wqe_data_seg *wq = &(*rxq->wqes)[elts_idx];
> 	unsigned int i;
> @@ -566,6 +566,11 @@ rxq_replenish_bulk_mbuf(struct rxq *rxq, uint16_t n)
> 		wq[i].addr = rte_cpu_to_be_64((uintptr_t)elts[i]->buf_addr +
> 					      RTE_PKTMBUF_HEADROOM);
> 	rxq->rq_ci += n;
> +	/* Prevent overflowing into consumed mbufs. */
> +	elts_idx = rxq->rq_ci & q_mask;
> +	for (i = 0; i < MLX5_VPMD_DESCS_PER_LOOP; i += 2)
> +		_mm_storeu_si128((__m128i *)&(*rxq->elts)[elts_idx + i],
> +				 _mm_set1_epi64x((uintptr_t)&rxq->fake_mbuf));
> 	rte_wmb();
> 	*rxq->rq_db = rte_cpu_to_be_32(rxq->rq_ci);
> }
> @@ -639,13 +644,6 @@ rxq_cq_decompress_v(struct rxq *rxq,
> 	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, hash) !=
> 			 offsetof(struct rte_mbuf, rx_descriptor_fields1) + 12);
> 	/*
> -	 * Not to overflow elts array. Decompress next time after mbuf
> -	 * replenishment.
> -	 */
> -	if (unlikely(mcqe_n + MLX5_VPMD_DESCS_PER_LOOP >
> -		     (uint16_t)(rxq->rq_ci - rxq->cq_ci)))
> -		return;
> -	/*
> 	 * A. load mCQEs into a 128bit register.
> 	 * B. store rearm data to mbuf.
> 	 * C. combine data from mCQEs with rx_descriptor_fields1.
> @@ -1035,10 +1033,8 @@ rxq_burst_v(struct rxq *rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
> 	}
> 	elts_idx = rxq->rq_pi & q_mask;
> 	elts = &(*rxq->elts)[elts_idx];
> -	pkts_n = RTE_MIN(pkts_n - rcvd_pkt,
> -			 (uint16_t)(rxq->rq_ci - rxq->cq_ci));
> -	/* Not to overflow pkts/elts array. */
> -	pkts_n = RTE_ALIGN_FLOOR(pkts_n, MLX5_VPMD_DESCS_PER_LOOP);
> +	/* Not to overflow pkts array. */
> +	pkts_n = RTE_ALIGN_FLOOR(pkts_n - rcvd_pkt, MLX5_VPMD_DESCS_PER_LOOP);
> 	/* Not to cross queue end. */
> 	pkts_n = RTE_MIN(pkts_n, q_n - elts_idx);
> 	if (!pkts_n)
> -- 
> 2.11.0
> 

  reply	other threads:[~2017-10-06 22:18 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-06 22:13 Yongseok Koh
2017-10-06 22:18 ` Yongseok Koh [this message]
2017-10-06 22:19 Yongseok Koh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=A1490F05-1EBF-4C6C-AF64-47E147C29FE0@mellanox.com \
    --to=yskoh@mellanox.com \
    --cc=martin.weiser@allegro-packets.com \
    --cc=stable@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).