* Re: [dpdk-stable] [dpdk-dev] [PATCH] af_xdp: avoid deadlock due to empty fill queue [not found] <1600330014-22019-1-git-send-email-lirongqing@baidu.com> @ 2020-09-18 9:27 ` Loftus, Ciara 2020-09-18 11:24 ` Li,Rongqing 0 siblings, 1 reply; 2+ messages in thread From: Loftus, Ciara @ 2020-09-18 9:27 UTC (permalink / raw) To: Li RongQing, dev; +Cc: stable > when receive packets, it is possible to fail to reserve > fill queue, since buffer ring is shared between tx and rx, > and maybe not available temporary. at last, both fill > queue and rx queue are empty. > > then kernel side will be unable to receive packets due to > empty fill queue, and dpdk will be unable to reserve fill > queue because dpdk has not pakcets to receive, at last > deadlock will happen > > so move reserve fill queue before xsk_ring_cons__peek > to fix it > > Signed-off-by: Li RongQing <lirongqing@baidu.com> Thanks for the fix. I tested and saw no significant performance drop. Minor: the first line of the commit should read "net/af_xdp: ...." Acked-by: Ciara Loftus <ciara.loftus@intel.com> CC-ing stable as I think this fix should be considered for inclusion. Thanks, Ciara > --- > drivers/net/af_xdp/rte_eth_af_xdp.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c > b/drivers/net/af_xdp/rte_eth_af_xdp.c > index 7ce4ad04a..2dc9cab27 100644 > --- a/drivers/net/af_xdp/rte_eth_af_xdp.c > +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c > @@ -304,6 +304,10 @@ af_xdp_rx_cp(void *queue, struct rte_mbuf **bufs, > uint16_t nb_pkts) > uint32_t free_thresh = fq->size >> 1; > struct rte_mbuf *mbufs[ETH_AF_XDP_RX_BATCH_SIZE]; > > + if (xsk_prod_nb_free(fq, free_thresh) >= free_thresh) > + (void)reserve_fill_queue(umem, > ETH_AF_XDP_RX_BATCH_SIZE, NULL); > + > + > if (unlikely(rte_pktmbuf_alloc_bulk(rxq->mb_pool, mbufs, nb_pkts) > != 0)) > return 0; > > @@ -317,9 +321,6 @@ af_xdp_rx_cp(void *queue, struct rte_mbuf **bufs, > uint16_t nb_pkts) > goto out; > } > > - if (xsk_prod_nb_free(fq, free_thresh) >= free_thresh) > - (void)reserve_fill_queue(umem, > ETH_AF_XDP_RX_BATCH_SIZE, NULL); > - > for (i = 0; i < rcvd; i++) { > const struct xdp_desc *desc; > uint64_t addr; > -- > 2.16.2 ^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [dpdk-stable] [dpdk-dev] [PATCH] af_xdp: avoid deadlock due to empty fill queue 2020-09-18 9:27 ` [dpdk-stable] [dpdk-dev] [PATCH] af_xdp: avoid deadlock due to empty fill queue Loftus, Ciara @ 2020-09-18 11:24 ` Li,Rongqing 0 siblings, 0 replies; 2+ messages in thread From: Li,Rongqing @ 2020-09-18 11:24 UTC (permalink / raw) To: Loftus, Ciara, dev; +Cc: stable > -----Original Message----- > From: Loftus, Ciara [mailto:ciara.loftus@intel.com] > Sent: Friday, September 18, 2020 5:27 PM > To: Li,Rongqing <lirongqing@baidu.com>; dev@dpdk.org > Cc: stable@dpdk.org > Subject: RE: [dpdk-dev] [PATCH] af_xdp: avoid deadlock due to empty fill queue > > > when receive packets, it is possible to fail to reserve fill queue, > > since buffer ring is shared between tx and rx, and maybe not available > > temporary. at last, both fill queue and rx queue are empty. > > > > then kernel side will be unable to receive packets due to empty fill > > queue, and dpdk will be unable to reserve fill queue because dpdk has > > not pakcets to receive, at last deadlock will happen > > > > so move reserve fill queue before xsk_ring_cons__peek to fix it > > > > Signed-off-by: Li RongQing <lirongqing@baidu.com> > > Thanks for the fix. I tested and saw no significant performance drop. > > Minor: the first line of the commit should read "net/af_xdp: ...." > > Acked-by: Ciara Loftus <ciara.loftus@intel.com> > > CC-ing stable as I think this fix should be considered for inclusion. > > Thanks, > Ciara > Thanks, I will send v2 -Li > > --- > > drivers/net/af_xdp/rte_eth_af_xdp.c | 7 ++++--- > > 1 file changed, 4 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c > > b/drivers/net/af_xdp/rte_eth_af_xdp.c > > index 7ce4ad04a..2dc9cab27 100644 > > --- a/drivers/net/af_xdp/rte_eth_af_xdp.c > > +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c > > @@ -304,6 +304,10 @@ af_xdp_rx_cp(void *queue, struct rte_mbuf **bufs, > > uint16_t nb_pkts) > > uint32_t free_thresh = fq->size >> 1; > > struct rte_mbuf *mbufs[ETH_AF_XDP_RX_BATCH_SIZE]; > > > > + if (xsk_prod_nb_free(fq, free_thresh) >= free_thresh) > > + (void)reserve_fill_queue(umem, > > ETH_AF_XDP_RX_BATCH_SIZE, NULL); > > + > > + > > if (unlikely(rte_pktmbuf_alloc_bulk(rxq->mb_pool, mbufs, nb_pkts) != > > 0)) > > return 0; > > > > @@ -317,9 +321,6 @@ af_xdp_rx_cp(void *queue, struct rte_mbuf **bufs, > > uint16_t nb_pkts) > > goto out; > > } > > > > - if (xsk_prod_nb_free(fq, free_thresh) >= free_thresh) > > - (void)reserve_fill_queue(umem, > > ETH_AF_XDP_RX_BATCH_SIZE, NULL); > > - > > for (i = 0; i < rcvd; i++) { > > const struct xdp_desc *desc; > > uint64_t addr; > > -- > > 2.16.2 ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-09-18 11:24 UTC | newest] Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <1600330014-22019-1-git-send-email-lirongqing@baidu.com> 2020-09-18 9:27 ` [dpdk-stable] [dpdk-dev] [PATCH] af_xdp: avoid deadlock due to empty fill queue Loftus, Ciara 2020-09-18 11:24 ` Li,Rongqing
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).