VOP_GETPAGES(9)

名称
VOP_GETPAGES, VOP_PUTPAGES - ファイルから VM ページへの読み込みまたは書き込み

書式
<sys/param.h> <sys/vnode.h> <vm/vm.h> int VOP_GETPAGES(struct vnode *vp, vm_page_t *m, int count, int reqpage, vm_ooffset_t offset) int VOP_PUTPAGES(struct vnode *vp, vm_page_t *m, int count, int sync, int *rtvals, vm_ooffset_t offset)

解説
VOP_GETPAGES() メソッドは、通常のファイルが背後にある仮想メモリのページの読み込み のために、呼び出されます。 他の隣接したページの背後に同じファイルの隣接した領域がある場合には、 VOP_GETPAGES() は同様にそれらのページを読み込ませるために要求されますが、そうすることが 必須なわけではありません。 VOP_PUTPAGES() メソッドは反対のことを行います。 すなわち、仮想メモリの隣接したダーティなページを書き出させます。

入る時に、vnode のロックは保持されますが、ページキューと VM オブジェクトの ロックはどちらも保持されません。 両方のメソッドは、成功して戻る時とエラーで戻る時と両方とも、 そのままの状態で戻ります。

引数は以下の通りです。

vp  アクセスするファイル。

m   読み込まれるまたは書き込まれるべきファイルの連続した領域を表現する 連続したページの配列の最初の要素へのポインタです。

count
    その配列の中のページ数です。

sync
    書き込みが同期されるべき場合には VM_PAGER_PUT_SYNC です。

rtvals
    VOP_PUTPAGES() によって書き込まれたそれぞれのページの状態を示している VM システムの 結果コードの配列です。

reqpage
    ページ配列の中の要求されたページのインデックスです。 すなわち、このメソッドの実装が取り扱わなければならない、1 ページです。

offset
    ファイルの中のそのマップされたページが始まる場所へのオフセットです。

VOP_PUTPAGES() メソッドの状態は、配列 rtvals[] の中に、個々のページごとに返されます。 起こり得る状態値は以下の通りです。

VM_PAGER_OK
    そのページは成功して書き込まれました。 実装はそのページがクリーンであることを記録するために vm_pager_undirty(9) を呼び出さなければなりません。

VM_PAGER_PEND
    そのページは非同期に書き込まれるようにスケジュールされました。 書き込みが完了した時には、完了コールバックはビジーフラグをクリアし、 このページをウェイトしている他のスレッドを起こすために、 vm_object_pip_wakeup(9) および vm_page_io_finish(9) を呼び出すべきです。 さらに vm_page_undirty(9) を呼び出します。

VM_PAGER_BAD
    このページは完全に背後にあるファイルの終端を越えていました。 その vnode のファイルシステムが正しく実装されている場合には、 この状態は起こり得るべきではありません。

VM_PAGER_ERROR
    下位の保存メディアまたはプロトコルのエラーのため、 このページは書き込まれることが出来ませんでした。

VM_PAGER_FAIL
    VM_PAGER_ERROR と同様に取り扱われました。 VM_PAGER_ERROR

VM_PAGER_AGAIN
    そのページはこの要求によって取り扱われませんでした。

戻り値
成功して m[reqpage] を読み込んだ場合には VOP_GETPAGES() は VM_PAGER_OK を返し、そうでない場合には VM_PAGER_ERROR を返します。 慣習で、 VOP_PUTPAGES() の戻り値は rtvals[0] です。

関連項目
vm_object_pip_wakeup(9), vm_page_free(9), vm_page_io_finish(9), vm_page_undirty(9), vm_page_wakeup(9), vnode(9)

作者
このマニュアルページは Doug Rabson が書き、その後実質上 Garrett Wollman が書き直しました。