acpi_os_unmap_iomem函数用于释放acpi_os_map_iomem 映射的虚拟地址
其源码分析如下:
void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size)
{
struct acpi_ioremap *map;
#如果是临时映射的,就调用对应的函数来释放
if (!acpi_permanent_mmap) {
__acpi_unmap_table(virt, size);
return;
}
mutex_lock(&acpi_ioremap_lock);
#通过虚拟地址和size 来在acpi_ioremaps中查找对应的map
map = acpi_map_lookup_virt(virt, size);
#map 为null的话,报错退出
if (!map) {
mutex_unlock(&acpi_ioremap_lock);
WARN(true, PREFIX "%s: bad address %p\n", __func__, virt);
return;
}
#删除map的list
acpi_os_drop_map_ref(map);
mutex_unlock(&acpi_ioremap_lock);
#unmap 这个虚拟地址
acpi_os_map_cleanup(map);
}
static void acpi_os_drop_map_ref(struct acpi_ioremap *map)
{
#当ref为零时,就删除这个map。否则减减是ref减一
if (!--map->refcount)
list_del_rcu(&map->list);
}
可以看到下面的函数中最终是通过acpi_umap来释放io memory的
static void acpi_os_map_cleanup(struct acpi_ioremap *map)
{
if (!map->refcount) {
synchronize_rcu_expedited();
acpi_unmap(map->phys, map->virt);
kfree(map);
}
}
内核ACPI函数API之acpi_os_unmap_iomem
最新推荐文章于 2023-11-16 11:09:14 发布