为什么访问zsmalloc应该在原子上下文中

时间:2017-11-08 03:54:56

标签: linux-kernel kernel atomic zlib

当我们调用zs_map_object时,返回值是每个CPU对象?为什么我们不允许在中断上下文中进行映射?

1 个答案:

答案 0 :(得分:0)

很容易看出你是否检查了代码。

您似乎一次最多只能拥有一个映射。

现在让我们来看看:

area = &get_cpu_var(zs_map_area);
area->vm_mm = mm;
if (off + class->size <= PAGE_SIZE) {
        /* this object is contained entirely within a page */
        area->vm_addr = kmap_atomic(page);
        ret = area->vm_addr + off;
        goto out;
}

/* this object spans two pages */
pages[0] = page;
pages[1] = get_next_page(page);

然后你去 - 想象如果在映射开始设置之后中断触发会发生什么,例如在area-&gt; vm_mm = mm之后。无论做什么工作都将被从处理程序运行的代码覆盖,但在处理程序返回后没有任何东西可以恢复它,从而产生错误。