linuxのメモ

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

バッファ操作 - rb_head_page_set()

概要

バッファのフラグを入れ替える

詳細

この関数では以下の引数を受け取る

  • struct buffer_page型のポインタ : head
  • headの前のバッファを指すポインタ : prev
  • 現在のフラグを示す : old_flag
  • 新しいフラグを示す : new_flag

cmpxchg()headlistメンバとold_flag論理和した値とprevlistメンバから次のリストを示すnextメンバの値が一致した場合にheadlistメンバのフラグをnew_flagに書き換える命令を実行する

実行結果とRB_FLAG_MASKを反転した値の論理積headlistメンバの値と一致しない場合はRB_PAGE_MOVEDを、それ以外の場合は返り値とRB_FLAG_MASK論理積(結果的にold_flagになるはずの値)を返す

従って、前のバッファの次のバッファが現在のバッファと一致しないときはRB_PAGE_MOVEDを返し、既に移動済みのバッファであることを意味する