*参照元 [#yf87b521]
#backlinks

*説明 [#te17df5e]
-パス: [[linux-2.6.33/mm/vmalloc.c]]

-FIXME: これは何?
--説明


**引数 [#zc91f510]
-const void *addr
--マッピングを解除する領域の先頭アドレス。
--マッピングを解除する領域の先頭の仮想アドレス。
-int deallocate_pages
--解放が必要(vmalloc で確保したページなど)なら 1、
そうでない(vmap でマッピングしたページなど)なら 0。


**返り値 [#af11e598]
-なし


**参考 [#u1eac875]


*実装 [#a6a51e41]
 static void __vunmap(const void *addr, int deallocate_pages)
 {
 	struct vm_struct *area;
 
-
--[[linux-2.6.33/vm_struct]]

 	if (!addr)
 		return;
 
-NULL が指定された場合は何もしない。

 	if ((PAGE_SIZE-1) & (unsigned long)addr) {
 		WARN(1, KERN_ERR "Trying to vfree() bad address (%p)\n", addr);
 		return;
 	}
 
-ページサイズ境界に合わないアドレスを指定した場合、
エラーを表示する以外、何もしない。
-
--[[linux-2.6.33/PAGE_SIZE]]
-
--[[linux-2.6.33/WARN()]]

 	area = remove_vm_area(addr);
 	if (unlikely(!area)) {
 		WARN(1, KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n",
 				addr);
 		return;
 	}
 
-
--[[linux-2.6.33/remove_vm_area()]]
-
--[[linux-2.6.33/unlikely()]]

 	debug_check_no_locks_freed(addr, area->size);
 	debug_check_no_obj_freed(addr, area->size);
 
-
--[[linux-2.6.33/debug_check_no_locks_freed()]]
-
--[[linux-2.6.33/debug_check_no_obj_freed()]]

 	if (deallocate_pages) {
 		int i;
 
-vmalloc で確保されたページなど、解放する必要がある場合。

 		for (i = 0; i < area->nr_pages; i++) {
 			struct page *page = area->pages[i];
 
-
--[[linux-2.6.33/page]]

 			BUG_ON(!page);
 			__free_page(page);
-
--[[linux-2.6.33/BUG_ON()]]
-
--[[linux-2.6.33/__free_page()]]

 		}
 
 		if (area->flags & VM_VPAGES)
 			vfree(area->pages);
 		else
 			kfree(area->pages);
-
--[[linux-2.6.33/vfree()]]
-
--[[linux-2.6.33/kfree()]]

 	}
 
 	kfree(area);
-
--[[linux-2.6.33/kfree()]]

 	return;
 }


*コメント [#e163d115]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS