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

名称

rman, rman_activate_resource, rman_adjust_resource, rman_await_resource, rman_deactivate_resource, rman_fini, rman_init, rman_init_from_resource, rman_is_region_manager, rman_manage_region, rman_first_free_region, rman_last_free_region, rman_release_resource, rman_reserve_resource, rman_reserve_resource_bound, rman_make_alignment_flags, rman_get_start, rman_get_end, rman_get_device, rman_get_size, rman_get_flags, rman_set_virtual, rman_get_virtual, rman_set_bustag, rman_get_bustag, rman_set_bushandle, rman_get_bushandle, rman_set_rid, rman_get_ridリソース管理関数

書式

#include < sys/types.h>
#include < sys/rman.h>

int
rman_activate_resource( struct resource *r);

int
rman_adjust_resource( struct resource *r, u_long start, u_long end);

int
rman_await_resource( struct resource *r, int pri2, int timo);

int
rman_deactivate_resource( struct resource *r);

int
rman_fini( struct rman *rm);

int
rman_init( struct rman *rm);

int
rman_init_from_resource( struct rman *rm, struct resource *r);

int
rman_is_region_manager( struct resource *r, struct rman *rm);

int
rman_manage_region( struct rman *rm, u_long start, u_long end);

int
rman_first_free_region( struct rman *rm, u_long *start, u_long *end);

int
rman_last_free_region( struct rman *rm, u_long *start, u_long *end);

int
rman_release_resource( struct resource *r);

struct resource *
rman_reserve_resource( struct rman *rm, u_long start, u_long end, u_long count, u_int flags, struct device *dev);

struct resource *
rman_reserve_resource_bound( struct rman *rm, u_long start, u_long end, u_long count, u_long bound, u_int flags, struct device *dev);

uint32_t
rman_make_alignment_flags( uint32_t size);

u_long
rman_get_start( struct resource *r);

u_long
rman_get_end( struct resource *r);

struct device *
rman_get_device( struct resource *r);

u_long
rman_get_size( struct resource *r);

u_int
rman_get_flags( struct resource *r);

void
rman_set_virtual( struct resource *r, void *v);

void *
rman_get_virtual( struct resource *r);

void
rman_set_bustag( struct resource *r, bus_space_tag_t t);

bus_space_tag_t
rman_get_bustag( struct resource *r);

void
rman_set_bushandle( struct resource *r, bus_space_handle_t h);

bus_space_handle_t
rman_get_bushandle( struct resource *r);

void
rman_set_rid( struct resource *r, int rid);

int
rman_get_rid( struct resource *r);

解説

rman セット関数は、柔軟性のあるリソース管理抽象化を提供します。それは、バス管理コードによって幅広く使用されます。それは、領域とリソースの抽象化を実装します。領域記述子は、領域を管理するために使用されます。これは、メモリまたはバス空間のある他の形式であるかもしれません。

各領域には、1 組の境界があります。これらの境界の中には、割り付けられたセグメントが存在します。リソースと呼ばれる各セグメントは、次の 16 ビットのフラグレジスタによって表されるいくつかの特性があります。

#define RF_ALLOCATED    0x0001 /* リソースは予約されました */ 
#define RF_ACTIVE       0x0002 /* リソース割り付けは活性化しました */ 
#define RF_SHAREABLE    0x0004 /* リソースは同時発生の共有を許可します */ 
#define RF_TIMESHARE    0x0008 /* リソースは時間分割共有を許可します */ 
#define RF_WANTED       0x0010 /* 誰かこのリソースを待っています */ 
#define RF_FIRSTSHARE   0x0020 /* 最初は共有リスト */ 
#define RF_PREFETCHABLE 0x0040 /* リソースはプリフェッチ可能です */

フラグビットの残りは、領域中でリソースの必要な整列を表すために使用されます。

rman_init() 関数は、リソース管理関数で使用するために、 rm 引数によって指された領域記述子を初期化します。 struct rman のフィールド rm_typerm_descr は、 rman_init() を呼び出す前に設定されることが必要です。フィールド rm_type は、 RMAN_ARRAY に設定されるものとします。フィールド rm_descr は、管理されるリソースについて説明する文字列に設定されるものとします。 rm_startrm_end フィールドは、受け付け可能なリソースアドレスの範囲を制限するために設定することができます。これらのフィールドが設定されないなら、 rman_init() は、全体の範囲のリソースアドレスを許可するために、それらを初期化します。また、それは、構造体に関連しているすべてのミューテックスも初期化します。 rman_init() がミューテックスの初期化に失敗するなら、 ENOMEM を返します。そうでなければ、0 を返し、 rm は、初期化されます。

rman_fini() 関数は、 rm 引数によって指される構造体に関連しているすべての構造体を解放します。管理された領域中のリソースのいずれかに RF_ALLOCATED フラグの設定があるなら、 EBUSY を返します。そうでなければ、構造体に関連しているすべてのミューテックスが解放され、破壊されます、そして、関数は、0 を返します。

rman_manage_region() 関数は、 rman 制御の下にある領域の概念を確立します。 rman 引数は、領域記述子を指します。 startend 引数は、領域の境界を指定します。成功するなら、 rman_manage_region() は、0 を返します。領域が既存の領域に重なるなら、 EBUSY を返します。その領域のいくつかの部分が rm のための有効なアドレスの範囲外となるなら、 EINVAL を返します。 rman_manage_region() が領域のためのメモリの割り付けに失敗したとき、 ENOMEM が返されます。

