linuxのメモ

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

buffer

バッファ操作 - rb_event_set_padding()

概要 イベントのpaddingを初期化する 詳細 引数として受け取ったstruct ring_buffer_event構造体に以下のデータを保存しイベントのpaddingを初期化する type_lenメンバにRINGBUF_TYPE_PADDING time_deltaメンバに0

バッファ操作 - rb_handle_head_page()

概要 バッファのヘッダを更新する 詳細 この関数では以下の引数を受け取る CPUごとのバッファへのポインタ : cpu_buffer バッファの最後のページへのポインタ : tail_page バッファの次のページへのポインタ : next_page rb_head_page_set_update()にRB_PAGE…

エラー出力 - RB_WARN_ON()

概要 条件に一致した場合にwarningエラーを出力する 詳細 このマクロでは以下の引数を受け取る バッファを示す : b 比較する値や式を示す : cond unlikely()によりcondの比較結果が0である場合に高速に実行可能なコードを生成し、比較結果を一時変数に保持す…

バッファ操作 - rb_page_entries()

概要 バッファ内のエントリ数を取得する 詳細 struct buffer_pageのentriesメンバの値をlocal_read()で読み出し、RB_WRITE_MASKと論理積の結果を返すため、結果は下位20bitが有効な数値となる

バッファ操作 - rb_head_page_set_normal()

概要 フラグをRB_PAGE_NORMALに入れ替える 詳細 この関数では以下の引数を受け取る 比較対象のバッファへのポインタ : head 比較元のバッファへのポインタ : prev 変更前のフラグを示す : old_flag 受け取った引数にRB_PAGE_NORMALを加えてrb_head_page_set(…

バッファ操作 - rb_head_page_set_update()

概要 フラグをRB_PAGE_UPDATEに入れ替える 詳細 この関数では以下の引数を受け取る 比較対象のバッファへのポインタ : head 比較元のバッファへのポインタ : prev 変更前のフラグを示す : old_flag 受け取った引数にRB_PAGE_UPDATEを加えてrb_head_page_set(…

バッファ操作 - rb_head_page_set_head()

概要 フラグをRB_PAGE_HEADに入れ替える 詳細 この関数では以下の引数を受け取る 比較対象のバッファへのポインタ : head 比較元のバッファへのポインタ : prev 変更前のフラグを示す : old_flag 受け取った引数にRB_PAGE_HEADを加えてrb_head_page_set()を…

バッファ操作 - rb_head_page_set()

概要 バッファのフラグを入れ替える 詳細 この関数では以下の引数を受け取る struct buffer_page型のポインタ : head headの前のバッファを指すポインタ : prev 現在のフラグを示す : old_flag 新しいフラグを示す : new_flag cmpxchg()でheadのlistメンバと…

バッファ操作 - rb_is_head_page()

概要 バッファがHead Pageか確認する 詳細 この関数では以下の引数を取得する struct buffer_page構造体のポインタ : page struct list_head構造体のポインタ : list listのnextメンバの値をRB_FLAG_MASKを反転した値でマスクした値とpageのlistメンバの値が…

バッファ操作 - rb_is_reader_page()

概要 バッファがReader Pageか確認する 詳細 この関数ではstruct buffer_page構造体のポインタであるpageを引数として取得する pageのlistメンバからstruct list_head構造体のprevメンバのポインタを取得し、取得したポインタのnextメンバのアドレスとrb_lis…

バッファ操作 - rb_inc_page()

概要 バッファを次のバッファに入れ替える 詳細 この関数ではバッファの保持されているページを示すstruct buffer_page構造体のポインタへのポインタであるbpageを受け取る bpage内のstruct list_head構造体の要素であるlistメンバから次のリストへのポイン…

バッファ操作 - rb_list_head()

概要 struct list_head構造体のアドレスを適切なアドレスに変換する 詳細 struct list_head構造体のポインタを引数として受け取り、受け取ったアドレスからRB_FLAG_MASKのbitを落として、正しいポインタを取得する これはポインタは下位4バイト境界でアライ…

バッファ操作 - __rb_page_index()

概要 バッファのデータを保持するアドレスを取得する 詳細 この関数ではstruct buffer_page構造体に含まれるstruct buffer_data_page構造体のpageメンバのdataメンバの指定したindexのアドレスを取得する struct buffer_data_page構造体のdataメンバはchar型…

バッファ操作 - test_time_stamp()

概要 有効なタイムスタンプのデータを保持しているか確認する 詳細 タイムスタンプの差分を示す数値を受け取り、引数の値の27bit以降のbitが立っていた場合は1を、それ以外の場合は0を返す これはタイムスタンプの差分を示す数値は27bit以下のbitに保持され…

バッファ操作 - rb_start_commit()

概要 バッファの状態を書込み処理中に変更する 詳細 local_inc()でstruct ring_buffer_per_cpu構造体のcommittingメンバとcommitsメンバの値をインクリメントし、バッファの状態を書き込み中に変更する

バッファ操作 - ring_buffer_normalize_time_stamp()

概要 与えられたタイムスタンプを元に戻す 詳細 タイムスタンプの値をDEBUG_SHIFT分右にシフトする これはrb_time_stamp()でタイムスタンプを取得時に左にシフトした値を元に戻す操作となる また、この関数はEXPORT_SYMBOL_GPL() によりモジュールからアクセ…

バッファ操作 - ring_buffer_time_stamp()

概要 struct ring_buffer構造体の状態に応じたタイムスタンプを取得する 詳細 preempt_disable_notrace()でプリエンプションを無効にした上で、rb_time_stamp()に引数で受け取ったstruct ring_buffer構造体へのポインタを渡して実行しタイムスタンプを取得す…

バッファ操作 - rb_time_stamp()

概要 struct ring_buffer構造体の状態に応じたタイムスタンプを取得する 詳細 struct ring_buffer構造体のclock()メソッドを実行した結果をDEBUG_SHIFT分左にシフトした値を返す clock()メソッドはtrace_clocksグローバル変数の配列内の要素の一つでtracing_…

バッファ操作 - trace_recursive_unlock()

概要 割込みのロックを開放する 詳細 この関数ではstruct ring_buffer_per_cpu構造体へのポインタを引数として受け取り、current_contextメンバの値valを使用する valの値は低いビットから順に マスク不可割込み ハードウェア割込み ソフトウェア割込み プリ…

バッファ操作 - ring_buffer_record_on()

概要 ring_buffer構造体のオブジェクトを有効にする 詳細 ring_buffer構造体のポインタを引数として受け取り、ring_buffer構造体のrecord_disabledメンバのRB_BUFFER_OFFフラグを落とす record_disabledメンバはatomic_t型の変数として宣言されているため、…

バッファ操作 - ring_buffer_record_off()

概要 ring_buffer構造体のオブジェクトを無効にする 詳細 ring_buffer構造体のポインタを引数として受け取り、ring_buffer構造体のrecord_disabledメンバにRB_BUFFER_OFFフラグをセットする record_disabledメンバはatomic_t型の変数として宣言されているた…