]> git.baikalelectronics.ru Git - kernel.git/commitdiff
scsi: pm80xx: Fix memory leak during rmmod
authorAjish Koshy <Ajish.Koshy@microchip.com>
Mon, 6 Sep 2021 17:04:04 +0000 (22:34 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 15 Sep 2021 02:29:11 +0000 (22:29 -0400)
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>
drivers/scsi/pm8001/pm8001_init.c
drivers/scsi/pm8001/pm8001_sas.h

index 613455a3e686d88b1ca54aedf121a284699e7fb4..7082fecf7ce8088e6f7cc4f2b43b77a598517b06 100644 (file)
@@ -1199,6 +1199,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) {
@@ -1260,6 +1261,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 3274d88a9ccce5d3d5c4a1fb37bb93dd7fa70076..7e999768bfd2d044a949b16b5b6a84f68c86200c 100644 (file)
@@ -518,6 +518,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]