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

概要

  • kernel/sched.cにて定義
  • 引数で与えられたタスクにマッピングされたCPUのランキューのロックを取得する

引数

  • p--タスクディスクリプタ
  • flags--EFLAGS

実装

/*

* task_rq_lock - lock the runqueue a given task resides on and disable
* interrupts.  Note the ordering: we can safely lookup the task_rq without
* explicitly disabling preemption.
*/

static runqueue_t *task_rq_lock(task_t *p, unsigned long *flags)

	__acquires(rq->lock)

{

	struct runqueue *rq;

repeat_lock_task:

	local_irq_save(*flags);
  • この関数を呼び出したCPUの割り込み禁止/許可状態(EFLAGSレジスタ)を、flagsに保存する
	rq = task_rq(p);
  • タスクpとマッピングされているCPUのランキューを返す
	spin_lock(&rq->lock);
	if (unlikely(rq != task_rq(p))) {
  • スピンロックの取得を試みているときにタスクが別のCPUにマッピングされていないか調べる
    • 別のCPUにマッピングされた場合、repeat_lock_taskラベルへ飛び処理をやり直す。
  • タスクpとマッピングされているCPUのランキューを返す
		spin_unlock_irqrestore(&rq->lock, *flags);
  • スピンロックを開放し、ロック前のEFLAGSを書き戻し、可能であればプリエンプションする
		goto repeat_lock_task;
	}
	return rq;

}

呼出元


履歴

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

コメント



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