書式
#include <sys/types.h>
#include <sys/spu.h>
int spu_create(const char *pathname, int flags, mode_t mode);
int spu_create(const char *pathname, int flags, mode_t mode,
int neighbor_fd);
注: このシステムコールには glibc のラッパー関数は存在しない。「注意」の節を参照。
説明
spu_create() システムコールは、Cell Broadband Engine アーキテクチャーを実装した PowerPC マシンにおいて、Synergistic Processor Unit (SPU) にアクセスするために使用される。 このシステムコールは、 SPU に対する新しい論理コンテキストを pathname に生成し、 そのコンテキストに関連付けられたファイルディスクリプターを返す。 pathname は SPU ファイルシステム (spufs) のマウントポイント内の存在しないディレクトリを指していなければならない。 spu_create() が成功すると、 pathname にディレクトリが生成され、 そのディレクトリに spufs(7) で説明されているファイル群が配置される。コンテキストを作成した際、返されたファイルディスクリプターは、 spu_run(2) に渡すか、 *at 系のシステムコール (openat(2) など) の dirfd 引き数として使用するか、 クローズするか、しかできない。 他の操作は定義されていない。 そのコンテキストへの最後の参照がなくなった際に、 論理 SPU コンテキストは破棄される (そのコンテキストの pathname ディレクトリに作成されたファイルもすべて破棄される)。 通常は spu_create() が返したファイルディスクリプターがクローズされた際に発生する。
flags 引き数には 0 か以下の定数の組み合わせ (ビット単位の論理和) を指定できる。
- SPU_CREATE_EVENTS_ENABLED
- DMA エラーを通知するのにシグナルを使うのではなく、 spu_run(2) の event 引き数を使用する。
- SPU_CREATE_GANG
-
コンテキストの代わりに SPU gang を作成する。 (gang は、機能的に互いに関係していて、スケジューリングパラメーター (優先度とポリシー)
を共有する SPU コンテキストのグループである。 将来、 グループ全体が一つの単位としてスイッチイン/スイッチアウトされる gang
スケジューリングが実装されるかもしれない。)
pathname 引き数で指定された場所に新しいディレクトリが作成される。 この gang を使って他の SPU コンテキストを保持することができる。 それには、それ以降の spu_create() に gang ディレクトリ内のパス名を渡す。
- SPU_CREATE_NOSCHED
-
SPU スケジューラーの影響を受けないコンテキストを作成する。 一度実行されると、
呼び出したプロセスが破棄されるまでこのコンテキストがスケジューリングで追い出されることはない。
このコンテキストは SPU から削除されることはないので、 SPU_CREATE_NOSCHED コンテキストではいくつかの機能は無効にされる。 spufs のこのコンテキストのディレクトリでは一部のファイルだけができる。 また、 SPU_CREATE_NOSCHED コンテキストはクラッシュした際にコアファイルをダンプできない。
SPU_CREATE_NOSCHED コンテキストを作成するには CAP_SYS_NICE ケーパビリティが必要である。
- SPU_CREATE_ISOLATE
-
隔離された SPU コンテキストを作成する。 隔離されたコンテキストはいくつかの PPE (PowerPC Processing Element)
命令から保護される。 SPU ローカルストアや NPC レジスターへのアクセスなどである。
SPU_CREATE_ISOLATE コンテキストを作成するには SPU_CREATE_NOSCHED フラグも指定する必要がある。
- SPU_CREATE_AFFINITY_SPU
- 別の SPU コンテキストと affinity (親和性) を持ったコンテキストを作成する。 この affinity 情報は SPU スケジューリングアルゴリズムで使用される。 このフラグを使う際には、 他の SPU コンテキストを指すファイルディスクリプターを neighbor_fd 引き数を渡す必要がある。
- SPU_CREATE_AFFINITY_MEM
- システムメモリーと affinity (親和性) を持ったコンテキストを作成する。 この affinity 情報は SPU スケジューリングアルゴリズムで使用される。
mode 引き数 (からプロセスの umask(2) でセットされたビットを除いたもの) により、 spufs に作られる新しいディレクトリで使用されるアクセス許可が決まる。 利用できる mode 値の完全なリストについては stat(2) を参照。
返り値
成功すると、 spu_create() は新しいファイルディスクリプターを返す。 エラーの場合、-1 を返し、 errno に以下のリストに記載のエラーコードのいずれかを設定する。エラー
- EACCES
- 現在のユーザーが spufs(7) のマウントポイントへの書き込み許可を持って いない。
- EEXIST
- 指定されたパス名で SPU コンテキストがすでに生成されている。
- EFAULT
- pathname が呼び出し元のプロセスのアドレス空間で有効な文字列ポインターではない。
- EINVAL
- pathname が SPUFS マウントポイント内のディレクトリではない。 または、無効なフラグが指定された。
- ELOOP
- pathname を解決するまでに辿ったシンボリックリンクが多過ぎた。
- EMFILE
- そのプロセスがオープンできるファイル数の上限に達していた。
- ENAMETOOLONG
- pathname が長過ぎる。
- ENFILE
- システム全体でオープンできるファイル数の上限に達していた。
- ENODEV
- 隔離されたコンテキストが要求されたが、 ハードウェアが SPU アイソレーションをサポートしていない。
- ENOENT
- pathname の一部が解決できなかった。
- ENOMEM
- カーネルが必要なリソースの全てを割り当てることができなかった。
- ENOSPC
- 新しいコンテキストを生成するのに十分な SPU リソースがなかった、 または SPU コンテキスト数がそのユーザーの特定の上限に達していた。
- ENOSYS
- 機能が動作中のシステムで提供されていない。理由は、 ハードウェアで SPU が提供されていないか、 spufs モジュールがロードされていないか、のどちらかである。
- ENOTDIR
- pathname の一部がディレクトリではない。
- EPERM
- SPU_CREATE_NOSCHED フラグが指定されたが、ユーザーが CAP_SYS_NICE ケーパビリティを持っていない。
ファイル
pathname は spufs のマウントポイントの配下の場所を指して いなければならない。 慣例では /spu にマウントされる。バージョン
spu_create() システムコールはカーネル 2.6.16 で Linux に追加された。準拠
このシステムコールは Linux 固有であり、 PowerPC アーキテクチャーでのみ実装されている。 このシステムコールを使ったプログラムは移植性がない。注意
glibc はこのシステムコールに対するラッパー関数を提供していない。 syscall(2) を使うこと。ただし、 spu_create() は より抽象度の高い SPU へのインターフェースを実装するライブラリから 利用されることを意図したものであり、通常のアプリケーションから 使用は意図されていない。推奨のライブラリについては を参照のこと。例
spu_create() の利用例については spu_run(2) を参照。この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。