Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Aug 2010 05:46:37 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r211274 - projects/ofed/head/contrib/ofed/libibverbs/src
Message-ID:  <201008130546.o7D5kbak010911@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jeff
Date: Fri Aug 13 05:46:37 2010
New Revision: 211274
URL: http://svn.freebsd.org/changeset/base/211274

Log:
   - Update paths and sysfs access to account for sysctl and freebsd
     device paths.
  
  Sponsored by:	Isilon Systems, iX Systems, and Panasas.

Modified:
  projects/ofed/head/contrib/ofed/libibverbs/src/device.c
  projects/ofed/head/contrib/ofed/libibverbs/src/init.c
  projects/ofed/head/contrib/ofed/libibverbs/src/sysfs.c

Modified: projects/ofed/head/contrib/ofed/libibverbs/src/device.c
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/src/device.c	Fri Aug 13 05:45:36 2010	(r211273)
+++ projects/ofed/head/contrib/ofed/libibverbs/src/device.c	Fri Aug 13 05:46:37 2010	(r211274)
@@ -128,7 +128,7 @@ struct ibv_context *__ibv_open_device(st
 	int cmd_fd;
 	struct ibv_context *context;
 
-	if (asprintf(&devpath, "/dev/infiniband/%s", device->dev_name) < 0)
+	if (asprintf(&devpath, "/dev/%s", device->dev_name) < 0)
 		return NULL;
 
 	/*

Modified: projects/ofed/head/contrib/ofed/libibverbs/src/init.c
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/src/init.c	Fri Aug 13 05:45:36 2010	(r211273)
+++ projects/ofed/head/contrib/ofed/libibverbs/src/init.c	Fri Aug 13 05:46:37 2010	(r211274)
@@ -79,6 +79,7 @@ static struct ibv_driver *head_driver, *
 
 static int find_sysfs_devs(void)
 {
+#ifdef __linux__
 	char class_path[IBV_SYSFS_PATH_MAX];
 	DIR *class_dir;
 	struct dirent *dent;
@@ -151,6 +152,57 @@ static int find_sysfs_devs(void)
 
 	closedir(class_dir);
 	return ret;
+#else
+	char class_path[IBV_SYSFS_PATH_MAX];
+	struct ibv_sysfs_dev *sysfs_dev = NULL;
+	char value[8];
+	int ret = 0;
+	int i;
+
+	snprintf(class_path, sizeof class_path, "%s/class/infiniband_verbs",
+		 ibv_get_sysfs_path());
+
+	for (i = 0; i < 256; i++) {
+		if (!sysfs_dev)
+			sysfs_dev = malloc(sizeof *sysfs_dev);
+		if (!sysfs_dev) {
+			ret = ENOMEM;
+			goto out;
+		}
+
+		snprintf(sysfs_dev->sysfs_path, sizeof sysfs_dev->sysfs_path,
+			 "%s/uverbs%d", class_path, i);
+
+		snprintf(sysfs_dev->sysfs_name, sizeof sysfs_dev->sysfs_name,
+			"uverbs%d", i);
+
+		if (ibv_read_sysfs_file(sysfs_dev->sysfs_path, "ibdev",
+					sysfs_dev->ibdev_name,
+					sizeof sysfs_dev->ibdev_name) < 0)
+			continue;
+
+		snprintf(sysfs_dev->ibdev_path, sizeof sysfs_dev->ibdev_path,
+			 "/dev/%s", sysfs_dev->ibdev_name);
+
+		sysfs_dev->next        = sysfs_dev_list;
+		sysfs_dev->have_driver = 0;
+		if (ibv_read_sysfs_file(sysfs_dev->sysfs_path, "abi_version",
+					value, sizeof value) > 0)
+			sysfs_dev->abi_ver = strtol(value, NULL, 10);
+		else
+			sysfs_dev->abi_ver = 0;
+
+		sysfs_dev_list = sysfs_dev;
+		sysfs_dev      = NULL;
+	}
+
+ out:
+	if (sysfs_dev)
+		free(sysfs_dev);
+
+	return ret;
+	
+#endif
 }
 
 void ibv_register_driver(const char *name, ibv_driver_init_func init_func)
@@ -333,13 +385,19 @@ static struct ibv_device *try_driver(str
 				     struct ibv_sysfs_dev *sysfs_dev)
 {
 	struct ibv_device *dev;
+	char *path;
 	char value[8];
 
 	dev = driver->init_func(sysfs_dev->sysfs_path, sysfs_dev->abi_ver);
 	if (!dev)
 		return NULL;
 
-	if (ibv_read_sysfs_file(sysfs_dev->ibdev_path, "node_type", value, sizeof value) < 0) {
+	if (asprintf(&path, "/sys/class/infiniband/%s",
+	    strrchr(sysfs_dev->ibdev_path, '/')+1) < 0) {
+		dev->node_type = IBV_NODE_UNKNOWN;
+		goto out;
+	}
+	if (ibv_read_sysfs_file(path, "node_type", value, sizeof value) < 0) {
 		fprintf(stderr, PFX "Warning: no node_type attr under %s.\n",
 			sysfs_dev->ibdev_path);
 			dev->node_type = IBV_NODE_UNKNOWN;
@@ -348,6 +406,8 @@ static struct ibv_device *try_driver(str
 		if (dev->node_type < IBV_NODE_CA || dev->node_type > IBV_NODE_RNIC)
 			dev->node_type = IBV_NODE_UNKNOWN;
 	}
+	free(path);
+out:
 
 	switch (dev->node_type) {
 	case IBV_NODE_CA:

Modified: projects/ofed/head/contrib/ofed/libibverbs/src/sysfs.c
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/src/sysfs.c	Fri Aug 13 05:45:36 2010	(r211273)
+++ projects/ofed/head/contrib/ofed/libibverbs/src/sysfs.c	Fri Aug 13 05:46:37 2010	(r211274)
@@ -42,6 +42,8 @@
 #include <fcntl.h>
 #include <string.h>
 
+#include <sys/sysctl.h>
+
 #include "ibverbs.h"
 
 static char *sysfs_path;
@@ -78,22 +80,21 @@ const char *ibv_get_sysfs_path(void)
 int ibv_read_sysfs_file(const char *dir, const char *file,
 			char *buf, size_t size)
 {
-	char *path;
+	char *path, *s;
 	int fd;
-	int len;
+	size_t len;
 
 	if (asprintf(&path, "%s/%s", dir, file) < 0)
 		return -1;
 
-	fd = open(path, O_RDONLY);
-	if (fd < 0) {
-		free(path);
-		return -1;
-	}
+	for (s = &path[0]; *s != '\0'; s++)
+		if (*s == '/')
+			*s = '.';
 
-	len = read(fd, buf, size);
+        len = size;
+        if (sysctlbyname(&path[1], buf, &len, NULL, 0) == -1)
+		return -1;
 
-	close(fd);
 	free(path);
 
 	if (len > 0 && buf[len - 1] == '\n')



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008130546.o7D5kbak010911>