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

概要

  • linux2.6/kernel/sched.cにて定義
  • 引数で渡された待ちキューのタスクを起床させる
    • ただし起床したタスクがカレントタスクより優先度が高い場合でも再スケジュールは行わない

引数

  • q--待ちキューヘッド(待ちキューの識別に用いる)
  • mode--タスクの状態のビットマップ
    • 例えば、TASK_UNINTERRUPTIBLEやTASK_INTERRUPTIBLEなどの状態を示すビットマップ
  • nr_exclusive--起床させるタスクの数

実装

/**

* __wake_up - sync- wake up threads blocked on a waitqueue.
* @q: the waitqueue
* @mode: which threads
* @nr_exclusive: how many wake-one or wake-many threads to wake up
*
* The sync wakeup differs that the waker knows that it will schedule
* away soon, so while the target thread will be woken up, it will not
* be migrated to another CPU - ie. the two threads are 'synchronized'
* with each other. This can prevent needless bouncing between CPUs.
*
* On UP it can prevent extra preemption.
*/

void fastcall __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive) {

	unsigned long flags;
	int sync = 1;
  • 起床関数に渡す引数
    • 0ならタスクを起床後、このタスクがカレントタスクより優先度が高いか調べ、高い場合は再スケジュール要求を行う
    • 1ならタスクを起床後、カレントタスクとの優先度の比較は行わない(つまり再スケジュール要求を行わない)
	if (unlikely(!q))
		return;
  • 待ちキューがNULLなら終了
	if (unlikely(!nr_exclusive))
		sync = 0;
  • 起床させるタスク数が0なら再スケジュールを実行
	spin_lock_irqsave(&q->lock, flags);
  • スピンロックq->lockの取得を試み、取得に成功した場合、外部割り込みを無効化しEFLAGSを引数flagsへ設定する
	__wake_up_common(q, mode, nr_exclusive, sync, NULL);
	spin_unlock_irqrestore(&q->lock, flags);
  • スピンロックq->lockを開放し、flagsをEFLAGSを書き戻し、可能であればプリエンプションする

}

EXPORT_SYMBOL_GPL(__wake_up_sync); /* For internal use only */

呼出元


履歴

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

コメント



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