参照元†
- 指定した範囲にある全てのページが解放されている(isolated)かどうかをテストする。
- 全てのページは同じゾーンに属していなければならない。
ゾーンのロック(zone->lock)を確保してから呼び出すこと。
- PageBuddy() が真なら解放されているとみなしている。
- unsigned long pfn
- unsigned long end_pfn
- 範囲の末尾のページフレーム番号、ただし範囲にこのページは含まれない [pfn, end_pfn)
- bool skip_hwpoisoned_pages
- 0 以外を指定すると PageHWPoison() が真を返してくるページを無視しテスト成功とみなす、
0 を指定すると HWPoison ページがあったらテスト失敗とみなす
返り値†
- int
- 全てのページが解放されている(isolated)ならば 1、そうでなければ 0
/*
* 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;
while (pfn < end_pfn) {
if (!pfn_valid_within(pfn)) {
pfn++;
continue;
}
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() が真を返してきても解放されているとみなす。
}
if (pfn < end_pfn)
return 0;
return 1;
}
コメント†