compact_order_failedは、
のどちらかを保持する。
compaction_defer_reset()呼び出し元は3つ
defer_compaction()の呼び出し元は2つあって、
ざっくりいうとcompact_zone()が成功したらorder + 1、失敗したらorderの値が設定されると思っておけば良さそうです。
例えばorder 9でコンパクションをするか判定するとき、
コンパクションを延期し続けてしまうことを避けるため、延期する度にcompact_consideredがインクリメントされます。もしリミット回数(1 << compact_defer_shift)に達していたらコンパクションします。
リミット回数の計算に使うcompact_defer_shiftはコンパクション延期時(defer_compaction()を呼ぶ)にインクリメントされ、コンパクション成功時(compaction_defer_reset()を呼ぶ)に0にセットされます。最大6で、リミット値だと64回に相当します。
/* Returns true if compaction should be skipped this time */ static bool compaction_deferred(struct zone *zone, int order) { unsigned long defer_limit = 1UL << zone->compact_defer_shift; if (order < zone->compact_order_failed) return false;
/* Avoid possible overflow */ if (++zone->compact_considered >= defer_limit) { zone->compact_considered = defer_limit; return false; }
trace_mm_compaction_deferred(zone, order); return true; }