*参照元 [#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]