[v2] net/iavf: fix mismatch between rx_pkt_burst and RX descriptor
Checks
Commit Message
Some kernel drivers return the capability VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC
when IAVF_RXDID_COMMS_OVS_1 is not supported. This causes PMD to use
rx_pkt_burst that handles the Flex Receive Descriptor format, but actually
configures the RXDID into IAVF_RXDID_LEGACY_1, then the fields of rte_mbuf
Will be filled with wrong values in rx_pkt_burst, which will eventually
lead to coredump.
This patch fixes mismatch between rx_pkt_burst and rx descriptor.
Fixes: 12b435bf8f2f ("net/iavf: support flex desc metadata extraction")
Cc: stable@dpdk.org
Signed-off-by: Yiding Zhou <yidingx.zhou@intel.com>
---
drivers/net/iavf/iavf_rxtx.c | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
Comments
> -----Original Message-----
> From: Zhou, YidingX <yidingx.zhou@intel.com>
> Sent: Sunday, May 8, 2022 3:53 AM
> To: dev@dpdk.org; Wu, Jingjing <jingjing.wu@intel.com>; Xing, Beilei
> <beilei.xing@intel.com>
> Cc: Yang, Qiming <qiming.yang@intel.com>; Zhang, Qi Z
> <qi.z.zhang@intel.com>; stable@dpdk.org; Yeleswarapu, Ramamani
> <ramamani.yeleswarapu@intel.com>
> Subject: [PATCH v2] net/iavf: fix mismatch between rx_pkt_burst and RX
> descriptor
>
> Some kernel drivers return the capability
> VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC when IAVF_RXDID_COMMS_OVS_1 is
> not supported. This causes PMD to use rx_pkt_burst that handles the Flex
> Receive Descriptor format, but actually configures the RXDID into
> IAVF_RXDID_LEGACY_1, then the fields of rte_mbuf Will be filled with wrong
> values in rx_pkt_burst, which will eventually lead to coredump.
>
> This patch fixes mismatch between rx_pkt_burst and rx descriptor.
>
> Fixes: 12b435bf8f2f ("net/iavf: support flex desc metadata extraction")
> Cc: stable@dpdk.org
>
> Signed-off-by: Yiding Zhou <yidingx.zhou@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
Applied to dpdk-next-net-intel.
Thanks
Qi
> -----Original Message-----
> From: Zhang, Qi Z <qi.z.zhang@intel.com>
> Sent: Monday, May 9, 2022 10:05 AM
> To: Zhou, YidingX <yidingx.zhou@intel.com>; dev@dpdk.org; Wu, Jingjing
> <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com>
> Cc: Yang, Qiming <qiming.yang@intel.com>; stable@dpdk.org; Yeleswarapu,
> Ramamani <ramamani.yeleswarapu@intel.com>
> Subject: RE: [PATCH v2] net/iavf: fix mismatch between rx_pkt_burst and RX
> descriptor
>
>
>
> > -----Original Message-----
> > From: Zhou, YidingX <yidingx.zhou@intel.com>
> > Sent: Sunday, May 8, 2022 3:53 AM
> > To: dev@dpdk.org; Wu, Jingjing <jingjing.wu@intel.com>; Xing, Beilei
> > <beilei.xing@intel.com>
> > Cc: Yang, Qiming <qiming.yang@intel.com>; Zhang, Qi Z
> > <qi.z.zhang@intel.com>; stable@dpdk.org; Yeleswarapu, Ramamani
> > <ramamani.yeleswarapu@intel.com>
> > Subject: [PATCH v2] net/iavf: fix mismatch between rx_pkt_burst and RX
> > descriptor
Refined the title to " fix wrong data path selection which cause segment fault"
In dpdk-next-net-intel to make it clear what it is going to fix.
> >
> > Some kernel drivers return the capability
> > VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC when IAVF_RXDID_COMMS_OVS_1
> is not
> > supported. This causes PMD to use rx_pkt_burst that handles the Flex
> > Receive Descriptor format, but actually configures the RXDID into
> > IAVF_RXDID_LEGACY_1, then the fields of rte_mbuf Will be filled with
> > wrong values in rx_pkt_burst, which will eventually lead to coredump.
> >
> > This patch fixes mismatch between rx_pkt_burst and rx descriptor.
> >
> > Fixes: 12b435bf8f2f ("net/iavf: support flex desc metadata
> > extraction")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Yiding Zhou <yidingx.zhou@intel.com>
>
> Acked-by: Qi Zhang <qi.z.zhang@intel.com>
>
> Applied to dpdk-next-net-intel.
>
> Thanks
> Qi
> -----Original Message-----
> From: Zhang, Qi Z <qi.z.zhang@intel.com>
> Sent: Wednesday, May 11, 2022 8:04 AM
> To: Zhang, Qi Z <qi.z.zhang@intel.com>; Zhou, YidingX
> <yidingx.zhou@intel.com>; dev@dpdk.org; Wu, Jingjing
> <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com>
> Cc: Yang, Qiming <qiming.yang@intel.com>; stable@dpdk.org; Yeleswarapu,
> Ramamani <ramamani.yeleswarapu@intel.com>
> Subject: RE: [PATCH v2] net/iavf: fix mismatch between rx_pkt_burst and RX
> descriptor
>
>
>
> > -----Original Message-----
> > From: Zhang, Qi Z <qi.z.zhang@intel.com>
> > Sent: Monday, May 9, 2022 10:05 AM
> > To: Zhou, YidingX <yidingx.zhou@intel.com>; dev@dpdk.org; Wu, Jingjing
> > <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com>
> > Cc: Yang, Qiming <qiming.yang@intel.com>; stable@dpdk.org;
> > Yeleswarapu, Ramamani <ramamani.yeleswarapu@intel.com>
> > Subject: RE: [PATCH v2] net/iavf: fix mismatch between rx_pkt_burst
> > and RX descriptor
> >
> >
> >
> > > -----Original Message-----
> > > From: Zhou, YidingX <yidingx.zhou@intel.com>
> > > Sent: Sunday, May 8, 2022 3:53 AM
> > > To: dev@dpdk.org; Wu, Jingjing <jingjing.wu@intel.com>; Xing, Beilei
> > > <beilei.xing@intel.com>
> > > Cc: Yang, Qiming <qiming.yang@intel.com>; Zhang, Qi Z
> > > <qi.z.zhang@intel.com>; stable@dpdk.org; Yeleswarapu, Ramamani
> > > <ramamani.yeleswarapu@intel.com>
> > > Subject: [PATCH v2] net/iavf: fix mismatch between rx_pkt_burst and
> > > RX descriptor
>
> Refined the title to " fix wrong data path selection which cause segment fault"
> In dpdk-next-net-intel to make it clear what it is going to fix.
Further refine the commit log in dpdk-next-net-intel as below base on Thomas's comment:
If PF driver don't support a flex Rx descriptor that required by VF,
legacy descriptor format will be negotiated to configure the hardware
queue.
The patch fixes the issue when an Rx data path that handle flexible
descriptor (e.g.:
iavf_recv_scattered_pkts_vec_avx512_flex_rxd) is selected while the
actual hardware queues are configured as legacy due to above scenario,
which will cause following coredump.
>
> > >
> > > Some kernel drivers return the capability
> > > VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC when
> IAVF_RXDID_COMMS_OVS_1
> > is not
> > > supported. This causes PMD to use rx_pkt_burst that handles the Flex
> > > Receive Descriptor format, but actually configures the RXDID into
> > > IAVF_RXDID_LEGACY_1, then the fields of rte_mbuf Will be filled with
> > > wrong values in rx_pkt_burst, which will eventually lead to coredump.
> > >
> > > This patch fixes mismatch between rx_pkt_burst and rx descriptor.
> > >
> > > Fixes: 12b435bf8f2f ("net/iavf: support flex desc metadata
> > > extraction")
> > > Cc: stable@dpdk.org
> > >
> > > Signed-off-by: Yiding Zhou <yidingx.zhou@intel.com>
> >
> > Acked-by: Qi Zhang <qi.z.zhang@intel.com>
> >
> > Applied to dpdk-next-net-intel.
> >
> > Thanks
> > Qi
@@ -2899,14 +2899,27 @@ iavf_set_rx_function(struct rte_eth_dev *dev)
struct iavf_adapter *adapter =
IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
+ int i;
+ struct iavf_rx_queue *rxq;
+ bool use_flex = true;
+
+ for (i = 0; i < dev->data->nb_rx_queues; i++) {
+ rxq = dev->data->rx_queues[i];
+ if (rxq->rxdid <= IAVF_RXDID_LEGACY_1) {
+ PMD_DRV_LOG(NOTICE, "request RXDID[%d] in Queue[%d] is legacy, "
+ "set rx_pkt_burst as legacy for all queues", rxq->rxdid, i);
+ use_flex = false;
+ } else if (!(vf->supported_rxdid & BIT(rxq->rxdid))) {
+ PMD_DRV_LOG(NOTICE, "request RXDID[%d] in Queue[%d] is not supported, "
+ "set rx_pkt_burst as legacy for all queues", rxq->rxdid, i);
+ use_flex = false;
+ }
+ }
#ifdef RTE_ARCH_X86
- struct iavf_rx_queue *rxq;
- int i;
int check_ret;
bool use_avx2 = false;
bool use_avx512 = false;
- bool use_flex = false;
check_ret = iavf_rx_vec_dev_check(dev);
if (check_ret >= 0 &&
@@ -2923,10 +2936,6 @@ iavf_set_rx_function(struct rte_eth_dev *dev)
use_avx512 = true;
#endif
- if (vf->vf_res->vf_cap_flags &
- VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC)
- use_flex = true;
-
for (i = 0; i < dev->data->nb_rx_queues; i++) {
rxq = dev->data->rx_queues[i];
(void)iavf_rxq_vec_setup(rxq);
@@ -3030,7 +3039,7 @@ iavf_set_rx_function(struct rte_eth_dev *dev)
if (dev->data->scattered_rx) {
PMD_DRV_LOG(DEBUG, "Using a Scattered Rx callback (port=%d).",
dev->data->port_id);
- if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC)
+ if (use_flex)
dev->rx_pkt_burst = iavf_recv_scattered_pkts_flex_rxd;
else
dev->rx_pkt_burst = iavf_recv_scattered_pkts;
@@ -3041,7 +3050,7 @@ iavf_set_rx_function(struct rte_eth_dev *dev)
} else {
PMD_DRV_LOG(DEBUG, "Using Basic Rx callback (port=%d).",
dev->data->port_id);
- if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC)
+ if (use_flex)
dev->rx_pkt_burst = iavf_recv_pkts_flex_rxd;
else
dev->rx_pkt_burst = iavf_recv_pkts;