linuxのメモ

Linux kernelの実装を解説していきます (対象ver 4.5)

preempt

プリエンプション - preempt_count_equals()

概要 指定した値とプリエンプションの値が等しいか確認する 詳細 preempt_count()で取得した実行待ちプロセス数とrcu_preempt_depth()で取得したRCUロックの深さの合計値が引数として取得した値と等しいか比較し、等しければ1を等しくなければ0を返す

プリエンプション - in_atomic()

概要 現在のタスクが他のプロセスに割り込んで実行されているかを確認する 詳細 preempt_count()で実行待ちプロセス数を取得し、この値が0の場合は0を0以外の値の場合は1を返す

プリエンプション - preemptible()

概要 プリエンプション可能であることを確認する 詳細 CONFIG_PREEMPT_COUNTが無効な場合は常に0を返し、有効な場合はpreempt_count()で実行待ちプロセス数が0でかつ、irqs_disabled()で現在割込み処理中である場合に1を返す、それ以外の場合は0を返す

プリエンプション - __preempt_count_dec_and_test()

概要 プロセス待ちカウンターの値をデクリメントし結果が0になったかどうか確認する 詳細 GEN_UNARY_RMWcc()に以下の引数を渡して実行する アセンブラ命令 : decl アセンブラ命令の実行対象の値 : __preempt_count アセンブラ命令の0番目のオペランド : __pe…

プリエンプション - preempt_enable_no_resched_notrace()

概要 プリエンプションを有効にする 詳細 barrier()を実行するがCONFIG_PREEMPT_COUNTが有効な場合は__preempt_count_dec()で__preempt_countをインクリメントし、プリエンプションを有効にする この時、複数のプリエンプションが実行されている場合は__pree…

プリエンプション - __preempt_count_dec()

概要 実行待ちプロセスカウンターをデクリメントする 詳細 __preempt_count_sub()に1を渡して実行する

プリエンプション - __preempt_count_sub()

概要 実行待ちプロセスカウンターから任意の値を減算する 詳細 raw_cpu_add_4()で__preempt_countに引数で受け取った値のマイナス値を加算する

プリエンプション - preempt_disable_notrace()

概要 プリエンプションを無効にする 詳細 barrier()を実行するがCONFIG_PREEMPT_COUNTが有効な場合は__preempt_count_inc()で__preempt_countをインクリメントし、プリエンプションを無効にする

プリエンプション - __preempt_count_inc()

概要 実行待ちプロセスカウンターをインクリメントする 詳細 __preempt_count_add()に1を渡して実行する

プリエンプション - __preempt_count_add()

概要 実行待ちプロセスカウンターに任意の値を加算する 詳細 raw_cpu_add_4()で__preempt_countに引数で受け取った値を加算する

プリエンプション - preempt_trace()

概要 実行待ちプロセスが存在するか確認する 詳細 CONFIG_PREEMPT_TRACER の値によって以下のように処理が異なる 有効 trace_typeの値にTRACER_PREEMPT_OFFのbitが立っており、かつpreempt_count() を実行し実行待ちプロセス数を確認し、実行待ちプロセス数…

プリエンプション - preempt_count()

概要 実行待ちのプロセス数を取得する 詳細 CPU毎の実行待ちプロセス数を表す__preempt_countの値をraw_cpu_read_4()で取得し、PREEMPT_NEED_RESCHEDのbitを反転した値を返す

プリエンプション - __preempt_count

概要 実行待ちプロセスカウンター 詳細 DECLARE_PER_CPU()で宣言されるint型のCPU個別の変数で、CPU毎の実行待ちプロセスのカウンターで、この値が0以上の場合はプリエンプションが無効になる 尚、この値には複数の割込みのカウンタを持ち、以下のように値が…