NAME
ibv_get_device_list, ibv_free_device_list - 利用可能な RDMA デバイスのリストを取得・解放する。
SYNOPSIS
#include <infiniband/verbs.h> struct ibv_device **ibv_get_device_list(int *num_devices); void ibv_free_device_list(struct ibv_device **list);
DESCRIPTION
ibv_get_device_list() は現在有効な RDMA デバイス情報へのポインタの配列を返す。
この配列はサイズは明示されないが、配列の最後の要素が NULLで終わっている。
ただし引数の num_devices に非 NULL を指定した場合、num_devices の指す領域に RDMA デバイス数が設定される。
ibv_free_device_list() は ibv_get_device_list() の戻り値として渡された配列を解放する。
RETURN VALUE
ibv_get_device_list() が成功した場合、RDMA デバイスの情報へのポインタの配列を返す。
もしエラーとなった場合は、errno にエラー原因を設定し、NULL を返す。
RDMA デバイスがない場合には num_devices の指す先には 0 を格納し、非 NULL の値を返す。
ibv_free_device_list() には戻り値はない。
ERRORS
ibv_get_device_list() はエラー時には errno に以下のエラーを設定する。
| EPERM | アクセス権限がない。 |
| ENOSYS | カーネルが RDMA をサポートしていない。 |
| ENOMEM | メモリが不足している。 |
NOTES
クライアントプログラムは ibv_free_device_list() を呼ぶ前に、ibv_open_device() で RDMA デバイスをオープンする必要がある。
ibv_open_device() した RDMA デバイスは、ibv_free_device_list() を呼び配列を解放しても使うことができる。
EXAMPLES
ibv_get_device_list() を使いホストに搭載されている HCA のリストを取得するプログラムは以下のようになる。
ibv_get_device_name() と ibv_get_device_guid() は、ibv_open_device() を呼び出さなくても利用可能である。
/*
* $ gcc -g -Wall -libverbs -o sample-ibv_get_device_list sample-ibv_get_device_list.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <infiniband/verbs.h>
#include <infiniband/arch.h> /* for ntohll() */
int main(int argc, char **argv)
{
int i;
struct ibv_device **dev_list;
dev_list = ibv_get_device_list(NULL);
if (!dev_list) {
perror("Failed to get IB devices list");
exit(EXIT_FAILURE);
}
for (i=0 ; dev_list[i] ; i++) {
struct ibv_device *ib_dev = dev_list[i];
printf("[%d] \"%s\" 0x%016" PRIx64 "\n",
i, ibv_get_device_name(ib_dev), ntohll(ibv_get_device_guid(ib_dev)));
}
ibv_free_device_list(dev_list);
return 0;
}
SEE ALSO
InfiniBand Verbs API Reference、ibv_fork_init(3)、ibv_get_device_name(3)、ibv_get_device_guid(3)、ibv_open_device(3)
AUTHORS
原文 Dotan Barak <dotanba@gmail.com>
原文にない加筆がある。