scsi: pm80xx: Fix memory leak during rmmod
authorAjish Koshy <Ajish.Koshy@microchip.com>
Mon, 6 Sep 2021 17:04:04 +0000 (22:34 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Nov 2021 08:48:24 +0000 (09:48 +0100)
[ Upstream commit 51e6ed83bb4ade7c360551fa4ae55c4eacea354b ]

Driver failed to release all memory allocated. This would lead to memory
leak during driver removal.

Properly free memory when the module is removed.

Link: https://lore.kernel.org/r/20210906170404.5682-5-Ajish.Koshy@microchip.com
Acked-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Ajish Koshy <Ajish.Koshy@microchip.com>
Signed-off-by: Viswas G <Viswas.G@microchip.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/pm8001/pm8001_init.c
drivers/scsi/pm8001/pm8001_sas.h

index 47db7e0beae6f6043f7bc4d7e703eb0f1bcbab37..729d8252028e84fb1dea7df68bc62ea6a05a177b 100644 (file)
@@ -1198,6 +1198,7 @@ pm8001_init_ccb_tag(struct pm8001_hba_info *pm8001_ha, struct Scsi_Host *shost,
                goto err_out;
 
        /* Memory region for ccb_info*/
+       pm8001_ha->ccb_count = ccb_count;
        pm8001_ha->ccb_info =
                kcalloc(ccb_count, sizeof(struct pm8001_ccb_info), GFP_KERNEL);
        if (!pm8001_ha->ccb_info) {
@@ -1259,6 +1260,16 @@ static void pm8001_pci_remove(struct pci_dev *pdev)
                        tasklet_kill(&pm8001_ha->tasklet[j]);
 #endif
        scsi_host_put(pm8001_ha->shost);
+
+       for (i = 0; i < pm8001_ha->ccb_count; i++) {
+               dma_free_coherent(&pm8001_ha->pdev->dev,
+                       sizeof(struct pm8001_prd) * PM8001_MAX_DMA_SG,
+                       pm8001_ha->ccb_info[i].buf_prd,
+                       pm8001_ha->ccb_info[i].ccb_dma_handle);
+       }
+       kfree(pm8001_ha->ccb_info);
+       kfree(pm8001_ha->devices);
+
        pm8001_free(pm8001_ha);
        kfree(sha->sas_phy);
        kfree(sha->sas_port);
index e18f2b60371db3b270bda3e01fa4c88cf82663b8..f40a41f450d9bfe1aa34e1b44171e03edcf7d6ea 100644 (file)
@@ -517,6 +517,7 @@ struct pm8001_hba_info {
        u32                     iomb_size; /* SPC and SPCV IOMB size */
        struct pm8001_device    *devices;
        struct pm8001_ccb_info  *ccb_info;
+       u32                     ccb_count;
 #ifdef PM8001_USE_MSIX
        int                     number_of_intr;/*will be used in remove()*/
        char                    intr_drvname[PM8001_MAX_MSIX_VEC]