*参照元 [#f0374bd7] #backlinks *説明 [#h01a6b37] -パス: [[linux-4.4.1/mm/internal.h]] -FIXME: これは何? --この関数は buddy system にある解放されているページのオーダーを返す。 この関数と並列で割当やゴミ回収が実行されるのを防ぐため、呼び出し側で ゾーンのロック(page_zone(page)->lock)を確保してから、この関数を呼ばなければならない。 もし呼び出し側でロックを確保しない場合、並列にページが確保されないことやマージされないことを 呼び出し側で保証しなければならない。あるいは、無効な値を正しく扱い、後述の page_order_unsafe() を使う必要がある。 **引数 [#i8757720] -struct page *page -- --ページ --[[linux-4.4.1/page]] **返り値 [#n2312c81] -unsigned int -- --(おそらく)解放されている連続したページ数のオーダー --1ページなら 0、2〜3 ページなら 1、4〜7 ページなら 2、… **参考 [#a3cba798] -設定する関数。 --[[linux-4.4.1/set_page_order()]] *実装 [#e1949d9b] /* * This function returns the order of a free page in the buddy system. In * general, page_zone(page)->lock must be held by the caller to prevent the * page from being allocated in parallel and returning garbage as the order. * If a caller does not hold page_zone(page)->lock, it must guarantee that the * page cannot be allocated or merged in parallel. Alternatively, it must * handle invalid values gracefully, and use page_order_unsafe() below. */ static inline unsigned int page_order(struct page *page) { /* PageBuddy() must be checked by the caller */ return page_private(page); -プライベートデータを得る。 -FIXME: プライベートデータは場合によって意味が違う、誰がどこで更新している?? --[[linux-4.4.1/page_private()]] -プライベートデータは複数の場所で更新しているが、 set_page_order() 経由で更新しているのは下記の 2関数だけ。 --[[linux-4.4.1/expand()]] --[[linux-4.4.1/__free_one_page()]] } *コメント [#p084c9bc]