- 论坛徽章:
- 0
|
LKD2 上也说 vmalloc 和 vfree 可能会睡眠,不能在中断上下文中调用,我也想知道是为什么
所以看了一下代码,发现 在 mm/vmalloc.c 中,vfree 是这样实现的:
void vfree(const void *addr)
{
BUG_ON(in_interrupt());
__vunmap(addr, 1);
}
EXPORT_SYMBOL(vfree); |
再看 __vunmap , 它是这样的:static void __vunmap(const void *addr, int deallocate_pages)
{
struct vm_struct *area;
if (!addr)
return;
if ((PAGE_SIZE-1) & (unsigned long)addr) {
WARN(1, KERN_ERR "Trying to vfree() bad address (%p)\n", addr);
return;
}
area = remove_vm_area(addr);
if (unlikely(!area)) {
WARN(1, KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n",
addr);
return;
}
debug_check_no_locks_freed(addr, area->size);
debug_check_no_obj_freed(addr, area->size);
if (deallocate_pages) {
int i;
for (i = 0; i < area->nr_pages; i++) {
struct page *page = area->pages[i];
BUG_ON(!page);
__free_page(page);
}
if (area->flags & VM_VPAGES)
vfree(area->pages);
else
kfree(area->pages);
}
kfree(area);
return;
} |
接着看 area = remove_vm_area(addr); 这一句, remove_vm_area():
struct vm_struct *remove_vm_area(const void *addr)
{
struct vm_struct *v;
write_lock(&vmlist_lock);
v = __remove_vm_area(addr);
write_unlock(&vmlist_lock);
return v;
} |
就是这个函数里,用了一个 write_lock,如果别人持有这把锁的话,在进锁的时候就会休眠了吧?
第一次在内核版发贴,呵呵 |
|