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

概要

  • linux2.6/kernel/sched.cにて定義
  • 引数で渡されたタスクを、移動先のCPUへ移動させスケジューラを呼び出す

引数

実装

/*

* If dest_cpu is allowed for this process, migrate the task to it.
* This is accomplished by forcing the cpu_allowed mask to only
* allow dest_cpu, which will force the cpu onto dest_cpu.  Then
* the cpu_allowed mask is restored.
*/

static void sched_migrate_task(task_t *p, int dest_cpu) {

	migration_req_t req;
  • タスクのドメイン内での移動やドメインの切り替えに関するリクエストを扱う構造体
	runqueue_t *rq;
  • ランキュー(activeキューとexpiredキューの組。CPUごとに用意される。)
	unsigned long flags;
  • EFLAGSを保存する変数
	rq = task_rq_lock(p, &flags);
  • タスクpにマッピングされたCPUのランキューのロックを取得する
	if (!cpu_isset(dest_cpu, p->cpus_allowed)
	    || unlikely(cpu_is_offline(dest_cpu)))
		goto out;
  • CPU dest_cpuがオフライン状態である場合1を返す
  • p->cpus_allowedのdest_cpu番目のビット位置のビットがセットされている場合は1を返す
  • 狙ったCPU nにmigrateするため、cpus_allowedに2^nをいれてschedule()を呼び出すと、cpuid = nのCPUで動作するようになる
	schedstat_inc(rq, smt_cnt);
	/* force the process onto the specified CPU */
	if (migrate_task(p, dest_cpu, &req)) {
		/* Need to wait for migration thread (might exit: take ref). */
		struct task_struct *mt = rq->migration_thread;
  • タスク
  • rq->migration_threadは、タスクのCPU間の移動を専門に行うタスク。CPU毎に起動され、タスクの移動はこのタスクしかできない。
		get_task_struct(mt);
		task_rq_unlock(rq, &flags);
  • ランキューrqのロックをアンロックし、可能であればプリエンプションする
		wake_up_process(mt);
		put_task_struct(mt);
  • タスクmtが使用されているか調べ、使用されていない場合は、そのタスクに通知を行い、通知が失敗した場合はそのタスクを解放する
		wait_for_completion(&req.done);
  • ある条件req.doneの完了を待ち合わせている
    • 待ちキューに自身(current)を入れ、スケジューラを呼び出し別のタスクに切り返る。
      • 再び、このタスクが選択されたとき、条件req.doneが成立されていなければ、スケジューラを呼び出し待ち合わせを行う。これを条件req.doneが成立されるまで繰り返す
    • 条件req.doneが成立された場合、待ちキューから自身(current)を削除し、終了する
    • 詳細はwait_for_completion()/linux2.6を参照
		return;
	}

out:

	task_rq_unlock(rq, &flags);
  • ランキューrqのロックをアンロックし、可能であればプリエンプションする

}

呼出元


履歴

  • 作者:ひら
  • 日付:2006/8/24
  • 対象:2.6.10
    更新日更新者更新内容

コメント/タグ?



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