- 論壇徽章:
- 0
|
LKD2 上也說 vmalloc 和 vfree 可能會(huì)睡眠,不能在中斷上下文中調(diào)用,我也想知道是為什么
所以看了一下代碼,發(fā)現(xiàn) 在 mm/vmalloc.c 中,vfree 是這樣實(shí)現(xiàn)的:
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;
} |
就是這個(gè)函數(shù)里,用了一個(gè) write_lock,如果別人持有這把鎖的話,在進(jìn)鎖的時(shí)候就會(huì)休眠了吧?
第一次在內(nèi)核版發(fā)貼,呵呵 |
|