PageCache
Rev.5を表示中。最新版はこちら。
PageCacheはファイルをキャッシュする。キャッシュ単位はページ単位でファイルの先頭からページ単位に区切ってキャッシュする。
ファイルのRead/WriteはPageCacheを経由する。
PageCacheの管理方法
RadixTreeとLRUリストで管理される。RadixTreeはi-node単位に持つ(i-node単位にaddress spaceがあり、そこにPageCacheのPageTreeのRootがある)。RadixTreeのキーはaddress space内でのページオフセット(ページ数)。i-nodeがブロックデバイスの場合はaddress spaceはデバイス全体を指すのでデバイス先頭からのページ数になる。
ページキャッシュはinode(正確にはaddress space)とファイル先頭からのオフセット(ページ数)でユニークに識別される。
ページキャッシュの構造を図1に示す。
図1 PageCacheの構造
- inodeのi_mappingは、このinodeに対応するaddress_spaceを指す。
- address_spaceのhostはinodeを指す。ブロックデバイスだった場合は、ブロックデバイスのinodeを指している。
- page_treeはPageCacheであるRadixTreeへのポインタ。
- RadiXTreeにはページオフセットをキーにpage構造体が登録されている。
- pageのmappingは属しているaddress_spaceを指す(つまりinodeのaddress_space)。
- indexはファイル先頭からのオフセットでファイルの何処をキャッシュしているかを示している。
- pageに該当する物理ページにindexが指しているファイルの内容がキャッシュされている。
LRUリストはlru_add_pvecs[]でCPU毎にリストを持つ。
[関連関数]
find_or_create_page()
PageCacheを割り当てる。
find_get_page(mapping, offset)
PageCacheの検索ルーチン
mappingのoffsetページをキャッシュしているPageCacheを検索する。
mappingのoffsetページをキャッシュしているPageCacheを検索する。
mapping->page_treeのRadixTreeからoffset(ページ数)でPageCacheを検索
add_to_page_cache()
PageCacheを追加する。
RadixTreeへの追加のみで、LRUリストには追加されない。
RadixTreeへの追加のみで、LRUリストには追加されない。
pageにはPG_lockedがセットされる。
add_to_page_cache_lru()
add_to_page_cache()を呼んで、RadixTreeにPageCacheを登録してLRUリストにも登録する。
remove_from_page_cache()
[フラグ]
PG_uptodate
ページにデータが読みこまれてキャッシュが最新の状態になるとSetPageUptodate()で設定する。
mpage_end_io_read()参照。
mpage_end_io_read()参照。