無料Wikiサービス | デモページ
Linux Kernel(2.6)の実装に関するメモ書き
リンク
最近更新したページ
検索

mpage


fs/mpage.cのメモ。

概要

mpage.cにはディスクからPageCacheへデータを読みこんだり、PageCache上のデータをディスクに書き込むための汎用ルーチンがある。

これらのルーチンはファイルシステム(ext2,ext2,jfs等)のPageCache制御用ハンドラ(struct address_space_operations)から呼び出されて、PageCacheとディスクの間でデータをやり取りする。

mapgeの対象とするケース

mpageにはReadルーチンとしてmpage_readpage()やmpage_readpages()があるが、これらのルーチンは図1に示すように、PageCacheのページに対応するディスク上のブロックが連続している場合のみ処理を行う。図2に示すように非連続だった場合は、より汎用的なルーチンであるblock_read_full_page()に処理をさせる。

ディスクブロックが非連続であった場合は、I/Oが分割されるため、各I/O完了時にページ全体がUptodate状態になったかを毎回判定する必要があり、処理が多少繁雑になる。これに対し、mpageでは1ページをひとつのI/Oで処理できるのでI/O完了時の処理(mpage_end_io_read())が簡単になっている。



図1 ページに対応するディスクブロックが連続しているケース


図2 ページに対応するディスクブロックが非連続なケース


Read/Write関数

mpage_readpage(*page, get_block)
PageCacheのpageにデータを読みこむRead I/Oを発行する。
get_blockには「ファイル上のブロック番号」→「ディスクブロック番号」に変換するルーチンが渡される。これはファイルシステム毎に異なる。例えばExt2ならext2_get_block()。

mpage_readpages(*mapping, *pages, nr_pages, get_block)
pagesリストにチェーンされた複数ページにデータを読みこむ Read I/Oを発行する。
mpage_readpage()と異なりページはここでPageCacheへ登録される。(mpage_readpage()では呼び出し元でPageCacheに登録している)

mpage_writepage(*page, get_block, *wbc)
pageのデータをディスクに書き込むWrite I/Oを発行する。

mpage_writepages(*mapping, *wbc, get_block)

mpage_end_io_read(*bio, bytes_done, err)
mpage_readpage(),mpage_readpages()で開始したRead I/Oが完了した時に呼び出されるハンドラ。データを読みこんだページをUptodate状態にしページのロックを解除する。

mpage_end_io_write(*bio, bytes_done, err)
mpage_writepage(),mpage_writepages()で開始したWrite I/Oが完了した時に呼び出されるハンドラ。

内部関数

do_mpage_readpage(*bio, *page, nr_pages, *last_block_in_bio, get_block)
pageにデータを読み込むRead I/Oを開始する。
mpage_readpage(),mpage_readpages()から呼び出される。

「I/Oを開始する」と書いたが、本関数は連続ページのアクセスなどで、くり返し呼び出されることが多いため、基本的には呼び出し毎にI/Oは開始せず、引数で渡されたbioにI/Oをマージして、bioを返すようになっている(last_block_in_bioはbio内の最終ブロック番号)。
次回呼び出し時に、bio,last_block_in_bioを引数に渡すことで、ディスクブロックが連続していれば次々とbioにマージされ、I/Oが細切れにならないようにしている。

以下のケースでは、関数内でI/Oが開始される。
  • 前回の呼び出し(bio,last_block_in_bio)からディスクブロックが非連続となった
  • bioにI/Oをマージしようとしたがbioのサイズが上限に到達した
  • End Of Fileに到達した
  • BoundaryBufferに対してReadが発生した
図2に示したようにページに対応するブロックがディスク上で非連続になっている場合は、block_read_full_page()を呼び出して処理させる。



最終更新 2007/03/02 08:58:50 - kztomita
(2007/02/16 21:37:57 作成)
添付ファイル
contig.png - kztomita
uncontig.png - kztomita