Commit cef8dac96bc108633f5090bb3a9988d734dc1ee0

Authored by Rahul Lakkireddy
Committed by David S. Miller
1 parent 41aa8561ca

cxgb4: free MQPRIO resources in shutdown path

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>

Showing 3 changed files with 28 additions and 0 deletions Side-by-side Diff

drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
... ... @@ -6671,6 +6671,10 @@
6671 6671 if (adapter->port[i]->reg_state == NETREG_REGISTERED)
6672 6672 cxgb_close(adapter->port[i]);
6673 6673  
  6674 + rtnl_lock();
  6675 + cxgb4_mqprio_stop_offload(adapter);
  6676 + rtnl_unlock();
  6677 +
6674 6678 if (is_uld(adapter)) {
6675 6679 detach_ulds(adapter);
6676 6680 t4_uld_clean_up(adapter);
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_mqprio.c
... ... @@ -301,6 +301,7 @@
301 301 cxgb4_clear_msix_aff(eorxq->msix->vec,
302 302 eorxq->msix->aff_mask);
303 303 free_irq(eorxq->msix->vec, &eorxq->rspq);
  304 + cxgb4_free_msix_idx_in_bmap(adap, eorxq->msix->idx);
304 305 }
305 306  
306 307 free_rspq_fl(adap, &eorxq->rspq, &eorxq->fl);
... ... @@ -609,6 +610,28 @@
609 610 cxgb_open(dev);
610 611  
611 612 return ret;
  613 +}
  614 +
  615 +void cxgb4_mqprio_stop_offload(struct adapter *adap)
  616 +{
  617 + struct cxgb4_tc_port_mqprio *tc_port_mqprio;
  618 + struct net_device *dev;
  619 + u8 i;
  620 +
  621 + if (!adap->tc_mqprio || !adap->tc_mqprio->port_mqprio)
  622 + return;
  623 +
  624 + for_each_port(adap, i) {
  625 + dev = adap->port[i];
  626 + if (!dev)
  627 + continue;
  628 +
  629 + tc_port_mqprio = &adap->tc_mqprio->port_mqprio[i];
  630 + if (!tc_port_mqprio->mqprio.qopt.num_tc)
  631 + continue;
  632 +
  633 + cxgb4_mqprio_disable_offload(dev);
  634 + }
612 635 }
613 636  
614 637 int cxgb4_init_tc_mqprio(struct adapter *adap)
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_mqprio.h
... ... @@ -38,6 +38,7 @@
38 38  
39 39 int cxgb4_setup_tc_mqprio(struct net_device *dev,
40 40 struct tc_mqprio_qopt_offload *mqprio);
  41 +void cxgb4_mqprio_stop_offload(struct adapter *adap);
41 42 int cxgb4_init_tc_mqprio(struct adapter *adap);
42 43 void cxgb4_cleanup_tc_mqprio(struct adapter *adap);
43 44 #endif /* __CXGB4_TC_MQPRIO_H__ */