From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 987C242641; Tue, 26 Sep 2023 10:09:07 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 201F340277; Tue, 26 Sep 2023 10:09:07 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.24]) by mails.dpdk.org (Postfix) with ESMTP id BDB4740271 for ; Tue, 26 Sep 2023 10:09:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1695715746; x=1727251746; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=32eNQvHDcCcsDY85nS0Tz+W0PVYUNtyKIolig/XuBiQ=; b=iDnSpFlB7q7yjWZuAzHs8c+qb5drBVx+Zfv4j8i8rFQicXIn+tsJkvlm MBNENwEqtf4TMdPpnhD8s6jb4JPCOp6TOfAhSbokecf1sO17rGT8FjdGw fzqrR5eqdO5XdzkJIBRHrSADSyJzi5qNB941T9bj4P7fCzf0xMvk0siCB Jcm1ThXzAX0wWMTBJfrnfrEM051KysKW1NdXntEmBB0wOYCVVOrO5Z4pD EHCxF2yYX0y/nbvwop7yCXPDWFWOfpyRvaAr2kpZHk46W0Xxy92nUXxCj ZlQyGr5RNCsMnSjQRlp6YgKbJCJX1m2p952o+IIzuxG4tHjbPWCVH6us5 w==; X-IronPort-AV: E=McAfee;i="6600,9927,10843"; a="384291677" X-IronPort-AV: E=Sophos;i="6.03,177,1694761200"; d="scan'208";a="384291677" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Sep 2023 01:09:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10843"; a="864316929" X-IronPort-AV: E=Sophos;i="6.03,177,1694761200"; d="scan'208";a="864316929" Received: from unknown (HELO localhost.localdomain) ([10.239.252.253]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Sep 2023 01:08:41 -0700 From: Mingjin Ye To: dev@dpdk.org Cc: qiming.yang@intel.com, yidingx.zhou@intel.com, Mingjin Ye , Wenjun Wu , Simei Su , Yuying Zhang , Beilei Xing , Jingjing Wu , Bruce Richardson , Konstantin Ananyev Subject: [PATCH v2] net/iavf: support no data path polling mode Date: Tue, 26 Sep 2023 07:56:46 +0000 Message-Id: <20230926075647.2196381-1-mingjinx.ye@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230811062724.189757-1-mingjinx.ye@intel.com> References: <20230811062724.189757-1-mingjinx.ye@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Currently, during a PF to VF reset due to an action such as changing trust settings on a VF, the DPDK application running with iavf PMD loses connectivity, and the only solution is to reset the DPDK application. Instead of forcing a reset of the DPDK application to restore connectivity, the iavf PMD driver handles the PF to VF reset event normally by performing all necessary steps to bring the VF back online. To minimize downtime, a devargs "no-poll-on-link-down" is introduced in iavf PMD. When this flag is set, the PMD switches to no-poll mode when the link state is down (rx/tx bursts return to 0 immediately). When the link state returns to normal, the PMD switches to normal rx/tx burst state. Signed-off-by: Mingjin Ye --- doc/guides/nics/intel_vf.rst | 3 ++ drivers/net/iavf/iavf.h | 2 ++ drivers/net/iavf/iavf_ethdev.c | 16 +++++++++- drivers/net/iavf/iavf_rxtx.c | 29 +++++++++++++++-- drivers/net/iavf/iavf_rxtx.h | 1 + drivers/net/iavf/iavf_rxtx_vec_avx2.c | 29 ++++++++++++++--- drivers/net/iavf/iavf_rxtx_vec_avx512.c | 42 ++++++++++++++++++++++--- drivers/net/iavf/iavf_rxtx_vec_sse.c | 21 ++++++++++++- drivers/net/iavf/iavf_vchnl.c | 20 ++++++++++++ 9 files changed, 150 insertions(+), 13 deletions(-) diff --git a/doc/guides/nics/intel_vf.rst b/doc/guides/nics/intel_vf.rst index 7613e1c5e5..19c461c3de 100644 --- a/doc/guides/nics/intel_vf.rst +++ b/doc/guides/nics/intel_vf.rst @@ -104,6 +104,9 @@ For more detail on SR-IOV, please refer to the following documents: Enable vf auto-reset by setting the ``devargs`` parameter like ``-a 18:01.0,auto_reset=1`` when IAVF is backed by an Intel® E810 device or an Intel® 700 Series Ethernet device. + Enable vf no-poll-on-link-down by setting the ``devargs`` parameter like ``-a 18:01.0,no-poll-on-link-down=1`` when IAVF is backed + by an Intel® E810 device or an Intel® 700 Series Ethernet device. + The PCIE host-interface of Intel Ethernet Switch FM10000 Series VF infrastructure ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index 04774ce124..71cb08f0b1 100644 --- a/drivers/net/iavf/iavf.h +++ b/drivers/net/iavf/iavf.h @@ -308,6 +308,7 @@ struct iavf_devargs { uint16_t quanta_size; uint32_t watchdog_period; uint8_t auto_reset; + uint16_t no_poll_on_link_down; }; struct iavf_security_ctx; @@ -326,6 +327,7 @@ struct iavf_adapter { uint32_t ptype_tbl[IAVF_MAX_PKT_TYPE] __rte_cache_min_aligned; bool stopped; bool closed; + bool no_poll; uint16_t fdir_ref_cnt; struct iavf_devargs devargs; }; diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 5b2634a4e3..98cc5c8ea8 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -38,7 +38,7 @@ #define IAVF_QUANTA_SIZE_ARG "quanta_size" #define IAVF_RESET_WATCHDOG_ARG "watchdog_period" #define IAVF_ENABLE_AUTO_RESET_ARG "auto_reset" - +#define IAVF_NO_POLL_ON_LINK_DOWN_ARG "no-poll-on-link-down" uint64_t iavf_timestamp_dynflag; int iavf_timestamp_dynfield_offset = -1; @@ -47,6 +47,7 @@ static const char * const iavf_valid_args[] = { IAVF_QUANTA_SIZE_ARG, IAVF_RESET_WATCHDOG_ARG, IAVF_ENABLE_AUTO_RESET_ARG, + IAVF_NO_POLL_ON_LINK_DOWN_ARG, NULL }; @@ -2291,6 +2292,7 @@ static int iavf_parse_devargs(struct rte_eth_dev *dev) struct rte_kvargs *kvlist; int ret; int watchdog_period = -1; + uint16_t no_poll_on_link_down; if (!devargs) return 0; @@ -2324,6 +2326,15 @@ static int iavf_parse_devargs(struct rte_eth_dev *dev) else ad->devargs.watchdog_period = watchdog_period; + ret = rte_kvargs_process(kvlist, IAVF_NO_POLL_ON_LINK_DOWN_ARG, + &parse_u16, &no_poll_on_link_down); + if (ret) + goto bail; + if (no_poll_on_link_down == 0) + ad->devargs.no_poll_on_link_down = 0; + else + ad->devargs.no_poll_on_link_down = 1; + if (ad->devargs.quanta_size != 0 && (ad->devargs.quanta_size < 256 || ad->devargs.quanta_size > 4096 || ad->devargs.quanta_size & 0x40)) { @@ -2337,6 +2348,9 @@ static int iavf_parse_devargs(struct rte_eth_dev *dev) if (ret) goto bail; + if (ad->devargs.auto_reset != 0) + ad->devargs.no_poll_on_link_down = 1; + bail: rte_kvargs_free(kvlist); return ret; diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c index 0484988d13..a5f63ce30d 100644 --- a/drivers/net/iavf/iavf_rxtx.c +++ b/drivers/net/iavf/iavf_rxtx.c @@ -777,6 +777,7 @@ iavf_dev_tx_queue_setup(struct rte_eth_dev *dev, IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); + struct iavf_vsi *vsi = &vf->vsi; struct iavf_tx_queue *txq; const struct rte_memzone *mz; uint32_t ring_size; @@ -850,6 +851,7 @@ iavf_dev_tx_queue_setup(struct rte_eth_dev *dev, txq->port_id = dev->data->port_id; txq->offloads = offloads; txq->tx_deferred_start = tx_conf->tx_deferred_start; + txq->vsi = vsi; if (iavf_ipsec_crypto_supported(adapter)) txq->ipsec_crypto_pkt_md_offset = @@ -1427,9 +1429,12 @@ iavf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) uint64_t pkt_flags; const uint32_t *ptype_tbl; + rxq = rx_queue; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + nb_rx = 0; nb_hold = 0; - rxq = rx_queue; rx_id = rxq->rx_tail; rx_ring = rxq->rx_ring; ptype_tbl = rxq->vsi->adapter->ptype_tbl; @@ -1536,9 +1541,12 @@ iavf_recv_pkts_flex_rxd(void *rx_queue, const uint32_t *ptype_tbl; uint64_t ts_ns; + rxq = rx_queue; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + nb_rx = 0; nb_hold = 0; - rxq = rx_queue; rx_id = rxq->rx_tail; rx_ring = rxq->rx_ring; ptype_tbl = rxq->vsi->adapter->ptype_tbl; @@ -1662,6 +1670,9 @@ iavf_recv_scattered_pkts_flex_rxd(void *rx_queue, struct rte_mbuf **rx_pkts, volatile union iavf_rx_flex_desc *rxdp; const uint32_t *ptype_tbl = rxq->vsi->adapter->ptype_tbl; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + if (rxq->offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP) { uint64_t sw_cur_time = rte_get_timer_cycles() / (rte_get_timer_hz() / 1000); @@ -1839,6 +1850,9 @@ iavf_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, volatile union iavf_rx_desc *rxdp; const uint32_t *ptype_tbl = rxq->vsi->adapter->ptype_tbl; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + while (nb_rx < nb_pkts) { rxdp = &rx_ring[rx_id]; qword1 = rte_le_to_cpu_64(rxdp->wb.qword1.status_error_len); @@ -1994,6 +2008,9 @@ iavf_rx_scan_hw_ring_flex_rxd(struct iavf_rx_queue *rxq, const uint32_t *ptype_tbl = rxq->vsi->adapter->ptype_tbl; uint64_t ts_ns; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + rxdp = (volatile union iavf_rx_flex_desc *)&rxq->rx_ring[rxq->rx_tail]; rxep = &rxq->sw_ring[rxq->rx_tail]; @@ -2125,6 +2142,9 @@ iavf_rx_scan_hw_ring(struct iavf_rx_queue *rxq, struct rte_mbuf **rx_pkts, uint1 uint64_t pkt_flags; const uint32_t *ptype_tbl = rxq->vsi->adapter->ptype_tbl; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + rxdp = &rxq->rx_ring[rxq->rx_tail]; rxep = &rxq->sw_ring[rxq->rx_tail]; @@ -2302,6 +2322,9 @@ rx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) struct iavf_rx_queue *rxq = (struct iavf_rx_queue *)rx_queue; uint16_t nb_rx = 0; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + if (!nb_pkts) return 0; @@ -2793,6 +2816,8 @@ iavf_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) uint16_t idx; uint16_t slen; + if (!txq->vsi || txq->vsi->adapter->no_poll) + return 0; /* Check if the descriptor ring needs to be cleaned. */ if (txq->nb_free < txq->free_thresh) diff --git a/drivers/net/iavf/iavf_rxtx.h b/drivers/net/iavf/iavf_rxtx.h index 605ea3f824..d3324e0e6e 100644 --- a/drivers/net/iavf/iavf_rxtx.h +++ b/drivers/net/iavf/iavf_rxtx.h @@ -288,6 +288,7 @@ struct iavf_tx_queue { uint16_t free_thresh; uint16_t rs_thresh; uint8_t rel_mbufs_type; + struct iavf_vsi *vsi; /**< the VSI this queue belongs to */ uint16_t port_id; uint16_t queue_id; diff --git a/drivers/net/iavf/iavf_rxtx_vec_avx2.c b/drivers/net/iavf/iavf_rxtx_vec_avx2.c index 510b4d8f1c..9d8905a95a 100644 --- a/drivers/net/iavf/iavf_rxtx_vec_avx2.c +++ b/drivers/net/iavf/iavf_rxtx_vec_avx2.c @@ -26,8 +26,7 @@ _iavf_recv_raw_pkts_vec_avx2(struct iavf_rx_queue *rxq, { #define IAVF_DESCS_PER_LOOP_AVX 8 - /* const uint32_t *ptype_tbl = rxq->vsi->adapter->ptype_tbl; */ - const uint32_t *type_table = rxq->vsi->adapter->ptype_tbl; + const uint32_t *type_table; const __m256i mbuf_init = _mm256_set_epi64x(0, 0, 0, rxq->mbuf_initializer); @@ -36,6 +35,11 @@ _iavf_recv_raw_pkts_vec_avx2(struct iavf_rx_queue *rxq, volatile union iavf_rx_desc *rxdp = rxq->rx_ring + rxq->rx_tail; const int avx_aligned = ((rxq->rx_tail & 1) == 0); + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + + type_table = rxq->vsi->adapter->ptype_tbl; + rte_prefetch0(rxdp); /* nb_pkts has to be floor-aligned to IAVF_DESCS_PER_LOOP_AVX */ @@ -530,12 +534,12 @@ _iavf_recv_raw_pkts_vec_avx2_flex_rxd(struct iavf_rx_queue *rxq, { #define IAVF_DESCS_PER_LOOP_AVX 8 - struct iavf_adapter *adapter = rxq->vsi->adapter; + struct iavf_adapter *adapter; #ifndef RTE_LIBRTE_IAVF_16BYTE_RX_DESC - uint64_t offloads = adapter->dev_data->dev_conf.rxmode.offloads; + uint64_t offloads; #endif - const uint32_t *type_table = adapter->ptype_tbl; + const uint32_t *type_table; const __m256i mbuf_init = _mm256_set_epi64x(0, 0, 0, rxq->mbuf_initializer); @@ -543,6 +547,15 @@ _iavf_recv_raw_pkts_vec_avx2_flex_rxd(struct iavf_rx_queue *rxq, volatile union iavf_rx_flex_desc *rxdp = (union iavf_rx_flex_desc *)rxq->rx_ring + rxq->rx_tail; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + + adapter = rxq->vsi->adapter; +#ifndef RTE_LIBRTE_IAVF_16BYTE_RX_DESC + offloads = adapter->dev_data->dev_conf.rxmode.offloads; +#endif + type_table = adapter->ptype_tbl; + rte_prefetch0(rxdp); /* nb_pkts has to be floor-aligned to IAVF_DESCS_PER_LOOP_AVX */ @@ -1774,6 +1787,9 @@ iavf_xmit_fixed_burst_vec_avx2(void *tx_queue, struct rte_mbuf **tx_pkts, uint64_t flags = IAVF_TX_DESC_CMD_EOP | IAVF_TX_DESC_CMD_ICRC; uint64_t rs = IAVF_TX_DESC_CMD_RS | flags; + if (!txq->vsi || txq->vsi->adapter->no_poll) + return 0; + if (txq->nb_free < txq->free_thresh) iavf_tx_free_bufs(txq); @@ -1834,6 +1850,9 @@ iavf_xmit_pkts_vec_avx2_common(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_tx = 0; struct iavf_tx_queue *txq = (struct iavf_tx_queue *)tx_queue; + if (!txq->vsi || txq->vsi->adapter->no_poll) + return 0; + while (nb_pkts) { uint16_t ret, num; diff --git a/drivers/net/iavf/iavf_rxtx_vec_avx512.c b/drivers/net/iavf/iavf_rxtx_vec_avx512.c index 7a7df6d258..ff79388ba6 100644 --- a/drivers/net/iavf/iavf_rxtx_vec_avx512.c +++ b/drivers/net/iavf/iavf_rxtx_vec_avx512.c @@ -45,7 +45,7 @@ _iavf_recv_raw_pkts_vec_avx512(struct iavf_rx_queue *rxq, bool offload) { #ifdef IAVF_RX_PTYPE_OFFLOAD - const uint32_t *type_table = rxq->vsi->adapter->ptype_tbl; + const uint32_t *type_table; #endif const __m256i mbuf_init = _mm256_set_epi64x(0, 0, 0, @@ -53,6 +53,13 @@ _iavf_recv_raw_pkts_vec_avx512(struct iavf_rx_queue *rxq, struct rte_mbuf **sw_ring = &rxq->sw_ring[rxq->rx_tail]; volatile union iavf_rx_desc *rxdp = rxq->rx_ring + rxq->rx_tail; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + +#ifdef IAVF_RX_PTYPE_OFFLOAD + type_table = rxq->vsi->adapter->ptype_tbl; +#endif + rte_prefetch0(rxdp); /* nb_pkts has to be floor-aligned to IAVF_DESCS_PER_LOOP_AVX */ @@ -588,12 +595,12 @@ _iavf_recv_raw_pkts_vec_avx512_flex_rxd(struct iavf_rx_queue *rxq, uint8_t *split_packet, bool offload) { - struct iavf_adapter *adapter = rxq->vsi->adapter; + struct iavf_adapter *adapter; #ifndef RTE_LIBRTE_IAVF_16BYTE_RX_DESC - uint64_t offloads = adapter->dev_data->dev_conf.rxmode.offloads; + uint64_t offloads; #endif #ifdef IAVF_RX_PTYPE_OFFLOAD - const uint32_t *type_table = adapter->ptype_tbl; + const uint32_t *type_table; #endif const __m256i mbuf_init = _mm256_set_epi64x(0, 0, 0, @@ -602,6 +609,17 @@ _iavf_recv_raw_pkts_vec_avx512_flex_rxd(struct iavf_rx_queue *rxq, volatile union iavf_rx_flex_desc *rxdp = (union iavf_rx_flex_desc *)rxq->rx_ring + rxq->rx_tail; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + + adapter = rxq->vsi->adapter; +#ifndef RTE_LIBRTE_IAVF_16BYTE_RX_DESC + offloads = adapter->dev_data->dev_conf.rxmode.offloads; +#endif +#ifdef IAVF_RX_PTYPE_OFFLOAD + type_table = adapter->ptype_tbl; +#endif + rte_prefetch0(rxdp); /* nb_pkts has to be floor-aligned to IAVF_DESCS_PER_LOOP_AVX */ @@ -1700,6 +1718,10 @@ iavf_recv_scattered_pkts_vec_avx512_cmn(void *rx_queue, struct rte_mbuf **rx_pkt uint16_t nb_pkts, bool offload) { uint16_t retval = 0; + struct iavf_rx_queue *rxq = rx_queue; + + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; while (nb_pkts > IAVF_VPMD_RX_MAX_BURST) { uint16_t burst = iavf_recv_scattered_burst_vec_avx512(rx_queue, @@ -2303,6 +2325,9 @@ iavf_xmit_fixed_burst_vec_avx512(void *tx_queue, struct rte_mbuf **tx_pkts, uint64_t flags = IAVF_TX_DESC_CMD_EOP | IAVF_TX_DESC_CMD_ICRC; uint64_t rs = IAVF_TX_DESC_CMD_RS | flags; + if (!txq->vsi || txq->vsi->adapter->no_poll) + return 0; + if (txq->nb_free < txq->free_thresh) iavf_tx_free_bufs_avx512(txq); @@ -2370,6 +2395,9 @@ iavf_xmit_fixed_burst_vec_avx512_ctx(void *tx_queue, struct rte_mbuf **tx_pkts, uint64_t flags = IAVF_TX_DESC_CMD_EOP | IAVF_TX_DESC_CMD_ICRC; uint64_t rs = IAVF_TX_DESC_CMD_RS | flags; + if (!txq->vsi || txq->vsi->adapter->no_poll) + return 0; + if (txq->nb_free < txq->free_thresh) iavf_tx_free_bufs_avx512(txq); @@ -2432,6 +2460,9 @@ iavf_xmit_pkts_vec_avx512_cmn(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_tx = 0; struct iavf_tx_queue *txq = (struct iavf_tx_queue *)tx_queue; + if (!txq->vsi || txq->vsi->adapter->no_poll) + return 0; + while (nb_pkts) { uint16_t ret, num; @@ -2497,6 +2528,9 @@ iavf_xmit_pkts_vec_avx512_ctx_cmn(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_tx = 0; struct iavf_tx_queue *txq = (struct iavf_tx_queue *)tx_queue; + if (!txq->vsi || txq->vsi->adapter->no_poll) + return 0; + while (nb_pkts) { uint16_t ret, num; diff --git a/drivers/net/iavf/iavf_rxtx_vec_sse.c b/drivers/net/iavf/iavf_rxtx_vec_sse.c index 96f187f511..86e748d6d1 100644 --- a/drivers/net/iavf/iavf_rxtx_vec_sse.c +++ b/drivers/net/iavf/iavf_rxtx_vec_sse.c @@ -479,7 +479,12 @@ _recv_raw_pkts_vec(struct iavf_rx_queue *rxq, struct rte_mbuf **rx_pkts, int pos; uint64_t var; __m128i shuf_msk; - const uint32_t *ptype_tbl = rxq->vsi->adapter->ptype_tbl; + const uint32_t *ptype_tbl; + + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + + ptype_tbl = rxq->vsi->adapter->ptype_tbl; __m128i crc_adjust = _mm_set_epi16( 0, 0, 0, /* ignore non-length fields */ @@ -1198,6 +1203,11 @@ uint16_t iavf_recv_pkts_vec_flex_rxd(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) { + struct iavf_rx_queue *rxq = rx_queue; + + if (!rxq->vsi) + return 0; + return _recv_raw_pkts_vec_flex_rxd(rx_queue, rx_pkts, nb_pkts, NULL); } @@ -1215,6 +1225,9 @@ iavf_recv_scattered_burst_vec(void *rx_queue, struct rte_mbuf **rx_pkts, uint8_t split_flags[IAVF_VPMD_RX_MAX_BURST] = {0}; unsigned int i = 0; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + /* get some new buffers */ uint16_t nb_bufs = _recv_raw_pkts_vec(rxq, rx_pkts, nb_pkts, split_flags); @@ -1284,6 +1297,9 @@ iavf_recv_scattered_burst_vec_flex_rxd(void *rx_queue, uint8_t split_flags[IAVF_VPMD_RX_MAX_BURST] = {0}; unsigned int i = 0; + if (!rxq->vsi || rxq->vsi->adapter->no_poll) + return 0; + /* get some new buffers */ uint16_t nb_bufs = _recv_raw_pkts_vec_flex_rxd(rxq, rx_pkts, nb_pkts, split_flags); @@ -1437,6 +1453,9 @@ iavf_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_tx = 0; struct iavf_tx_queue *txq = (struct iavf_tx_queue *)tx_queue; + if (!txq->vsi || txq->vsi->adapter->no_poll) + return 0; + while (nb_pkts) { uint16_t ret, num; diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index 7f49eb2c1e..0a3e1d082c 100644 --- a/drivers/net/iavf/iavf_vchnl.c +++ b/drivers/net/iavf/iavf_vchnl.c @@ -272,6 +272,16 @@ iavf_read_msg_from_pf(struct iavf_adapter *adapter, uint16_t buf_len, if (!vf->link_up) iavf_dev_watchdog_enable(adapter); } + if (adapter->devargs.no_poll_on_link_down) { + if (vf->link_up && adapter->no_poll) { + adapter->no_poll = false; + PMD_DRV_LOG(DEBUG, "VF no poll turned off"); + } + if (!vf->link_up) { + adapter->no_poll = true; + PMD_DRV_LOG(DEBUG, "VF no poll turned on"); + } + } PMD_DRV_LOG(INFO, "Link status update:%s", vf->link_up ? "up" : "down"); break; @@ -474,6 +484,16 @@ iavf_handle_pf_event_msg(struct rte_eth_dev *dev, uint8_t *msg, if (!vf->link_up) iavf_dev_watchdog_enable(adapter); } + if (adapter->devargs.no_poll_on_link_down) { + if (vf->link_up && adapter->no_poll) { + adapter->no_poll = false; + PMD_DRV_LOG(DEBUG, "VF no poll turned off"); + } + if (!vf->link_up) { + adapter->no_poll = true; + PMD_DRV_LOG(DEBUG, "VF no poll turned on"); + } + } iavf_dev_event_post(dev, RTE_ETH_EVENT_INTR_LSC, NULL, 0); break; case VIRTCHNL_EVENT_PF_DRIVER_CLOSE: -- 2.25.1