*参照元 [#v74e2b41] #backlinks *説明 [#z24fbecd] -パス: 複数あり --プリエンプションのデバッグが有効: [[linux-2.6.33/kernel/sched.c]] --プリエンプションのデバッグが無効: [[linux-2.6.33/include/linux/preempt.h]] -プリエンプションカウントから指定された値を減算する。 **引数 [#u9047e01] -int val --プリエンプションカウントから減算する値。 **返り値 [#hedb6c2f] -なし **参考 [#i688edaa] *実装 [#w1ae4717] **プリエンプションのデバッグが有効: kernel/sched.c [#zb5f8206] -プリエンプションのデバッグが有効の場合、こちらが実行される void __kprobes sub_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(val > preempt_count())) return; - --[[linux-2.6.33/DEBUG_LOCKS_WARN_ON()]] - --[[linux-2.6.33/preempt_count()]] /* * Is the spinlock portion underflowing? */ if (DEBUG_LOCKS_WARN_ON((val < PREEMPT_MASK) && !(preempt_count() & PREEMPT_MASK))) return; - --[[linux-2.6.33/PREEMPT_MASK]] #endif if (preempt_count() == val) trace_preempt_on(CALLER_ADDR0, get_parent_ip(CALLER_ADDR1)); - --[[linux-2.6.33/trace_preempt_on()]] - --[[linux-2.6.33/CALLER_ADDR0]] - --[[linux-2.6.33/get_parent_ip()]] - --[[linux-2.6.33/CALLER_ADDR1]] preempt_count() -= val; } EXPORT_SYMBOL(sub_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 sub_preempt_count(int val); -前章(kernel/sched.c)を見てください。 (略) #else -プリエンプションのデバッグが無効かつ、 あるいはプリエンプションの追跡が無効の場合 # define sub_preempt_count(val) do { preempt_count() -= (val); } while (0) -プリエンプションカウントから指定された値を減算する。 --[[linux-2.6.33/preempt_count()]] (略) #endif *コメント [#h975707a]