*参照元 [#qe075425]
#backlinks

*説明 [#s32fc6e7]
-パス: [[linux-4.4.1/mm/page_isolation.c]]

-指定した範囲にある全てのページが解放されている(isolated)かどうかをテストする。
--全てのページは同じゾーンに属していなければならない。
ゾーンのロック(zone->lock)を確保してから呼び出すこと。
--PageBuddy() が真なら解放されているとみなしている。


**引数 [#qf6b4767]
-unsigned long pfn
--範囲の先頭のページフレーム番号
-unsigned long end_pfn
--範囲の末尾のページフレーム番号、ただし範囲にこのページは含まれない [pfn, end_pfn)
-bool skip_hwpoisoned_pages
--0 以外を指定すると PageHWPoison() が真を返してくるページを無視しテスト成功とみなす、
0 を指定すると HWPoison ページがあったらテスト失敗とみなす


**返り値 [#i7f3556c]
-int
--全てのページが解放されている(isolated)ならば 1、そうでなければ 0


**参考 [#l7b7486f]


*実装 [#yee7b16c]
 /*
  * Test all pages in the range is free(means isolated) or not.
  * all pages in [start_pfn...end_pfn) must be in the same zone.
  * zone->lock must be held before call this.
  *
  * Returns 1 if all pages in the range are isolated.
  */
 static int
 __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn,
 				  bool skip_hwpoisoned_pages)
 {
 	struct page *page;
 
-
--[[linux-4.4.1/page]]

 	while (pfn < end_pfn) {
 		if (!pfn_valid_within(pfn)) {
 			pfn++;
 			continue;
 		}
-
--[[linux-4.4.1/pfn_valid_within()]]

 		page = pfn_to_page(pfn);
 		if (PageBuddy(page))
 			/*
 			 * If the page is on a free list, it has to be on
 			 * the correct MIGRATE_ISOLATE freelist. There is no
 			 * simple way to verify that as VM_BUG_ON(), though.
 			 */
 			pfn += 1 << page_order(page);
 		else if (skip_hwpoisoned_pages && PageHWPoison(page))
 			/* A HWPoisoned page cannot be also PageBuddy */
 			pfn++;
 		else
 			break;
-PageBuddy() が真なら解放されているとみなしている。
--FIXME: page_order を使うのはなぜ?
-skip_hwpoisoned_pages が指定されていれば PageHWPoison() が真を返してきても解放されているとみなす。
--[[linux-4.4.1/pfn_to_page()]]
--[[linux-4.4.1/PageBuddy()]]
--[[linux-4.4.1/page_order()]]
--[[linux-4.4.1/PageHWPoison()]]

 	}
 	if (pfn < end_pfn)
 		return 0;
 	return 1;
 }


*コメント [#n57f47c4]


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