Skip to content

Commit 8225489

Browse files
4RH1T3CT0R7gregkh
authored andcommitted
staging: sm750fb: add missing pci_release_region on error and removal
hw_sm750_map() calls pci_request_region() but never releases the region on error paths or in lynxfb_pci_remove(). This causes a resource leak that prevents the PCI region from being mapped again after driver removal or a failed probe. A TODO comment in the code acknowledges this missing cleanup. Restructure the error handling in hw_sm750_map() to properly release the PCI region on ioremap failures, and add pci_release_region() to lynxfb_pci_remove(). Signed-off-by: Artem Lytkin <iprintercanon@gmail.com> Cc: stable <stable@kernel.org> Link: https://patch.msgid.link/20260216202038.1828-1-iprintercanon@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 6de23f8 commit 8225489

2 files changed

Lines changed: 12 additions & 11 deletions

File tree

drivers/staging/sm750fb/sm750.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,6 +1123,7 @@ static void lynxfb_pci_remove(struct pci_dev *pdev)
11231123

11241124
iounmap(sm750_dev->pvReg);
11251125
iounmap(sm750_dev->pvMem);
1126+
pci_release_region(pdev, 1);
11261127
kfree(g_settings);
11271128
}
11281129

drivers/staging/sm750fb/sm750_hw.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,11 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev)
3636

3737
pr_info("mmio phyAddr = %lx\n", sm750_dev->vidreg_start);
3838

39-
/*
40-
* reserve the vidreg space of smi adaptor
41-
* if you do this, you need to add release region code
42-
* in lynxfb_remove, or memory will not be mapped again
43-
* successfully
44-
*/
39+
/* reserve the vidreg space of smi adaptor */
4540
ret = pci_request_region(pdev, 1, "sm750fb");
4641
if (ret) {
4742
pr_err("Can not request PCI regions.\n");
48-
goto exit;
43+
return ret;
4944
}
5045

5146
/* now map mmio and vidmem */
@@ -54,7 +49,7 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev)
5449
if (!sm750_dev->pvReg) {
5550
pr_err("mmio failed\n");
5651
ret = -EFAULT;
57-
goto exit;
52+
goto err_release_region;
5853
}
5954
pr_info("mmio virtual addr = %p\n", sm750_dev->pvReg);
6055

@@ -79,13 +74,18 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev)
7974
sm750_dev->pvMem =
8075
ioremap_wc(sm750_dev->vidmem_start, sm750_dev->vidmem_size);
8176
if (!sm750_dev->pvMem) {
82-
iounmap(sm750_dev->pvReg);
8377
pr_err("Map video memory failed\n");
8478
ret = -EFAULT;
85-
goto exit;
79+
goto err_unmap_reg;
8680
}
8781
pr_info("video memory vaddr = %p\n", sm750_dev->pvMem);
88-
exit:
82+
83+
return 0;
84+
85+
err_unmap_reg:
86+
iounmap(sm750_dev->pvReg);
87+
err_release_region:
88+
pci_release_region(pdev, 1);
8989
return ret;
9090
}
9191

0 commit comments

Comments
 (0)