Hello Roland,

does OpenIB 1.0 RC2 (RC3, ...) still uses libsysfs or is it only change for subversion head (trunk)?

Mit freundlichen Gruessen / Kind Regards
Heiko Joerg Schick



Roland Dreier <[EMAIL PROTECTED]>

04/20/2006 09:13 PM

To
Christoph Raisch/Germany/[EMAIL PROTECTED], Heiko J Schick/Germany/[EMAIL PROTECTED], Hoang-Nam Nguyen/Germany/[EMAIL PROTECTED]
cc
[email protected]
Subject
[openib-general] [PATCH 2/2] Wean libehca off of libsysfs





As discussed in <http://thread.gmane.org/gmane.linux.drivers.openib/24250>
I would like to start moving the libibverbs interface to lower-level
drivers away from using libsysfs data structures.

This patch implements that scheme for libehca, and adds an
ibv_driver_init() entry point in a backwards compatible way: it will
work with existing releases of libibverbs 1.0, and should be source
compatible with libibverbs 1.1.

Compile tested only, as I don't have ehca hardware (yet...).  Please
test and apply if it looks good to you.

Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>

--- src/userspace/libehca/configure.in                 (revision 6541)
+++ src/userspace/libehca/configure.in                 (working copy)
@@ -16,6 +16,9 @@ AC_CHECK_LIB(ibverbs,
             [],
             AC_MSG_ERROR([libibverbs not installed]))

+dnl Checks for library functions
+AC_CHECK_FUNCS(ibv_read_sysfs_file)
+
dnl Checks for programs.
AC_PROG_CC
AC_OUTPUT([Makefile])
--- src/userspace/libehca/src/ehca_uinit.c                 (revision 6541)
+++ src/userspace/libehca/src/ehca_uinit.c                 (working copy)
@@ -38,12 +38,19 @@
 *  $Id: ehca_uinit.c,v 1.6 2006/04/11 13:45:31 nguyen Exp $
 */

+#if HAVE_CONFIG_H
+#  include <config.h>
+#endif /* HAVE_CONFIG_H */
+
#include <infiniband/driver.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
#include <pthread.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>

#include "ehca_uclasses.h"

@@ -144,42 +151,58 @@ static struct ibv_device_ops ehcau_dev_o
                 .free_context = ehcau_free_context
};

-struct ibv_device *openib_driver_init(struct sysfs_class_device *sysdev)
+/*
+ * Keep a private implementation of HAVE_IBV_READ_SYSFS_FILE to handle
+ * old versions of libibverbs that didn't implement it.  This can be
+ * removed when libibverbs 1.0.3 or newer is available "everywhere."
+ */
+#ifndef HAVE_IBV_READ_SYSFS_FILE
+static int ibv_read_sysfs_file(const char *dir, const char *file,
+                                                          char *buf, size_t size)
+{
+                 char path[256];
+                 int fd;
+                 int len;
+
+                 snprintf(path, sizeof path, "%s/%s", dir, file);
+
+                 fd = open(path, O_RDONLY);
+                 if (fd < 0)
+                                  return -1;
+
+                 len = read(fd, buf, size);
+
+                 close(fd);
+
+                 if (len > 0 && buf[len - 1] == '\n')
+                                  buf[--len] = '\0';
+
+                 return len;
+}
+#endif /* HAVE_IBV_READ_SYSFS_FILE */
+
+struct ibv_device *ibv_driver_init(const char *uverbs_sys_path,
+                                                                       int abi_version)
{
                 struct ehcau_device *my_dev = NULL;
-                 struct sysfs_device *sysfs_dev = NULL;
-                 struct sysfs_attribute *sysfs_attr = NULL;
-                 char *dev_name = NULL;
+                 char value[64];
                 int num_ports = 0;

                 EDEB_EN(7, "");

-                 /* check devices existence */
-                 sysfs_dev = sysfs_get_classdev_device(sysdev);
-                 if (sysfs_dev == NULL) {
-                                  return NULL;
-                 }

-                 sysfs_attr = sysfs_get_device_attr(sysfs_dev, "name");
-                 if (sysfs_attr == NULL) {
+                 if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor",
+                                                                    value, sizeof value) < 0)
                                  return NULL;
-                 }
-                 if (asprintf(&dev_name, "%s", sysfs_attr->value)<0) {
-                                  return NULL;
-                 }
-                 sysfs_close_attribute(sysfs_attr);
-                 if (strcmp("lhca", str_strip(dev_name)) != 0) {
-                                  free(dev_name);
+
+                 if (strcmp("lhca", str_strip(value)) != 0)
                                  return NULL;
-                 }
-                 free(dev_name);

-                 sysfs_attr = sysfs_get_device_attr(sysfs_dev, "num_ports");
-                 if (sysfs_attr == NULL) {
+                 if (ibv_read_sysfs_file(uverbs_sys_path, "device/num_ports",
+                                                                    value, sizeof value) < 0)
                                  return NULL;
-                 }
-                 sscanf(sysfs_attr->value, "%i", &num_ports);
-                 sysfs_close_attribute(sysfs_attr);
+
+                 sscanf(value, "%i", &num_ports);
                 if (num_ports<1) {
                                  return NULL;
                 }
@@ -188,7 +211,7 @@ struct ibv_device *openib_driver_init(st
                 my_dev = malloc(sizeof *my_dev);
                 if (!my_dev) {
                                  fprintf(stderr, "Fatal: couldn't allocate device for %s\n",
-                                                   sysdev->name);
+                                                   uverbs_sys_path);
                                  abort();
                 }

@@ -198,6 +221,18 @@ struct ibv_device *openib_driver_init(st
                 return &my_dev->ibv_dev;
}

+struct ibv_device *openib_driver_init(struct sysfs_class_device *sysdev)
+{
+                 int abi_ver = 0;
+                 char value[8];
+
+                 if (ibv_read_sysfs_file(sysdev->path, "abi_version",
+                                                                    value, sizeof value) > 0)
+                                  abi_ver = strtol(value, NULL, 10);
+
+                 return ibv_driver_init(sysdev->path, abi_ver);
+}
+
/** @brief module initialization
 */
int libehca_trlevel = 5;
--- src/userspace/libehca/src/libehca.map                 (revision 6541)
+++ src/userspace/libehca/src/libehca.map                 (working copy)
@@ -1,5 +1,6 @@
LIBEHCA_1.0 {
                 global:
+                                  ibv_driver_init;
                                  openib_driver_init;
                                   ehcau_query_qp;                
                                  ehcau_send_wr_trigger;

_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to