EN JA
VOP_GETPAGES(9)
VOP_GETPAGES(9) FreeBSD Kernel Developer's Manual VOP_GETPAGES(9)

名称

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

書式

#include < sys/param.h>
#include < sys/vnode.h>
#include < vm/vm.h>

int
VOP_GETPAGES( struct vnode *vp, vm_page_t *ma, int count, int reqpage, vm_ooffset_t offset);

int
VOP_PUTPAGES( struct vnode *vp, vm_page_t *ma, int count, int sync, int *rtvals, vm_ooffset_t offset);

解説

VOP_GETPAGES() メソッドは、通常のファイルによって裏付けられる仮想メモリのページの読み込みのために呼び出されます。他の隣接したページが同じファイルの隣接領域によって裏付けられるなら、 VOP_GETPAGES() は、同様にそれらのページを読み込むために要求されますが、そうするように義務付けられません。 VOP_PUTPAGES() メソッドは、逆を行います。すなわち、仮想メモリの隣接した汚い (dirty) ページを書き込みます。

(呼び出しの) 入口で、vnode のロックは、保持されますが、ページキューも VM オブジェクトのロックも保持されません。両方のメソッドは、成功とエラーで返るときの両方とも同じ状態で返ります。

引数は、次の通りです:

vp
アクセスするファイル。
ma
読み込まれるか、または書き込まれるファイルの連続する領域を表わすページの配列の最初の要素へのポインタ。
count
配列のページに読み込まれるべきであるバイト数。
sync
書き込みが同期されるべきであるなら、 VM_PAGER_PUT_SYNC
rtvals
VOP_PUTPAGES() によって書き込まれる各ページの状態を示している VM システムの結果のコードの配列。
reqpage
要求されたページのページ配列のインデックス。すなわち、このメソッドの実装が扱わなければならない、1 つのページ。
offset
マップされたページが始まるファイルのオフセット。

VOP_PUTPAGES() メソッドの状態は、配列 rtvals[] のページごとを基本として返されます。指定できる状態の値は、次の通りです:

VM_PAGER_OK
ページは、成功して書き込まれました。実装は、クリーンなものとしてページをマークするために vm_page_undirty(9) を呼び出さなければなりません。
VM_PAGER_PEND
ページは、非同期に書き込まれるようにスケジュールされました。書き込みが完了するとき、完了したコールバックは、ビジーフラグをクリアし、このページを待っている (ウェートしている) 他のスレッドを起こすために、 vm_object_pip_wakeup(9)vm_page_sunbusy(9) を呼び出すべきであり、さらに vm_page_undirty(9) も呼び出すべきです。
VM_PAGER_BAD
ページは、裏付けられているファイルの終りを完全に越えました。この状態は、vnode のファイルシステムが正確に実装されているなら、起こり得るべきではありません。
VM_PAGER_ERROR
根本的な記憶メディアまたはプロトコルのエラーのために、ページを書き込むことができませんでした。
VM_PAGER_FAIL
VM_PAGER_ERROR と同じように処理されました。
VM_PAGER_AGAIN
ページは、この要求によって扱われませんでした。

VOP_GETPAGES() メソッドは、 vm_page_free(9) を呼び出すことによって、うまく取り扱えない、 ma 中のあらゆるページを解放すると予想されます。成功するとき、 VOP_GETPAGES() は、適切に有効なビットを設定しなければなりません。 VOP_GETPAGES() は、 reqpage ビジーを保持しなければなりません。他のすべての成功して扱われたページをアンビジーとし、適切なページの (複数の) キューに、それらを置かなければなりません。例えば、 VOP_GETPAGES() は、(必要なビットが設定されるなら) ページを活性化するか、または (そうでなければ) それを非活性化して、現在、フォルト (fault) されているページを待っているあらゆるスレッドを起こすために最終的に vm_page_xunbusy(9) を呼び出します。

戻り値

成功して ma[reqpage] を読み込むなら、 VOP_GETPAGES() は、 VM_PAGER_OK を返します。そうでなければ、 VM_PAGER_ERROR を返します。慣例によって、 VOP_PUTPAGES() の返り値は、 rtvals[0] です。

作者

このマニュアルページは、 Doug Rabson によって書かれ、その後 Garrett Wollman によって大幅に書き直されました。
September 27, 2003 FreeBSD