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

概要

  • kernel/sched.cにて定義
  • タスクを移動させ、必要であれば移動させた先のCPUへプロセッサ間通信(IPI)を行い、移動先CPUの再スケジューリングを要求する

引数

  • p--移動するタスク
  • src_cpu--移動元のCPU
  • dest_cpu--移動先のCPU

実装

/*

* Move (not current) task off this cpu, onto dest cpu.  We're doing
* this because either it can't run here any more (set_cpus_allowed()
* away from this CPU, or CPU going down), or because we're
* attempting to rebalance this task on exec (sched_exec).
*
* So we race with normal scheduler movements, but that's OK, as long
* as the task is no longer on this CPU.
*/

static void __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu) {

	runqueue_t *rq_dest, *rq_src;
	if (unlikely(cpu_is_offline(dest_cpu)))
		return;
  • dest_cpuが実際に使用可能なCPUであるか調べる
    • 使用不可であれば終了
    • CPUのホットプラグをサポートする場合、CPUがまだ抜かれていないか(ホットアウトされていないか)調べることは重要である
  • dest_cpuがオフライン状態であるか調べる
    • オフライン状態であれば1を返す
    • CPUホットプラグ(CONFIG_HOTPLUG_CPU)を想定した関数である
    • 詳細はcpu_is_offline()/linux2.6を参照
	rq_src = cpu_rq(src_cpu);
	rq_dest = cpu_rq(dest_cpu);
	double_rq_lock(rq_src, rq_dest);
	/* Already moved. */
	if (task_cpu(p) != src_cpu)
		goto out;
  • タスクpがマッピングされているCPU識別子を返す
    • CONFIG_SMPが有効の場合のみ機能する。無効の場合は0を返す。
    • 詳細はtask_cpu()/linux2.6を参照
	/* Affinity changed (again). */
	if (!cpu_isset(dest_cpu, p->cpus_allowed))
		goto out;
  • ビットマップp->cpus_allowedのdest_cpu番目のビット位置のビットがセットされている場合は1を返す
	set_task_cpu(p, dest_cpu);
	if (p->array) {
		/*
		 * Sync timestamp with rq_dest's before activating.
		 * The same thing could be achieved by doing this step
		 * afterwards, and pretending it was a local activate.
		 * This way is cleaner and logically correct.
		 */
		p->timestamp = p->timestamp - rq_src->timestamp_last_tick
				+ rq_dest->timestamp_last_tick;
		deactivate_task(p, rq_src);
		activate_task(p, rq_dest, 0);
  • ランキューrq_destへタスクpを移動し、優先度の再計算をする。
    • タスクのスケジューリングの統計情報を更新する(SLEEP平均計算、優先度修飾子など)
    • 詳細はactivate_task()/linux2.6を参照
		if (TASK_PREEMPTS_CURR(p, rq_dest))
			resched_task(rq_dest->curr);
  • タスクpの優先度が、ランキューrq_destのカレントタスクの優先度より高い場合、1を返す。低い場合は0を返す
  • ローカルAPICのフラグを調査&設定し、必要であれば引数で与えられたタスクのCPUに対してプロセッサ間通信(IPI)を行い再スケジュールを要求する
	}

out:

	double_rq_unlock(rq_src, rq_dest);

}

呼出元


履歴

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

コメント



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