参照元

説明

引数

返り値

参考

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;
}

コメント


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS