このページを編集する際は、編集に関する方針に従ってください。

概要

  • kernel/sched.cにて定義
  • ドメイン内CPUのランキューのカレントタスクがアイドル状態で、ランキューの中に実行可能なタスクが存在する場合、プロセッサ間通信を用いて再スケジューリングを要請する
    • CONFIG_SCHED_SMTが有効な場合のみ機能する。無効の場合は何もしない。

引数

  • this_cpu--カレントCPU
  • this_rq--カレントランキュー

実装

static inline void wake_sleeping_dependent(int this_cpu, runqueue_t *this_rq) {

	struct sched_domain *sd = this_rq->sd;
	cpumask_t sibling_map;
	int i;
	if (!(sd->flags & SD_SHARE_CPUPOWER))
		return;
  • SD_SHARE_CPUPOWERは64で定義されており、sd->flagsの(7bit位置)がセットビットなら、ドメインのメンバがCPUのパワーを共有する
  • ドメインのメンバがCPUのパワーを共有しない場合は終了
	/*
	 * Unlock the current runqueue because we have to lock in
	 * CPU order to avoid deadlocks. Caller knows that we might
	 * unlock. We keep IRQs disabled.
	 */
	spin_unlock(&this_rq->lock);
  • スピンロックの開放を行う。プリエンプション機能を有効にし、可能であれば自ら積極的にプリエンプション(実行権の移譲を行うこと)する。
	sibling_map = sd->span;
	for_each_cpu_mask(i, sibling_map)
		spin_lock(&cpu_rq(i)->lock);
  • sibling_map内のすべての論理CPUのランキューをロックする
	/*
	 * We clear this CPU from the mask. This both simplifies the
	 * inner loop and keps this_rq locked when we exit:
	 */
	cpu_clear(this_cpu, sibling_map);
  • CPUマップsibling_mapのthis_cpuに対応するビット位置をアトミックにクリアビットする
	for_each_cpu_mask(i, sibling_map) {
		runqueue_t *smt_rq = cpu_rq(i);
		/*
		 * If an SMT sibling task is sleeping due to priority
		 * reasons wake it up now.
		 */
		if (smt_rq->curr == smt_rq->idle && smt_rq->nr_running)
			resched_task(smt_rq->idle);
  • ローカルAPICのフラグを調査&設定し、必要であればプロセッサ間通信(IPI)を行い再スケジュールを要求する
  • ランキューのカレントプロセスがアイドル状態で、かつランキュー内に走行可能タスク(TASK_RUNNING)が存在するなら、プロセッサ間通信を発行して、再スケジュールを促す。
	}
	for_each_cpu_mask(i, sibling_map)
		spin_unlock(&cpu_rq(i)->lock);
  • sibling_map内のすべての論理CPUのランキューのロックを解除する
  • CPUマップsibling_mapにおいて定義されたCPUの個数分だけ繰り返す
  • スピンロックの開放を行う。プリエンプション機能を有効にし、可能であれば自ら積極的にプリエンプション(実行権の移譲を行うこと)する。
  • CPU、iのランキューを返す
	/*
	 * We exit with this_cpu's rq still held and IRQs
	 * still disabled:
	 */

}

呼出元


履歴

  • 作者:ひら
  • 日付:2005/3/5
  • 対象:2.6.10
    更新日更新者更新内容

コメント



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-11-24 (火) 07:20:25 (3129d)