Skip to content

Commit d13d170

Browse files
committed
Merge branch 'ibmvnic-Fix-bugs-and-memory-leaks'
Thomas Falcon says: ==================== ibmvnic: Fix bugs and memory leaks This is a small patch series fixing up some bugs and memory leaks in the ibmvnic driver. The first fix frees up previously allocated memory that should be freed in case of an error. The second fixes a reset case that was failing due to TX/RX queue IRQ's being erroneously disabled without being enabled again. The final patch fixes incorrect reallocated of statistics buffers during a device reset, resulting in loss of statistics information and a memory leak. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 5a847a6 + 0718421 commit d13d170

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

drivers/net/ethernet/ibm/ibmvnic.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ static int alloc_long_term_buff(struct ibmvnic_adapter *adapter,
192192
if (adapter->fw_done_rc) {
193193
dev_err(dev, "Couldn't map long term buffer,rc = %d\n",
194194
adapter->fw_done_rc);
195+
dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr);
195196
return -1;
196197
}
197198
return 0;
@@ -1821,9 +1822,8 @@ static int do_reset(struct ibmvnic_adapter *adapter,
18211822
if (rc)
18221823
return rc;
18231824
}
1825+
ibmvnic_disable_irqs(adapter);
18241826
}
1825-
1826-
ibmvnic_disable_irqs(adapter);
18271827
adapter->state = VNIC_CLOSED;
18281828

18291829
if (reset_state == VNIC_CLOSED)
@@ -4586,14 +4586,6 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter)
45864586
release_crq_queue(adapter);
45874587
}
45884588

4589-
rc = init_stats_buffers(adapter);
4590-
if (rc)
4591-
return rc;
4592-
4593-
rc = init_stats_token(adapter);
4594-
if (rc)
4595-
return rc;
4596-
45974589
return rc;
45984590
}
45994591

@@ -4662,13 +4654,21 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
46624654
goto ibmvnic_init_fail;
46634655
} while (rc == EAGAIN);
46644656

4657+
rc = init_stats_buffers(adapter);
4658+
if (rc)
4659+
goto ibmvnic_init_fail;
4660+
4661+
rc = init_stats_token(adapter);
4662+
if (rc)
4663+
goto ibmvnic_stats_fail;
4664+
46654665
netdev->mtu = adapter->req_mtu - ETH_HLEN;
46664666
netdev->min_mtu = adapter->min_mtu - ETH_HLEN;
46674667
netdev->max_mtu = adapter->max_mtu - ETH_HLEN;
46684668

46694669
rc = device_create_file(&dev->dev, &dev_attr_failover);
46704670
if (rc)
4671-
goto ibmvnic_init_fail;
4671+
goto ibmvnic_dev_file_err;
46724672

46734673
netif_carrier_off(netdev);
46744674
rc = register_netdev(netdev);
@@ -4687,6 +4687,12 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
46874687
ibmvnic_register_fail:
46884688
device_remove_file(&dev->dev, &dev_attr_failover);
46894689

4690+
ibmvnic_dev_file_err:
4691+
release_stats_token(adapter);
4692+
4693+
ibmvnic_stats_fail:
4694+
release_stats_buffers(adapter);
4695+
46904696
ibmvnic_init_fail:
46914697
release_sub_crqs(adapter, 1);
46924698
release_crq_queue(adapter);

0 commit comments

Comments
 (0)