アプリケーションにインフィニバンド ドライバーの OFED 3.18r2 実装を使用しています。特に、rdma 接続マネージャーのラッパー関数を使用しています。内部で何が起こっているのかをよりよく理解するために、私はソースコードを見ることに慣れています。こうやってパターンみたいなのが出てくるんだけど理解できない。例を挙げましょう。rdma 接続マネージャー関数は cma.c にあります。rdma_listen 呼び出しの例を見てください (これは、「rdma_」で始まるライブラリで定義されているほぼすべての関数に共通です)。
int rdma_listen(struct rdma_cm_id *id, int backlog)
{
struct ucma_abi_listen cmd;
struct cma_id_private *id_priv;
int ret;
CMA_INIT_CMD(&cmd, sizeof cmd, LISTEN);
id_priv = container_of(id, struct cma_id_private, id);
cmd.id = id_priv->handle;
cmd.backlog = backlog;
ret = write(id->channel->fd, &cmd, sizeof cmd);
if (ret != sizeof cmd)
return (ret >= 0) ? ERR(ENODATA) : -1;
if (af_ib_support)
return ucma_query_addr(id);
else
return ucma_query_route(id);
}
ここで、前に述べたパターンを見ることができます。
ret = write(id->channel->fd, &cmd, sizeof cmd);
write 呼び出しの最初の引数は、 /dev/infiniband/rdma_cmに関連付けられたファイル記述子ですが、 cmd引数の使用法を理解できません。ソースを調べてみると、 cmdが rdma cm 関数呼び出しの ABI 定義に使用される構造体であることがわかりました。これがデバイスドライバー呼び出しを実行する一般的なパターンであるかどうか、およびそれがどのように機能するか、cmd引数に関連付けられた実際のコードはどこにあるのか、私には本当にわかりません。手伝っていただけませんか?