in efawin/efa_win_cmd.c [124:159]
int efa_device_init(void)
{
struct ibv_device** device_list = NULL;
int ctx_idx;
int ret;
device_list = ibv_get_device_list(&dev_cnt);
ctx_list = calloc(dev_cnt, sizeof(*ctx_list));
if (!ctx_list) {
ret = -ENOMEM;
goto err_free_dev_list;
}
for (ctx_idx = 0; ctx_idx < dev_cnt; ctx_idx++) {
ctx_list[ctx_idx] = efa_device_open(device_list[ctx_idx]);
if (!ctx_list[ctx_idx]) {
ret = -ENODEV;
goto err_close_devs;
}
}
free(device_list);
return 0;
err_close_devs:
for (ctx_idx--; ctx_idx >= 0; ctx_idx--)
efa_device_close(ctx_list[ctx_idx]);
free(ctx_list);
ctx_list = NULL;
err_free_dev_list:
free(device_list);
dev_cnt = 0;
return ret;
}