@@ -124,7 +124,7 @@ LATEST_SYMVER_FUNC(ibv_get_device_guid, 1_1, "IBVERBS_1.1",
int i;
pthread_mutex_lock(&dev_list_lock);
- if (sysfs_dev->flags & VSYSFS_READ_NODE_GUID) {
+ if (sysfs_dev && sysfs_dev->flags & VSYSFS_READ_NODE_GUID) {
guid = sysfs_dev->node_guid;
pthread_mutex_unlock(&dev_list_lock);
return htobe64(guid);
@@ -154,7 +154,7 @@ int ibv_get_device_index(struct ibv_device *device)
{
struct verbs_sysfs_dev *sysfs_dev = verbs_get_device(device)->sysfs;
- return sysfs_dev->ibdev_idx;
+ return sysfs_dev ? sysfs_dev->ibdev_idx : -1;
}
void verbs_init_cq(struct ibv_cq *cq, struct ibv_context *context,
@@ -323,18 +323,20 @@ static void set_lib_ops(struct verbs_context *vctx)
struct ibv_context *verbs_open_device(struct ibv_device *device, void *private_data)
{
struct verbs_device *verbs_device = verbs_get_device(device);
- int cmd_fd;
+ int cmd_fd = -1;
struct verbs_context *context_ex;
int ret;
- /*
- * We'll only be doing writes, but we need O_RDWR in case the
- * provider needs to mmap() the file.
- */
- cmd_fd = open_cdev(verbs_device->sysfs->sysfs_name,
- verbs_device->sysfs->sysfs_cdev);
- if (cmd_fd < 0)
- return NULL;
+ if (verbs_device->sysfs) {
+ /*
+ * We'll only be doing writes, but we need O_RDWR in case the
+ * provider needs to mmap() the file.
+ */
+ cmd_fd = open_cdev(verbs_device->sysfs->sysfs_name,
+ verbs_device->sysfs->sysfs_cdev);
+ if (cmd_fd < 0)
+ return NULL;
+ }
/*
* cmd_fd ownership is transferred into alloc_context, if it fails
@@ -345,11 +347,13 @@ struct ibv_context *verbs_open_device(struct ibv_device *device, void *private_d
return NULL;
set_lib_ops(context_ex);
- if (context_ex->context.async_fd == -1) {
- ret = ibv_cmd_alloc_async_fd(&context_ex->context);
- if (ret) {
- ibv_close_device(&context_ex->context);
- return NULL;
+ if (verbs_device->sysfs) {
+ if (context_ex->context.async_fd == -1) {
+ ret = ibv_cmd_alloc_async_fd(&context_ex->context);
+ if (ret) {
+ ibv_close_device(&context_ex->context);
+ return NULL;
+ }
}
}
@@ -428,7 +432,8 @@ out:
void verbs_uninit_context(struct verbs_context *context_ex)
{
free(context_ex->priv);
- close(context_ex->context.cmd_fd);
+ if (context_ex->context.cmd_fd != -1)
+ close(context_ex->context.cmd_fd);
if (context_ex->context.async_fd != -1)
close(context_ex->context.async_fd);
ibverbs_device_put(context_ex->context.device);
@@ -127,6 +127,11 @@ int ibv_read_ibdev_sysfs_file(char *buf, size_t size,
va_list va;
int res;
+ if (!sysfs_dev) {
+ errno = EINVAL;
+ return -1;
+ }
+
va_start(va, fnfmt);
if (vasprintf(&path, fnfmt, va) < 0) {
va_end(va);
Enable verbs_open_device() to work over non sysfs devices as of mlx5 over VFIO. Any other API over verbs_sysfs_dev should fail cleanly. Signed-off-by: Yishai Hadas <yishaih@nvidia.com> --- libibverbs/device.c | 39 ++++++++++++++++++++++----------------- libibverbs/sysfs.c | 5 +++++ 2 files changed, 27 insertions(+), 17 deletions(-)