*参照元 [#q276e33b] #backlinks *説明 [#xe7b8e44] -パス: 複数あり --プリエンプションのデバッグが有効: [[linux-2.6.33/kernel/sched.c]] --プリエンプションのデバッグが無効: [[linux-2.6.33/include/linux/preempt.h]] -プリエンプションカウントに指定された値を加算する。 **引数 [#u9047e01] -int val --プリエンプションカウントに加算する値。 **返り値 [#hedb6c2f] -なし **参考 [#i688edaa] *実装 [#meee966e] **プリエンプションのデバッグが有効: kernel/sched.c [#zb5f8206] -プリエンプションのデバッグが有効の場合、こちらが実行される void __kprobes add_preempt_count(int val) { - -kprobes の対象 --[[linux-2.6.33/__kprobes]] #ifdef CONFIG_DEBUG_PREEMPT -プリエンプションのデバッグが有効の場合 --[[linux-2.6.33/CONFIG_DEBUG_PREEMPT]] /* * Underflow? */ if (DEBUG_LOCKS_WARN_ON((preempt_count() < 0))) return; -プリエンプションカウントがアンダーフローしていたら警告する。 --[[linux-2.6.33/DEBUG_LOCKS_WARN_ON()]] --[[linux-2.6.33/preempt_count()]] #endif preempt_count() += val; -プリエンプションカウントに指定された値を加算する。 --[[linux-2.6.33/preempt_count()]] #ifdef CONFIG_DEBUG_PREEMPT /* * Spinlock count overflowing soon? */ DEBUG_LOCKS_WARN_ON((preempt_count() & PREEMPT_MASK) >= PREEMPT_MASK - 10); -プリエンプションカウントがオーバーフローしそうなときに警告する。 (preemption_disable() をネストさせすぎているときなど) --[[linux-2.6.33/PREEMPT_MASK]] #endif if (preempt_count() == val) trace_preempt_off(CALLER_ADDR0, get_parent_ip(CALLER_ADDR1)); -プリエンプションが有効から無効になったとき、 トレースポイントとして記録しておく。 --プリエンプションカウントが 0(有効) -> val(無効)、 という変化をしたとき、条件が真になる。 --[[linux-2.6.33/trace_preempt_off()]] --[[linux-2.6.33/CALLER_ADDR0]] --[[linux-2.6.33/get_parent_ip()]] --[[linux-2.6.33/CALLER_ADDR1]] } EXPORT_SYMBOL(add_preempt_count); -特にライセンスを区別せずシンボルを公開する。 --[[linux-2.6.33/EXPORT_SYMBOL()]] **プリエンプションのデバッグが無効: include/linux/preempt.h [#g85c266b] #if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_PREEMPT_TRACER) -プリエンプションのデバッグが有効、 あるいはプリエンプションの追跡が有効の場合 --[[linux-2.6.33/CONFIG_DEBUG_PREEMPT]] --[[linux-2.6.33/CONFIG_PREEMPT_TRACER]] extern void add_preempt_count(int val); -前章(kernel/sched.c)を見てください。 (略) #else -プリエンプションのデバッグが無効かつ、 あるいはプリエンプションの追跡が無効の場合 # define add_preempt_count(val) do { preempt_count() += (val); } while (0) -プリエンプションカウントに指定された値を加算する。 --[[linux-2.6.33/preempt_count()]] (略) #endif *コメント [#wf76b0f3]