rman_init_from_resource() 関数は、既存のリソースによって裏付けられているリソース管理を作成するためのラッパルーチンです。 rman_init() を使用して rm を初期化して、次に、 rman_manage_region() を通して r に割り付けられたアドレスの範囲に対応する rm に領域を追加します。

最初 (または最後) の割り付けられていない領域に対するリソース管理について問い合わせるために rman_first_free_region() と rman_last_free_region() 関数を使用することができます。 rm が空きの領域を含んでいないなら、これらの関数は、 ENOENT を返します。そうでなければ、 *start*end は、空き領域の範囲に設定され、0 が返されます。

rman_reserve_resource_bound() 関数は、 rman 論理の大部分が位置しているところです。それは、デバイス dev の使用のために指定された領域 rm の連続した範囲を予約することを試みます。呼び出し側は、境界制限と必要な整列と同様に、受け付けることができる範囲の startend を指定することができます、そして、コードは、適合する空きセグメントを見つけることを試みます。 start 引数は、リソースの最も低い受け付け可能な開始の値です。 end 引数は、リソースの最も高い受け付け可能な終わりの値です。したがって、 start + count - 1 は、どんな割り付けが起こっても end より≤ (等しいか小さく) なければなりません。整列要件 (もしあれば) は、 flags で指定されます。 bound 引数は、割り付けられた領域が境界の倍数であるアドレスと交差できるように、境界の制限を指定するために設定されます。 bound 引数は、2 のべき乗でなければなりません。境界の制限を指定しないように 0 に設定することができます。デフォルトの振る舞いは、 RF_SHAREABLE または RF_TIMESHARE フラグが設定されないなら、排他的セグメントを割り付けることです。フラグが設定される場合、共有されたセグメントが割り付けられます。この共有されたセグメントが既に存在しているなら、呼び出し側は、デバイスをコンシューマ (消費者) のリストに追加させます。

rman_reserve_resource() 関数は、以前に確立した領域の中にリソースを予約するために使用されます。それは、 bound 引数に 0 を渡す rman_reserve_resource_bound() への簡易型のインタフェースです。

rman_make_alignment_flags() 関数は、必要な整列 size に対応するフラグマスクを返します。これは、 rman_reserve_resource_bound() を呼び出すとき、使用されるべきです。

rman_is_region_manager() 関数は、割り付けられたリソース rrm から割り付けられているなら、真を返します。そうでなければ、偽を返します。

rman_adjust_resource() 関数は、 start から end まで予約するために割り付けられたリソースの予約されたアドレスの範囲を調整するために使用されます。リソース範囲の 1 つまたは両端を増大するか、または縮小するために、使用することができます。現在の実装は、リソースの完全なリロケーションをサポートしていません、新しいリソース範囲が古いリソースの範囲とオーバラップしないなら、 EINVAL で失敗します。リソース範囲の終りを増大する、新しいリソース範囲が別の割り付けられたリソースと衝突するかのいずれかなら、関数は、 EBUSY で失敗します。 rman_adjust_resource() 関数は、共用リソースのためにリソース範囲を調整するサポートを行わないで、 EINVAL でそのような試みに失敗します。成功すれば、リソース r は、 start の開始アドレスと end の終りアドレスがあり、関数は、0 を返します。整列または境界の制限が rman_adjust_resource() によってチェックされないように、オリジナルの割り付け要求の規制がないことに注意してください。そのような要件を実行するのは、呼び出し側の責任です。

rman_release_resource() 関数は、予約されたリソース r を解放します。それは、隣接している空きリソースを合併することを試みます。

rman_activate_resource() 関数は、 RF_ACTIVE フラグを設定することによって活発であるとしてリソースをマークします。これが時間共用リソースであり、呼び出し側がまだリソースを取得していないなら、関数は、 EBUSY を返します。

rman_deactivate_resource() 関数は、 RF_ACTIVE フラグをクリアすることによって、不活発であるとしてリソース r をマークします。他のコンシューマがこの範囲を待っているなら、それは、それらのスレッドを起こします。

rman_await_resource() 関数は、リソース r が不活発になるように、すなわち、 RF_ACTIVE フラグがクリアされるために、非同期な待ちを実行します。それは、一度に 1 つのスレッドによって安全に使用することができるリソースの協力的な共有を可能にするために使用されます。引数 pritimo は、 rman_await_resource() 関数に渡されます。

rman_get_start(), rman_get_end(), rman_get_size() と rman_get_flags() 関数は、以前に予約されたリソース r の境界、サイズ、とフラグを返します。

rman_set_bustag() 関数は、 bus_space_tag_t t をリソース r に関連づけます。 rman_get_bustag() 関数は、一度設定されたこのタグを検索するために使用されます。

rman_set_bushandle() 関数は、 bus_space_handle_t h をリソース r に関連づけます。 rman_get_bushandle() 関数は、一度設定されたこのハンドルを検索するために使用されます。

rman_set_virtual() 関数は、カーネル仮想アドレスをリソース r に関連づけるために使用されます。 rman_get_virtual() 関数は、一度設定された KVA を検索するために使用することができます。

rman_set_rid() 関数は、リソース識別子をリソース r に関連づけます。 rman_get_rid() 関数は、この RID を検索します。

rman_get_device() 関数は、リソース r を予約したデバイスへのポインタを返します。

作者

このマニュアルページは、 Bruce M Simpson <bms@spc.org>によって書かれました。
April 29, 2011 FreeBSD