diff options
author | Nathan Fontenot <nfont@linux.vnet.ibm.com> | 2017-03-30 08:49:29 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-03-31 00:58:43 +0200 |
commit | 1b8955ee5f6c1575c09b44c8253883394c78bef7 (patch) | |
tree | be622d0e5ef5809297d279f6c12e1a11b6fc0c16 | |
parent | ibmvnic: Create init/release routines for stats token (diff) | |
download | linux-1b8955ee5f6c1575c09b44c8253883394c78bef7.tar.xz linux-1b8955ee5f6c1575c09b44c8253883394c78bef7.zip |
ibmvnic: Cleanup failure path in ibmvnic_open
Now that ibmvnic_release_resources will clean up all of our resources
properly, even if they were not allocated, we can just call this
for failues in ibmvnic_open.
This patch also moves the ibmvnic_release_resources() routine up
in the file to avoid creating a forward declaration ad re-names it to
drop the ibmvnic prefix.
Signed-off-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/ibm/ibmvnic.c | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index a2f972d72e34..7ba43cfadf3a 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c @@ -578,13 +578,23 @@ static int ibmvnic_login(struct net_device *netdev) return 0; } +static void release_resources(struct ibmvnic_adapter *adapter) +{ + release_bounce_buffer(adapter); + release_tx_pools(adapter); + release_rx_pools(adapter); + + release_sub_crqs(adapter); + release_crq_queue(adapter); + + release_stats_token(adapter); +} + static int ibmvnic_open(struct net_device *netdev) { struct ibmvnic_adapter *adapter = netdev_priv(netdev); struct device *dev = &adapter->vdev->dev; union ibmvnic_crq crq; - int rxadd_subcrqs; - int tx_subcrqs; int rc = 0; int i; @@ -610,16 +620,11 @@ static int ibmvnic_open(struct net_device *netdev) return -1; } - rxadd_subcrqs = - be32_to_cpu(adapter->login_rsp_buf->num_rxadd_subcrqs); - tx_subcrqs = - be32_to_cpu(adapter->login_rsp_buf->num_txsubm_subcrqs); - adapter->map_id = 1; adapter->napi = kcalloc(adapter->req_rx_queues, sizeof(struct napi_struct), GFP_KERNEL); if (!adapter->napi) - goto alloc_napi_failed; + goto ibmvnic_open_fail; for (i = 0; i < adapter->req_rx_queues; i++) { netif_napi_add(netdev, &adapter->napi[i], ibmvnic_poll, NAPI_POLL_WEIGHT); @@ -630,15 +635,15 @@ static int ibmvnic_open(struct net_device *netdev) rc = init_rx_pools(netdev); if (rc) - goto rx_pool_failed; + goto ibmvnic_open_fail; rc = init_tx_pools(netdev); if (rc) - goto tx_pool_failed; + goto ibmvnic_open_fail; rc = init_bounce_buffer(netdev); if (rc) - goto bounce_init_failed; + goto ibmvnic_open_fail; replenish_pools(adapter); @@ -662,31 +667,13 @@ static int ibmvnic_open(struct net_device *netdev) return 0; -bounce_init_failed: - i = tx_subcrqs - 1; - kfree(adapter->tx_pool[i].free_map); -tx_pool_failed: - i = rxadd_subcrqs; -rx_pool_failed: +ibmvnic_open_fail: for (i = 0; i < adapter->req_rx_queues; i++) napi_disable(&adapter->napi[i]); -alloc_napi_failed: - release_sub_crqs(adapter); + release_resources(adapter); return -ENOMEM; } -static void ibmvnic_release_resources(struct ibmvnic_adapter *adapter) -{ - release_bounce_buffer(adapter); - release_tx_pools(adapter); - release_rx_pools(adapter); - - release_sub_crqs(adapter); - release_crq_queue(adapter); - - release_stats_token(adapter); -} - static int ibmvnic_close(struct net_device *netdev) { struct ibmvnic_adapter *adapter = netdev_priv(netdev); @@ -707,7 +694,7 @@ static int ibmvnic_close(struct net_device *netdev) crq.logical_link_state.link_state = IBMVNIC_LOGICAL_LNK_DN; ibmvnic_send_crq(adapter, &crq); - ibmvnic_release_resources(adapter); + release_resources(adapter); adapter->is_closed = true; adapter->closing = false; |