cxgb4: only free allocated fls
authorHariprasad Shenai <hariprasad@chelsio.com>
Mon, 4 Aug 2014 11:31:30 +0000 (17:01 +0530)
committerDavid S. Miller <davem@davemloft.net>
Mon, 4 Aug 2014 19:51:28 +0000 (12:51 -0700)
Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
drivers/net/ethernet/chelsio/cxgb4/sge.c

index 46156210df3418fe116a50cde88b07bdb2ea8790..c9b922cc3e67765838ab0376b9d6441fba932edb 100644 (file)
@@ -866,6 +866,7 @@ void t4_os_link_changed(struct adapter *adap, int port_id, int link_stat);
 void *t4_alloc_mem(size_t size);
 
 void t4_free_sge_resources(struct adapter *adap);
+void t4_free_ofld_rxqs(struct adapter *adap, int n, struct sge_ofld_rxq *q);
 irq_handler_t t4_intr_handler(struct adapter *adap);
 netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev);
 int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
index 8bae1aa744a723e993e2b6cb1b41a842cfd39a2e..b0bba32d69d5dfd51eb56cfa6a6e9d5d63f5fe62 100644 (file)
@@ -2479,6 +2479,22 @@ static void free_rspq_fl(struct adapter *adap, struct sge_rspq *rq,
        }
 }
 
+/**
+ *      t4_free_ofld_rxqs - free a block of consecutive Rx queues
+ *      @adap: the adapter
+ *      @n: number of queues
+ *      @q: pointer to first queue
+ *
+ *      Release the resources of a consecutive block of offload Rx queues.
+ */
+void t4_free_ofld_rxqs(struct adapter *adap, int n, struct sge_ofld_rxq *q)
+{
+       for ( ; n; n--, q++)
+               if (q->rspq.desc)
+                       free_rspq_fl(adap, &q->rspq,
+                                    q->fl.size ? &q->fl : NULL);
+}
+
 /**
  *     t4_free_sge_resources - free SGE resources
  *     @adap: the adapter
@@ -2490,12 +2506,12 @@ void t4_free_sge_resources(struct adapter *adap)
        int i;
        struct sge_eth_rxq *eq = adap->sge.ethrxq;
        struct sge_eth_txq *etq = adap->sge.ethtxq;
-       struct sge_ofld_rxq *oq = adap->sge.ofldrxq;
 
        /* clean up Ethernet Tx/Rx queues */
        for (i = 0; i < adap->sge.ethqsets; i++, eq++, etq++) {
                if (eq->rspq.desc)
-                       free_rspq_fl(adap, &eq->rspq, &eq->fl);
+                       free_rspq_fl(adap, &eq->rspq,
+                                    eq->fl.size ? &eq->fl : NULL);
                if (etq->q.desc) {
                        t4_eth_eq_free(adap, adap->fn, adap->fn, 0,
                                       etq->q.cntxt_id);
@@ -2506,18 +2522,9 @@ void t4_free_sge_resources(struct adapter *adap)
        }
 
        /* clean up RDMA and iSCSI Rx queues */
-       for (i = 0; i < adap->sge.ofldqsets; i++, oq++) {
-               if (oq->rspq.desc)
-                       free_rspq_fl(adap, &oq->rspq, &oq->fl);
-       }
-       for (i = 0, oq = adap->sge.rdmarxq; i < adap->sge.rdmaqs; i++, oq++) {
-               if (oq->rspq.desc)
-                       free_rspq_fl(adap, &oq->rspq, &oq->fl);
-       }
-       for (i = 0, oq = adap->sge.rdmaciq; i < adap->sge.rdmaciqs; i++, oq++) {
-               if (oq->rspq.desc)
-                       free_rspq_fl(adap, &oq->rspq, &oq->fl);
-       }
+       t4_free_ofld_rxqs(adap, adap->sge.ofldqsets, adap->sge.ofldrxq);
+       t4_free_ofld_rxqs(adap, adap->sge.rdmaqs, adap->sge.rdmarxq);
+       t4_free_ofld_rxqs(adap, adap->sge.rdmaciqs, adap->sge.rdmaciq);
 
        /* clean up offload Tx queues */
        for (i = 0; i < ARRAY_SIZE(adap->sge.ofldtxq); i++) {