[openib-general] [PATCH 7/7] libcxgb3: Update libcxgb3 for new libibverbs driver handling

Roland Dreier rolandd at cisco.com
Wed Jan 10 14:21:50 PST 2007


The latest libibverbs development tree changes how low-level drivers
are found.  The driver must be in a shared object like
libcxgb3-rdmav2.so in the ordinary library path, rather than
infiniband/cxgb3.so as for libibverbs 1.0.  In addition, the driver
must call ibv_register_driver() to pass its entry point to libibverbs,
rather than exporting an ibv_driver_init() function.

Since the current libcxgb3 tree is targeted only for libibverbs
development trees and won't work with libibverbs 1.0, this patch
changes libcxgb3 to work with the new libibverbs way of loading
drivers without any autoconf tests.

Signed-off-by: Roland Dreier <rolandd at cisco.com>
---
 Makefile.am      |   14 +++++++-------
 configure.in     |   13 +++++++++++++
 cxgb3.driver     |    1 +
 libcxgb3.spec.in |    7 ++++---
 src/iwch.c       |   27 ++++-----------------------
 5 files changed, 29 insertions(+), 33 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 8f3a679..3dab25e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,10 +1,8 @@
 # $Id: Makefile.am 3802 2005-10-18 18:32:06Z tom $
 
-cxgb3libdir = $(libdir)/infiniband
+lib_LTLIBRARIES = src/libcxgb3.la
 
-cxgb3lib_LTLIBRARIES = src/cxgb3.la
-
-src_cxgb3_la_CFLAGS = -g -Wall -D_GNU_SOURCE
+AM_CFLAGS = -g -Wall -D_GNU_SOURCE
 
 if HAVE_LD_VERSION_SCRIPT
     cxgb3_version_script = -Wl,--version-script=$(srcdir)/src/iwch.map
@@ -12,16 +10,18 @@ else
     cxgb3_version_script =
 endif
 
-src_cxgb3_la_SOURCES = src/cq.c src/iwch.c src/qp.c \
+src_libcxgb3_la_SOURCES = src/cq.c src/iwch.c src/qp.c \
     src/verbs.c
-src_cxgb3_la_LDFLAGS = -avoid-version -module \
+src_libcxgb3_la_LDFLAGS = -avoid-version -release @IBV_DEVICE_LIBRARY_EXTENSION@ \
     $(cxgb3_version_script)
+cxgb3confdir = $(sysconfdir)/libibverbs.d
+cxgb3conf_DATA = cxgb3.driver
 
 #DEBIAN = debian/changelog debian/compat debian/control debian/copyright \
 #    debian/libcxgb31.install debian/libcxgb3-dev.install debian/rules
 
 EXTRA_DIST = src/iwch.h src/iwch-abi.h \
-    src/iwch.map libcxgb3.spec.in $(DEBIAN)
+    src/iwch.map libcxgb3.spec.in cxgb3.driver
 
 dist-hook: libcxgb3.spec
 	cp libcxgb3.spec $(distdir)
diff --git a/configure.in b/configure.in
index d113da9..81b5a30 100644
--- a/configure.in
+++ b/configure.in
@@ -28,6 +28,19 @@ AC_C_CONST
 dnl Checks for library functions
 AC_CHECK_FUNCS(ibv_read_sysfs_file)
 
+dnl Now check if for libibverbs device library extension
+dummy=if$$
+cat <<IBV_VERSION > $dummy.c
+#include <infiniband/driver.h>
+IBV_DEVICE_LIBRARY_EXTENSION
+IBV_VERSION
+IBV_DEVICE_LIBRARY_EXTENSION=`$CC $CPPFLAGS -E $dummy.c 2> /dev/null | tail -1`
+rm -f $dummy.c
+if test $IBV_DEVICE_LIBRARY_EXTENSION = IBV_DEVICE_LIBRARY_EXTENSION; then
+    AC_MSG_ERROR([IBV_DEVICE_LIBRARY_EXTENSION not defined.  Is libibverbs new enough?])
+fi
+AC_SUBST(IBV_DEVICE_LIBRARY_EXTENSION)
+
 AC_CACHE_CHECK(whether ld accepts --version-script, ac_cv_version_script,
     if test -n "`$LD --help < /dev/null 2>/dev/null | grep version-script`"; then
         ac_cv_version_script=yes
diff --git a/cxgb3.driver b/cxgb3.driver
new file mode 100644
index 0000000..cfa6186
--- /dev/null
+++ b/cxgb3.driver
@@ -0,0 +1 @@
+driver cxgb3
diff --git a/libcxgb3.spec.in b/libcxgb3.spec.in
index e710808..959f659 100644
--- a/libcxgb3.spec.in
+++ b/libcxgb3.spec.in
@@ -39,18 +39,19 @@ make %{?_smp_mflags}
 rm -rf $RPM_BUILD_ROOT
 %makeinstall
 # remove unpackaged files from the buildroot
-rm -f $RPM_BUILD_ROOT%{_libdir}/infiniband/*.la
+rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
 
 %clean
 rm -rf $RPM_BUILD_ROOT
 
 %files
 %defattr(-,root,root,-)
-%{_libdir}/infiniband/cxgb3.so
+%{_libdir}/libcxgb3*.so
 %doc AUTHORS COPYING ChangeLog README
+%config %{_sysconfdir}/libibverbs.d/cxgb3.driver
 
 %files devel
 %defattr(-,root,root,-)
-%{_libdir}/infiniband/cxgb3.a
+%{_libdir}/libcxgb3*.a
 
 %changelog
diff --git a/src/iwch.c b/src/iwch.c
index 17f1d61..e972460 100644
--- a/src/iwch.c
+++ b/src/iwch.c
@@ -41,16 +41,6 @@
 #include <sys/mman.h>
 #include <pthread.h>
 
-#ifdef HAVE_SYSFS_LIBSYSFS_H
-#include <sysfs/libsysfs.h>
-#endif
-
-#ifndef HAVE_IBV_READ_SYSFS_FILE
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#endif
-
 #include "iwch.h"
 #include "iwch-abi.h"
 
@@ -173,8 +163,8 @@ static struct ibv_device_ops iwch_dev_ops = {
 	.free_context = iwch_free_context
 };
 
-struct ibv_device *ibv_driver_init(const char *uverbs_sys_path,
-				   int abi_version)
+static struct ibv_device *cxgb3_driver_init(const char *uverbs_sys_path,
+					    int abi_version)
 {
 	char value[16];
 	char s[32];
@@ -251,16 +241,7 @@ err1:
 	return NULL;
 }
 
-#ifdef HAVE_SYSFS_LIBSYSFS_H
-struct ibv_device *openib_driver_init(struct sysfs_class_device *sysdev)
+static __attribute__((constructor)) void cxgb3_register_driver(void)
 {
-	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);
+	ibv_register_driver("cxgb3", cxgb3_driver_init);
 }
-#endif /* HAVE_SYSFS_LIBSYSFS_H */
-- 
1.4.4.1





More information about the general mailing list