cxgb4: free MQPRIO resources in shutdown path
authorRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Tue, 31 Mar 2020 19:47:01 +0000 (01:17 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 1 Apr 2020 18:16:43 +0000 (11:16 -0700)
Perform missing MQPRIO resource cleanup in PCI shutdown path. Also,
fix MQPRIO MSIX bitmap leak in resource cleanup.

Fixes: b1396c2bd675 ("cxgb4: parse and configure TC-MQPRIO offload")
Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_mqprio.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_mqprio.h

index ad993d6ff586a250408a2e70a4bd0f12f5de1418..a70018f067aa876f3168a3b71c22a2bb4efb7fe3 100644 (file)
@@ -6671,6 +6671,10 @@ static void shutdown_one(struct pci_dev *pdev)
                        if (adapter->port[i]->reg_state == NETREG_REGISTERED)
                                cxgb_close(adapter->port[i]);
 
+               rtnl_lock();
+               cxgb4_mqprio_stop_offload(adapter);
+               rtnl_unlock();
+
                if (is_uld(adapter)) {
                        detach_ulds(adapter);
                        t4_uld_clean_up(adapter);
index ec3eb45ee3b4896f87ee8d9f739d829aacce4ea2..e6af4906d67436a9cb82ecfbeebb48db6bd12b79 100644 (file)
@@ -301,6 +301,7 @@ static void cxgb4_mqprio_free_hw_resources(struct net_device *dev)
                        cxgb4_clear_msix_aff(eorxq->msix->vec,
                                             eorxq->msix->aff_mask);
                        free_irq(eorxq->msix->vec, &eorxq->rspq);
+                       cxgb4_free_msix_idx_in_bmap(adap, eorxq->msix->idx);
                }
 
                free_rspq_fl(adap, &eorxq->rspq, &eorxq->fl);
@@ -611,6 +612,28 @@ out:
        return ret;
 }
 
+void cxgb4_mqprio_stop_offload(struct adapter *adap)
+{
+       struct cxgb4_tc_port_mqprio *tc_port_mqprio;
+       struct net_device *dev;
+       u8 i;
+
+       if (!adap->tc_mqprio || !adap->tc_mqprio->port_mqprio)
+               return;
+
+       for_each_port(adap, i) {
+               dev = adap->port[i];
+               if (!dev)
+                       continue;
+
+               tc_port_mqprio = &adap->tc_mqprio->port_mqprio[i];
+               if (!tc_port_mqprio->mqprio.qopt.num_tc)
+                       continue;
+
+               cxgb4_mqprio_disable_offload(dev);
+       }
+}
+
 int cxgb4_init_tc_mqprio(struct adapter *adap)
 {
        struct cxgb4_tc_port_mqprio *tc_port_mqprio, *port_mqprio;
index c532f1ef84517bd65727de5603ad190e1978ad80..ff8794132b22b16157f4dd7e3f980cbf9da7c63b 100644 (file)
@@ -38,6 +38,7 @@ struct cxgb4_tc_mqprio {
 
 int cxgb4_setup_tc_mqprio(struct net_device *dev,
                          struct tc_mqprio_qopt_offload *mqprio);
+void cxgb4_mqprio_stop_offload(struct adapter *adap);
 int cxgb4_init_tc_mqprio(struct adapter *adap);
 void cxgb4_cleanup_tc_mqprio(struct adapter *adap);
 #endif /* __CXGB4_TC_MQPRIO_H__ */