bnx2x: fix memory leak in bnx2x_init_firmware()
When cycling the interface down and up, bnx2x_init_firmware() knows that the firmware is already loaded, but nevertheless it allocates certain arrays anew (init_data, init_ops, init_ops_offsets, iro_arr). The old arrays are leaked. Fix the leaks by returning early if the firmware was already loaded. Because if the firmware is loaded, so are the arrays. Signed-off-by: Michal Schmidt <mschmidt@redhat.com> Acked-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
127d0a198a
commit
c0ea452e42
@@ -10824,38 +10824,36 @@ do { \
|
|||||||
|
|
||||||
int bnx2x_init_firmware(struct bnx2x *bp)
|
int bnx2x_init_firmware(struct bnx2x *bp)
|
||||||
{
|
{
|
||||||
|
const char *fw_file_name;
|
||||||
struct bnx2x_fw_file_hdr *fw_hdr;
|
struct bnx2x_fw_file_hdr *fw_hdr;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
if (bp->firmware)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (!bp->firmware) {
|
if (CHIP_IS_E1(bp))
|
||||||
const char *fw_file_name;
|
fw_file_name = FW_FILE_NAME_E1;
|
||||||
|
else if (CHIP_IS_E1H(bp))
|
||||||
|
fw_file_name = FW_FILE_NAME_E1H;
|
||||||
|
else if (!CHIP_IS_E1x(bp))
|
||||||
|
fw_file_name = FW_FILE_NAME_E2;
|
||||||
|
else {
|
||||||
|
BNX2X_ERR("Unsupported chip revision\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
BNX2X_DEV_INFO("Loading %s\n", fw_file_name);
|
||||||
|
|
||||||
if (CHIP_IS_E1(bp))
|
rc = request_firmware(&bp->firmware, fw_file_name, &bp->pdev->dev);
|
||||||
fw_file_name = FW_FILE_NAME_E1;
|
if (rc) {
|
||||||
else if (CHIP_IS_E1H(bp))
|
BNX2X_ERR("Can't load firmware file %s\n",
|
||||||
fw_file_name = FW_FILE_NAME_E1H;
|
fw_file_name);
|
||||||
else if (!CHIP_IS_E1x(bp))
|
goto request_firmware_exit;
|
||||||
fw_file_name = FW_FILE_NAME_E2;
|
}
|
||||||
else {
|
|
||||||
BNX2X_ERR("Unsupported chip revision\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
BNX2X_DEV_INFO("Loading %s\n", fw_file_name);
|
|
||||||
|
|
||||||
rc = request_firmware(&bp->firmware, fw_file_name,
|
rc = bnx2x_check_firmware(bp);
|
||||||
&bp->pdev->dev);
|
if (rc) {
|
||||||
if (rc) {
|
BNX2X_ERR("Corrupt firmware file %s\n", fw_file_name);
|
||||||
BNX2X_ERR("Can't load firmware file %s\n",
|
goto request_firmware_exit;
|
||||||
fw_file_name);
|
|
||||||
goto request_firmware_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = bnx2x_check_firmware(bp);
|
|
||||||
if (rc) {
|
|
||||||
BNX2X_ERR("Corrupt firmware file %s\n", fw_file_name);
|
|
||||||
goto request_firmware_exit;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fw_hdr = (struct bnx2x_fw_file_hdr *)bp->firmware->data;
|
fw_hdr = (struct bnx2x_fw_file_hdr *)bp->firmware->data;
|
||||||
|
Reference in New Issue
Block a user