RDMA-device系列api

一:ibv_get_device_name()

const char *ibv_get_device_name(struct ibv_device *device);

Description

ibv_get_device_name()返回一个名称字符串,该名称与RDMA设备device相关联。
此名称在特定机器内是惟一的(不能将同一名称分配给多个设备)
然而,这个名称在InfiniBand fabric中不是唯一的(在不同的机器中可以找到这个名称)
当一台计算机中有多个RDMA设备时,更改计算机中的设备位置(即PCI总线中的设备位置)可能导致与设备相关的名称的更改。为了区分设备,建议使用由ibv_get_device_guid()返回的设备GUID。
在这里插入图片描述

Return Values

ibv_get_device_name()返回一个指向设备名称的指针,如果失败则返回NULL。

这个名字是由:
描述RDMA设备供应商和型号
cxgb3 - Chelsio Communications, T3 RDMA family
cxgb4 - Chelsio Communications, T4 RDMA family
ehca - IBM, eHCA family
ipathverbs - QLogic
mlx4 - Mellanox Technologies, ConnectX family
mthca - Mellanox Technologies, InfiniHost family
nes - Intel, Intel-NE family
索引一个数字,它有助于区分来自同一计算机上同一供应商和系列的多个设备.

Examples

#include <stdio.h>
#include <infiniband/verbs.h>

int main(void)
{
	struct ibv_device **device_list;
	int num_devices;
	int i;

	device_list = ibv_get_device_list(&num_devices);
	if (!device_list) {
		fprintf(stderr, "Error, ibv_get_device_list() failed\n");
		return -1;
	}

	printf("%d RDMA device(s) found:\n\n", num_devices);

	for (i = 0; i < num_devices; ++ i)
		printf("RDMA device[%d]: name=%s\n", i,
		       ibv_get_device_name(device_list[i]));

	ibv_free_device_list(device_list);

	return 0;
}

二:ibv_get_device_guid()

uint64_t ibv_get_device_guid(struct ibv_device *device);

Description

ibv_get_device_guid()返回RDMA设备的全局唯一标识(GUID)。
这个GUID是在制造期间由其供应商分配给该设备的,它是唯一的,可以用作RDMA设备的标识符。
通过RDMA设备GUID的前缀,可以使用以下URL知道谁是该设备的供应商:IEEE OUI
在这里插入图片描述

Return Values

成功返回64位的GUID网络字节序,设备时可以查看errno的值,例如为EMFILE,则可能的原因是此进程打开的文件过多。

Examples

前文已经有了,或者查看rdma-core的ibv_devices对应的源码。

三:ibv_open_device()

struct ibv_context *ibv_open_device(struct ibv_device *device);

Description

ibv_open_device()为RDMA设备设备创建一个上下文。这个上下文稍后将用于查询其资源或创建资源,应该通过ibv_close_device()释放它。

不像verbs所暗示的那样,它实际上并没有打开设备,这个设备是由内核底层驱动程序打开的,可能由其他用户/内核级代码使用。此verbs只打开一个上下文以允许用户级应用程序使用它。
在这里插入图片描述

Return Values

成功返回一个struct ibv_context *类型的指针。

struct ibv_context {
	struct ibv_device      *device;
	struct ibv_context_ops	ops;
	int			cmd_fd;
	int			async_fd;
	int			num_comp_vectors;
	pthread_mutex_t		mutex;
	void		       *abi_compat;
};

其中,async_fd用于(内部)读取异步事件的文件描述符。如果希望以非阻塞模式读取异步事件,则可以使用它。
num_comp_vectors可用于此RDMA设备的完成向量(即MSI-X向量)的数量。

Examples

#include <stdio.h>
#include <infiniband/verbs.h>

int main(void)
{
	struct ibv_device **device_list;
	int num_devices;
	int i;
	int rc;

	device_list = ibv_get_device_list(&num_devices);
	if (!device_list) {
		fprintf(stderr, "Error, ibv_get_device_list() failed\n");
		return -1;
	}

	printf("%d RDMA device(s) found:\n\n", num_devices);

	for (i = 0; i < num_devices; ++ i) {
		struct ibv_context *ctx;

		ctx = ibv_open_device(device_list[i]);
		if (!ctx) {
			fprintf(stderr, "Error, failed to open the device '%s'\n",
				ibv_get_device_name(device_list[i]));
			rc = -1;
			goto out;
		}

		printf("The device '%s' was opened\n", ibv_get_device_name(ctx->device));

		rc = ibv_close_device(ctx);
		if (rc) {
			fprintf(stderr, "Error, failed to close the device '%s'\n",
				ibv_get_device_name(ctx->device));
			rc = -1;
			goto out;
		}
	}
		
	ibv_free_device_list(device_list);

	return 0;

out:
	ibv_free_device_list(device_list);
	return rc;
}

四:ibv_close_device()

int ibv_close_device(struct ibv_context *context);

Description

ibv_close_device()关闭RDMA设备上下文。

Ibv_close_device()不会释放与此上下文关联的资源。为了防止资源(如内存、文件描述符、RDMA对象号)泄漏,在调用此verbs之前释放它们取决于用户。使用这些孤儿资源可能会导致分割故障。

但是,当进程结束时,操作系统将自动清理这些资源。
在这里插入图片描述

Return Values

成功返回0.设备返回-1.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值