AIOのいろいろ

Pocket

QCOWを何とか動かそうと見ているのですが、なんかすごく難しい。
READだけ見てみると、非同期I/O(AIO)は、2段階のレベルがあります。
外部に公開するインターフェースとしては、bdrv_readとbdrv_aio_readがあります。bdrv_readは同期で、bdrv_aio_readは非同期です。
その下に、ドライバと呼ぶ関数があって、RAW、QCOWなど、形式ごとに読み書きをする関数が用意されています。
RAWフォーマットには、raw_preadが同期で、raw_aio_readが非同期の関数として実装されています。
でも、QCOWフォーマットには、非同期のqcow_aio_readしか実装されていません。それに、QCOWのドライバは、それ自身で読み書きするわけではなく、bdrv_readを介してRAWフォーマットのドライバを呼び出しています。つまり、実質4段階のレベルを通してデータが行き来するという何とも複雑なやり取りをしています。
それだけでなく、同期操作を非同期の関数でエミュレートしたり(bdrv_read_em)、逆に非同期の関数を同期関数でエミューレートする関数bdrv_aio_read_emも存在します。
また、ドライバの呼び出しは、コールバック関数を登録することで行っていて、一体どの関数がいつ呼び出されるのかわかりづらくなっています。
デバッガで追いかけようとしているのですが、Linux上だとデバッグパッチだけでは不十分だったりして、難航しています。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください