diff options
author | Hariprasad Shenai <hariprasad@chelsio.com> | 2014-08-04 07:31:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-08-04 15:51:28 -0400 |
commit | 5fa766946ba3ef88374445ec014f0e72481fd63a (patch) | |
tree | 7eebee180c38ad36e0fedfe79635f36770513555 | |
parent | 4b7a9168e1f795368458cc4ca92224c4481bedf8 (diff) |
cxgb4: only free allocated fls
Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/sge.c | 35 |
2 files changed, 22 insertions, 14 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h index 46156210df34..c9b922cc3e67 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | |||
@@ -866,6 +866,7 @@ void t4_os_link_changed(struct adapter *adap, int port_id, int link_stat); | |||
866 | void *t4_alloc_mem(size_t size); | 866 | void *t4_alloc_mem(size_t size); |
867 | 867 | ||
868 | void t4_free_sge_resources(struct adapter *adap); | 868 | void t4_free_sge_resources(struct adapter *adap); |
869 | void t4_free_ofld_rxqs(struct adapter *adap, int n, struct sge_ofld_rxq *q); | ||
869 | irq_handler_t t4_intr_handler(struct adapter *adap); | 870 | irq_handler_t t4_intr_handler(struct adapter *adap); |
870 | netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev); | 871 | netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev); |
871 | int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp, | 872 | int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp, |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c index 8bae1aa744a7..b0bba32d69d5 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c | |||
@@ -2480,6 +2480,22 @@ static void free_rspq_fl(struct adapter *adap, struct sge_rspq *rq, | |||
2480 | } | 2480 | } |
2481 | 2481 | ||
2482 | /** | 2482 | /** |
2483 | * t4_free_ofld_rxqs - free a block of consecutive Rx queues | ||
2484 | * @adap: the adapter | ||
2485 | * @n: number of queues | ||
2486 | * @q: pointer to first queue | ||
2487 | * | ||
2488 | * Release the resources of a consecutive block of offload Rx queues. | ||
2489 | */ | ||
2490 | void t4_free_ofld_rxqs(struct adapter *adap, int n, struct sge_ofld_rxq *q) | ||
2491 | { | ||
2492 | for ( ; n; n--, q++) | ||
2493 | if (q->rspq.desc) | ||
2494 | free_rspq_fl(adap, &q->rspq, | ||
2495 | q->fl.size ? &q->fl : NULL); | ||
2496 | } | ||
2497 | |||
2498 | /** | ||
2483 | * t4_free_sge_resources - free SGE resources | 2499 | * t4_free_sge_resources - free SGE resources |
2484 | * @adap: the adapter | 2500 | * @adap: the adapter |
2485 | * | 2501 | * |
@@ -2490,12 +2506,12 @@ void t4_free_sge_resources(struct adapter *adap) | |||
2490 | int i; | 2506 | int i; |
2491 | struct sge_eth_rxq *eq = adap->sge.ethrxq; | 2507 | struct sge_eth_rxq *eq = adap->sge.ethrxq; |
2492 | struct sge_eth_txq *etq = adap->sge.ethtxq; | 2508 | struct sge_eth_txq *etq = adap->sge.ethtxq; |
2493 | struct sge_ofld_rxq *oq = adap->sge.ofldrxq; | ||
2494 | 2509 | ||
2495 | /* clean up Ethernet Tx/Rx queues */ | 2510 | /* clean up Ethernet Tx/Rx queues */ |
2496 | for (i = 0; i < adap->sge.ethqsets; i++, eq++, etq++) { | 2511 | for (i = 0; i < adap->sge.ethqsets; i++, eq++, etq++) { |
2497 | if (eq->rspq.desc) | 2512 | if (eq->rspq.desc) |
2498 | free_rspq_fl(adap, &eq->rspq, &eq->fl); | 2513 | free_rspq_fl(adap, &eq->rspq, |
2514 | eq->fl.size ? &eq->fl : NULL); | ||
2499 | if (etq->q.desc) { | 2515 | if (etq->q.desc) { |
2500 | t4_eth_eq_free(adap, adap->fn, adap->fn, 0, | 2516 | t4_eth_eq_free(adap, adap->fn, adap->fn, 0, |
2501 | etq->q.cntxt_id); | 2517 | etq->q.cntxt_id); |
@@ -2506,18 +2522,9 @@ void t4_free_sge_resources(struct adapter *adap) | |||
2506 | } | 2522 | } |
2507 | 2523 | ||
2508 | /* clean up RDMA and iSCSI Rx queues */ | 2524 | /* clean up RDMA and iSCSI Rx queues */ |
2509 | for (i = 0; i < adap->sge.ofldqsets; i++, oq++) { | 2525 | t4_free_ofld_rxqs(adap, adap->sge.ofldqsets, adap->sge.ofldrxq); |
2510 | if (oq->rspq.desc) | 2526 | t4_free_ofld_rxqs(adap, adap->sge.rdmaqs, adap->sge.rdmarxq); |
2511 | free_rspq_fl(adap, &oq->rspq, &oq->fl); | 2527 | t4_free_ofld_rxqs(adap, adap->sge.rdmaciqs, adap->sge.rdmaciq); |
2512 | } | ||
2513 | for (i = 0, oq = adap->sge.rdmarxq; i < adap->sge.rdmaqs; i++, oq++) { | ||
2514 | if (oq->rspq.desc) | ||
2515 | free_rspq_fl(adap, &oq->rspq, &oq->fl); | ||
2516 | } | ||
2517 | for (i = 0, oq = adap->sge.rdmaciq; i < adap->sge.rdmaciqs; i++, oq++) { | ||
2518 | if (oq->rspq.desc) | ||
2519 | free_rspq_fl(adap, &oq->rspq, &oq->fl); | ||
2520 | } | ||
2521 | 2528 | ||
2522 | /* clean up offload Tx queues */ | 2529 | /* clean up offload Tx queues */ |
2523 | for (i = 0; i < ARRAY_SIZE(adap->sge.ofldtxq); i++) { | 2530 | for (i = 0; i < ARRAY_SIZE(adap->sge.ofldtxq); i++) { |