The latest libibverbs development tree changes how low-level drivers
are found.  The driver must be in a shared object like
libipathverbs-rdmav2.so in the ordinary library path, rather than
infiniband/ipathverbs.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 libipathverbs tree is targeted only for libibverbs
development trees and won't work with libibverbs 1.0, this patch
changes libipathverbs to work with the new libibverbs way of loading
drivers without any autoconf tests.

Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 Makefile.am           |   15 ++++++++-------
 configure.in          |   13 +++++++++++++
 ipathverbs.driver     |    1 +
 libipathverbs.spec.in |    5 +++--
 src/ipathverbs.c      |    9 +++++++--
 5 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index f86e1e2..c1ef44f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -32,11 +32,9 @@
 # combinations of this program with other software, or any other
 # product whatsoever.
 
-ipathverbslibdir = $(libdir)/infiniband
+lib_LTLIBRARIES = src/libipathverbs.la
 
-ipathverbslib_LTLIBRARIES = src/ipathverbs.la
-
-src_ipathverbs_la_CFLAGS = -Wall -D_GNU_SOURCE
+AM_CFLAGS = -Wall -D_GNU_SOURCE
 
 if HAVE_LD_VERSION_SCRIPT
     ipathverbs_version_script = 
-Wl,--version-script=$(srcdir)/src/ipathverbs.map
@@ -44,14 +42,17 @@ else
     ipathverbs_version_script =
 endif
 
-src_ipathverbs_la_SOURCES = src/ipathverbs.c src/verbs.c
-src_ipathverbs_la_LDFLAGS = -avoid-version -module \
+src_libipathverbs_la_SOURCES = src/ipathverbs.c src/verbs.c
+src_libipathverbs_la_LDFLAGS = -avoid-version -release 
@IBV_DEVICE_LIBRARY_EXTENSION@ \
     $(ipathverbs_version_script)
+ipathverbsconfdir = $(sysconfdir)/libibverbs.d
+ipathverbsconf_DATA = ipathverbs.driver
 
 EXTRA_DIST = src/ipathverbs.h \
     src/ipath-abi.h \
     src/ipathverbs.map \
-    libipathverbs.spec.in
+    libipathverbs.spec.in \
+    ipathverbs.driver
 
 dist-hook: libipathverbs.spec
        cp libipathverbs.spec $(distdir)
diff --git a/configure.in b/configure.in
index 727cd65..ab1a86e 100644
--- a/configure.in
+++ b/configure.in
@@ -56,6 +56,19 @@ dnl Checks for typedefs, structures, and compiler 
characteristics.
 AC_C_CONST
 AC_CHECK_SIZEOF(long)
 
+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/ipathverbs.driver b/ipathverbs.driver
new file mode 100644
index 0000000..d212578
--- /dev/null
+++ b/ipathverbs.driver
@@ -0,0 +1 @@
+driver ipathverbs
diff --git a/libipathverbs.spec.in b/libipathverbs.spec.in
index 4726102..1a4b2bd 100644
--- a/libipathverbs.spec.in
+++ b/libipathverbs.spec.in
@@ -77,9 +77,10 @@ rm -rf $RPM_BUILD_ROOT
 
 %files
 %defattr(-,root,root)
-%{_libdir}/infiniband/ipathverbs.so
+%{_libdir}/libipathverbs*.so
 %doc AUTHORS COPYING
+%config %{_sysconfdir}/libibverbs.d/ipathverbs.driver
 
 %files devel
 %defattr(-,root,root,-)
-%{_libdir}/infiniband/ipathverbs.a
+%{_libdir}/infiniband/libipathverbs*.a
diff --git a/src/ipathverbs.c b/src/ipathverbs.c
index d9fadca..22f2f48 100644
--- a/src/ipathverbs.c
+++ b/src/ipathverbs.c
@@ -165,8 +165,8 @@ static struct ibv_device_ops ipath_dev_ops = {
        .free_context   = ipath_free_context
 };
 
-struct ibv_device *ibv_driver_init(const char *uverbs_sys_path,
-                                  int abi_version)
+static struct ibv_device *ipathverbs_driver_init(const char *uverbs_sys_path,
+                                                int abi_version)
 {
        char                    value[8];
        struct ipath_device    *dev;
@@ -204,3 +204,8 @@ found:
 
        return &dev->ibv_dev;
 }
+
+static __attribute__((constructor)) void ipathverbs_register_driver(void)
+{
+       ibv_register_driver("ipathverbs", ipathverbs_driver_init);
+}
-- 
1.4.4.1


_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

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

Reply via email to