Commit 7544d402 authored by Raghava Aditya Renukunta's avatar Raghava Aditya Renukunta Committed by Ben Hutchings

scsi: aacraid: Fix memory leak in fib init path

commit 1bff5abc upstream.

aac_fib_map_free frees misaligned fib dma memory, additionally it does not
free up the whole memory.

Fixed by changing the  code to free up the correct and full memory
allocation.

Fixes: e8b12f0f ([SCSI] aacraid: Add new code for PMC-Sierra's SRC based controller family)
Signed-off-by: default avatarRaghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Reviewed-by: default avatarDavid Carroll <David.Carroll@microsemi.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
[bwh: Backported to 3.16: s/max_cmd_size/max_fib_size/]
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent ba618caa
...@@ -83,12 +83,20 @@ static int fib_map_alloc(struct aac_dev *dev) ...@@ -83,12 +83,20 @@ static int fib_map_alloc(struct aac_dev *dev)
void aac_fib_map_free(struct aac_dev *dev) void aac_fib_map_free(struct aac_dev *dev)
{ {
if (dev->hw_fib_va && dev->max_fib_size) { size_t alloc_size;
pci_free_consistent(dev->pdev, size_t fib_size;
(dev->max_fib_size * int num_fibs;
(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)),
dev->hw_fib_va, dev->hw_fib_pa); if(!dev->hw_fib_va || !dev->max_fib_size)
} return;
num_fibs = dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB;
fib_size = dev->max_fib_size + sizeof(struct aac_fib_xporthdr);
alloc_size = fib_size * num_fibs + ALIGN32 - 1;
pci_free_consistent(dev->pdev, alloc_size, dev->hw_fib_va,
dev->hw_fib_pa);
dev->hw_fib_va = NULL; dev->hw_fib_va = NULL;
dev->hw_fib_pa = 0; dev->hw_fib_pa = 0;
} }
...@@ -116,22 +124,20 @@ int aac_fib_setup(struct aac_dev * dev) ...@@ -116,22 +124,20 @@ int aac_fib_setup(struct aac_dev * dev)
if (i<0) if (i<0)
return -ENOMEM; return -ENOMEM;
/* 32 byte alignment for PMC */
hw_fib_pa = (dev->hw_fib_pa + (ALIGN32 - 1)) & ~(ALIGN32 - 1);
dev->hw_fib_va = (struct hw_fib *)((unsigned char *)dev->hw_fib_va +
(hw_fib_pa - dev->hw_fib_pa));
dev->hw_fib_pa = hw_fib_pa;
memset(dev->hw_fib_va, 0, memset(dev->hw_fib_va, 0,
(dev->max_fib_size + sizeof(struct aac_fib_xporthdr)) * (dev->max_fib_size + sizeof(struct aac_fib_xporthdr)) *
(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)); (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB));
/* 32 byte alignment for PMC */
hw_fib_pa = (dev->hw_fib_pa + (ALIGN32 - 1)) & ~(ALIGN32 - 1);
hw_fib = (struct hw_fib *)((unsigned char *)dev->hw_fib_va +
(hw_fib_pa - dev->hw_fib_pa));
/* add Xport header */ /* add Xport header */
dev->hw_fib_va = (struct hw_fib *)((unsigned char *)dev->hw_fib_va + hw_fib = (struct hw_fib *)((unsigned char *)hw_fib +
sizeof(struct aac_fib_xporthdr)); sizeof(struct aac_fib_xporthdr));
dev->hw_fib_pa += sizeof(struct aac_fib_xporthdr); hw_fib_pa += sizeof(struct aac_fib_xporthdr);
hw_fib = dev->hw_fib_va;
hw_fib_pa = dev->hw_fib_pa;
/* /*
* Initialise the fibs * Initialise the fibs
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment