When RSC is enabled, Rx ring IVAR is set to configure ITR. It causes Rx
ring interrupts report on the default msix_vector. Thus a mass of unknown
interrupts occupy CPU.

Fix the issue by setting ring IVAR only when the rxq interrupt is enabled.

Fixes: be797cbf4582 ("net/txgbe: add Rx and Tx init")
Cc: [email protected]

Signed-off-by: Zaiyu Wang <[email protected]>
---
 drivers/net/txgbe/txgbe_rxtx.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c
index 72a4965693..be279dc4ec 100644
--- a/drivers/net/txgbe/txgbe_rxtx.c
+++ b/drivers/net/txgbe/txgbe_rxtx.c
@@ -4354,6 +4354,8 @@ static int
 txgbe_set_rsc(struct rte_eth_dev *dev)
 {
        struct rte_eth_rxmode *rx_conf = &dev->data->dev_conf.rxmode;
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
+       struct rte_intr_handle *intr_handle = pci_dev->intr_handle;
        struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
        struct rte_eth_dev_info dev_info = { 0 };
        bool rsc_capable = false;
@@ -4404,8 +4406,6 @@ txgbe_set_rsc(struct rte_eth_dev *dev)
                        rd32(hw, TXGBE_RXCFG(rxq->reg_idx));
                uint32_t psrtype =
                        rd32(hw, TXGBE_POOLRSS(rxq->reg_idx));
-               uint32_t eitr =
-                       rd32(hw, TXGBE_ITR(rxq->reg_idx));
 
                /*
                 * txgbe PMD doesn't support header-split at the moment.
@@ -4424,6 +4424,9 @@ txgbe_set_rsc(struct rte_eth_dev *dev)
                srrctl |= txgbe_get_rscctl_maxdesc(rxq->mb_pool);
                psrtype |= TXGBE_POOLRSS_L4HDR;
 
+               wr32(hw, TXGBE_RXCFG(rxq->reg_idx), srrctl);
+               wr32(hw, TXGBE_POOLRSS(rxq->reg_idx), psrtype);
+
                /*
                 * RSC: Set ITR interval corresponding to 2K ints/s.
                 *
@@ -4437,19 +4440,20 @@ txgbe_set_rsc(struct rte_eth_dev *dev)
                 * For a sparse streaming case this setting will yield
                 * at most 500us latency for a single RSC aggregation.
                 */
-               eitr &= ~TXGBE_ITR_IVAL_MASK;
-               eitr |= TXGBE_ITR_IVAL_10G(TXGBE_QUEUE_ITR_INTERVAL_DEFAULT);
-               eitr |= TXGBE_ITR_WRDSA;
+               if (rte_intr_dp_is_en(intr_handle)) {
+                       uint32_t eitr = rd32(hw, TXGBE_ITR(rxq->reg_idx));
 
-               wr32(hw, TXGBE_RXCFG(rxq->reg_idx), srrctl);
-               wr32(hw, TXGBE_POOLRSS(rxq->reg_idx), psrtype);
-               wr32(hw, TXGBE_ITR(rxq->reg_idx), eitr);
+                       eitr &= ~TXGBE_ITR_IVAL_MASK;
+                       eitr |= 
TXGBE_ITR_IVAL_10G(TXGBE_QUEUE_ITR_INTERVAL_DEFAULT);
+                       eitr |= TXGBE_ITR_WRDSA;
+                       wr32(hw, TXGBE_ITR(rxq->reg_idx), eitr);
 
-               /*
-                * RSC requires the mapping of the queue to the
-                * interrupt vector.
-                */
-               txgbe_set_ivar_map(hw, 0, rxq->reg_idx, i);
+                       /*
+                        * RSC requires the mapping of the queue to the
+                        * interrupt vector.
+                        */
+                       txgbe_set_ivar_map(hw, 0, rxq->reg_idx, i);
+               }
        }
 
        dev->data->lro = 1;
-- 
2.21.0.windows.1

Reply via email to