Add the missing linking of NAPIs to netdev queues when enabling
interrupt vectors in order to support NAPI configuration and
interfaces requiring get_rx_queue()->napi to be set (like XSk
busy polling).
This additional RTNL locking in idpf_vport_dealloc() is needed to
avoid WARN splats on rmmod, which happens outside of RTNL context,
but calls idpf_vport_stop() which assumes RTNL protection.

Suggested-by: Maciej Fijalkowski <[email protected]> # helper
Signed-off-by: Alexander Lobakin <[email protected]>
---
 drivers/net/ethernet/intel/idpf/idpf_lib.c  |  2 ++
 drivers/net/ethernet/intel/idpf/idpf_txrx.c | 17 +++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/net/ethernet/intel/idpf/idpf_lib.c 
b/drivers/net/ethernet/intel/idpf/idpf_lib.c
index 4eb20ec2accb..7cef59177c4b 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_lib.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_lib.c
@@ -972,8 +972,10 @@ static void idpf_vport_dealloc(struct idpf_vport *vport)
        struct idpf_adapter *adapter = vport->adapter;
        unsigned int i = vport->idx;
 
+       rtnl_lock();
        idpf_deinit_mac_addr(vport);
        idpf_vport_stop(vport);
+       rtnl_unlock();
 
        if (!test_bit(IDPF_HR_RESET_IN_PROG, adapter->flags))
                idpf_decfg_netdev(vport);
diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c 
b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
index 875ed4054268..8128bd33ef45 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
@@ -3698,6 +3698,20 @@ void idpf_vport_intr_rel(struct idpf_vport *vport)
        vport->q_vectors = NULL;
 }
 
+static void idpf_q_vector_set_napi(struct idpf_q_vector *q_vector, bool link)
+{
+       struct napi_struct *napi = link ? &q_vector->napi : NULL;
+       struct net_device *dev = q_vector->vport->netdev;
+
+       for (u32 i = 0; i < q_vector->num_rxq; i++)
+               netif_queue_set_napi(dev, q_vector->rx[i]->idx,
+                                    NETDEV_QUEUE_TYPE_RX, napi);
+
+       for (u32 i = 0; i < q_vector->num_txq; i++)
+               netif_queue_set_napi(dev, q_vector->tx[i]->idx,
+                                    NETDEV_QUEUE_TYPE_TX, napi);
+}
+
 /**
  * idpf_vport_intr_rel_irq - Free the IRQ association with the OS
  * @vport: main vport structure
@@ -3718,6 +3732,7 @@ static void idpf_vport_intr_rel_irq(struct idpf_vport 
*vport)
                vidx = vport->q_vector_idxs[vector];
                irq_num = adapter->msix_entries[vidx].vector;
 
+               idpf_q_vector_set_napi(q_vector, false);
                kfree(free_irq(irq_num, q_vector));
        }
 }
@@ -3905,6 +3920,8 @@ static int idpf_vport_intr_req_irq(struct idpf_vport 
*vport)
                                   "Request_irq failed, error: %d\n", err);
                        goto free_q_irqs;
                }
+
+               idpf_q_vector_set_napi(q_vector, true);
        }
 
        return 0;
-- 
2.49.0

Reply via email to