1
Description
Bug reported by smatch
:
1 | drivers/atm/he.c:1520 he_start() warn: 'he_dev->membase' from ioremap() not released on lines: 1061,1118,1168,1417,1427,1433,1468. |
Solution
1 | false positive. |
2
Description
Bug reported by smatch
:
1 | drivers/gpu/drm/tiny/bochs.c:290 bochs_hw_init() warn: 'bochs->mmio' from ioremap() not released on lines: 246,250,254. |
Solution
About drivers/gpu/drm/tiny/bochs.c
drivers/gpu/drm/tiny/bochs.c
是Linux内核中的一个设备驱动程序,用于支持Bochs/QEMU
虚拟机的图形显示器。它实现了Direct Rendering Manager(DRM)子系统中的驱动程序接口,使得Linux操作系统可以与Bochs/QEMU
虚拟机的图形显示器进行通信,以在虚拟环境中显示图形界面。
DRM是Direct Rendering Manager的缩写,是Linux内核中的一个子系统。它提供了用于管理图形硬件设备和处理图形渲染的驱动程序接口,并且允许用户空间应用程序直接访问图形硬件资源。
DRM还提供了一些特殊的功能,例如Kernel Mode Setting(KMS),它允许内核控制显卡输出的分辨率、刷新率等参数,从而改善图形显示性能和质量。此外,DRM还支持3D加速、视频解码等高级图形处理技术,使得Linux系统在图形渲染方面具备与Windows和macOS等操作系统相当的能力。
About ioremap
& iounmap
在Linux内核中,ioremap()和iounmap()是用于映射物理地址到虚拟地址的函数。
ioremap()函数将一个物理地址映射到内核虚拟地址空间中,并返回这个虚拟地址。这个函数通常用于驱动程序需要访问硬件设备的寄存器或者其他I/O内存时使用。通过使用ioremap(),驱动程序可以获得一个虚拟地址,用于访问I/O内存。
iounmap()函数则是用于撤销ioremap()所创建的虚拟地址映射。当驱动程序不再需要访问I/O内存时,应该调用iounmap()来释放这些虚拟地址空间,以便其他进程或驱动程序可以使用它们。
需要注意的是,因为ioremap()
和iounmap()
都涉及到对内核虚拟地址空间的修改,因此必须在内核模块中使用,并且需要特权权限才能够使用。
lines in function bochs_hw_init
1 | if ((id & 0xfff0) != VBE_DISPI_ID0) { |
原文件即有的ioremap
, in bochs_hw_init
:
1 | bochs->mmio = ioremap(ioaddr, iosize); |
原文件即有的iounmap
, in bochs_hw_fini
:
1 | static void bochs_hw_fini(struct drm_device *dev) |
发现bochs_load
中,调用bochs_hw_init(dev)
得到返回值ret
,
如果
ret
为非0,会直接返回,唯一一处调用bochs_load
的在函数bochs_pci_probe
,中的判断为1
2
3
4
5
6
7
8
9ret = bochs_load(dev);
if (ret)
goto err_free_dev;
...
err_hw_fini:
bochs_hw_fini(dev); (X)
err_free_dev: <---
drm_dev_put(dev);
return ret;此时不会进入
bochs_hw_fini
即不会释放。如果
ret
为0(bochs_hw_init
初始化成功)则进一步初始化drmm_vram_helper_init
,和我们后续的分析无关。
注意在bochs_hw_init
中的返回值共有
1 | -EBUSY, -ENOMEM, -ENODEV, 0 |
原文件即有的对bochs_hw_fini
的调用:
1 | -> static int bochs_load(struct drm_device *dev): |