VM_PAGE_BUSY(9) | FreeBSD Kernel Developer's Manual | VM_PAGE_BUSY(9) |
名称
vm_page_busied, vm_page_busy_downgrade, vm_page_busy_sleep, vm_page_sbusied, vm_page_sbusy, vm_page_sleep_if_busy, vm_page_sunbusy, vm_page_trysbusy, vm_page_tryxbusy, vm_page_xbusied, vm_page_xbusy, vm_page_xunbusy, vm_page_assert_sbusied, vm_page_assert_unbusied, vm_page_assert_xbusied — ページ識別変更とページ内容参照を保護する書式
#include < sys/param.h>#include < vm/vm.h>
#include < vm/vm_page.h>
int
vm_page_busied( vm_page_t m);
void
vm_page_busy_downgrade( vm_page_t m);
void
vm_page_busy_sleep( vm_page_t m, const char *msg);
int
vm_page_sbusied( vm_page_t m);
void
vm_page_sbusy( vm_page_t m);
int
vm_page_sleep_if_busy( vm_page_t m, const char *msg);
void
vm_page_sunbusy( vm_page_t m);
int
vm_page_trysbusy( vm_page_t m);
int
vm_page_tryxbusy( vm_page_t m);
int
vm_page_xbusied( vm_page_t m);
void
vm_page_xbusy( vm_page_t m);
void
vm_page_xunbusy( vm_page_t m);
options INVARIANTS
options INVARIANT_SUPPORT
void
vm_page_assert_sbusied( vm_page_t m);
void
vm_page_assert_unbusied( vm_page_t m);
void
vm_page_assert_xbusied( vm_page_t m);
解説
ページ識別は、通常、vm_object ロックと vm ページロックのように、より高いレベルのロックによって保護されます。しかしながら、時々、識別変更を完了するために必要な時間のためによのようなロックを保持することはできません。そのような場合に、時間の特定の量のための識別を所有する必要のあるスレッドによってページを排他的にビジーにすることができます。他の状況で、スレッドは、ページの識別を変更する必要はありませんが、それらは、他のスレッドが識別それら自体を変更するのを防ぐ必要があります。例えば、スレッドが保持されたロックのないページ内容にアクセスするか、または更新する必要があるとき、ページは、ビジーにされて共有されます。
ページをビジーにする前に、vm_object ロックは、保持されなければなりません。ページがアンビジー (unbusy) にされるとき、同じ規則が適用されます。これは、vm_object を実際のビジーのインタロックをロックさせます。
vm_page_busied() 関数は、現在のスレッドが排他的または共有モードのいずれかの m をビジーにされたなら、0 以外を返します。そうでなければ、0 を返します。
vm_page_busy_downgrade() 関数は、排他的なビジー状態から共有されるビジー状態まで m をダウングレードするために使用されなければなりません。
vm_page_busy_sleep() 関数は、ビジーメカニズムのための適切なウォッチチャネル (waitchannel) を使用してスリープするためにスレッドを呼び出します。パラメータ msg は、ユーザランドのツールのためのスリープ条件について記述する文字列です。
vm_page_busied() 関数は、現在のスレッドが共有モードで m をビジーにするなら、0 以外を返します。そうでなければ、0 を返します。
vm_page_sbusy() 関数は、 m を共有されたビジーにします。
vm_page_sleep_if_busy() 関数は、 m が排他的か、または共有モードのいずれかでビジーにされているなら、ビジーメカニズムのための適切なウォッチチャネル (waitchannel) を使用して、スリープするためにスレッドを呼び出します。呼び出しているスレッドがスリープしているなら、0 以外が返され、そうでなければ、0 が返されます。パラメータ msg は、ユーザランドツールのためのスリープ条件について記述する文字列です。
vm_page_sunbusy() 関数は、 m を共有されたアンビジー (unbusy) にします。
vm_page_trysbusy() は、 m を共有されたビジーにすることを試みます。オペレーションが直ちに成功することができないなら、 vm_page_trysbusy() は、0 を返し、そうでなければ、0 以外の値が返されます。
vm_page_tryxbusy() は、 m を排他的なビジーにすることを試みます。オペレーションが直ちに成功することができないなら、 vm_page_tryxbusy() は、0 を返し、そうでなければ、0 以外の値が返されます。
vm_page_xbusied() 関数は、現在のスレッドが排他的なモードで m をビジーにするなら、0 以外を返します。そうでなければ、0 が返されます。
vm_page_xbusy() 関数は、排他的に m をビジーにします。
vm_page_xunbusy() 関数は、 m を排他的なアンビジー (unbusy) にします。ビジー状態のアサーションによって、 options INVARIANTS と options INVARIANT_SUPPORT でコンパイルされたカーネルは、それらが尊重されないなら、パニックになるかもしれません。
vm_page_assert_sbusied() 関数は、 m が共有されたビジーでないなら、パニックします。
vm_page_assert_unbusied() 関数は、 m がアンビジー (unbusy) にされないなら、パニックします。
vm_page_assert_xbusied() 関数は、 m が排他的にビジーにされないなら、パニックします。
関連項目
VOP_GETPAGES(9), vm_page_aflag(9), vm_page_alloc(9), vm_page_deactivate(9), vm_page_free(9), vm_page_grab(9), vm_page_insert(9), vm_page_lookup(9), vm_page_rename(9)August 7, 2013 | FreeBSD |