The latest libibverbs development tree changes how low-level drivers
are found.  The driver must be in a shared object like
libehca-rdmav2.so in the ordinary library path, rather than
infiniband/libehca.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.

This patch adds autoconf tests to libehca to detect whether it is
being built against a stable libibverbs 1.0 tree or the new libibverbs
development tree.  Then based on the result, it builds a library with
the appropriate name and with the correct driver initialization handling.

Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 Makefile.am      |   30 +++++++++++++++++++-----------
 config.h.in      |    6 +++---
 configure.in     |   15 +++++++++++++--
 ehca.driver      |    1 +
 src/ehca_uinit.c |   12 +++++++++---
 5 files changed, 45 insertions(+), 19 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 46d639c..ca44a45 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -37,18 +37,25 @@
 #  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 #  POSSIBILITY OF SUCH DAMAGE.
     
+AM_CFLAGS = -O2 -g -Wall -D_GNU_SOURCE -DP_SERIES -Isrc
 
-ehcalibdir = $(libdir)/infiniband
+EHCA_SOURCES = src/ehca_umain.c src/ehca_u_mrmw.c src/ehca_uinit.c \
+       src/ehca_ureqs.c src/hcp_phyp.c
 
-ehcalib_LTLIBRARIES = src/libehca.la
-
-src_libehca_la_SOURCES = src/ehca_umain.c src/ehca_u_mrmw.c src/ehca_uinit.c 
src/ehca_ureqs.c  src/hcp_phyp.c
-
-src_libehca_la_CFLAGS = -O2 -g -Wall  -D_GNU_SOURCE -DP_SERIES 
-I../libibverbs/include -Isrc
-
-src_libehca_la_LDFLAGS = -version-info 1 -export-dynamic \
-                       -Wl,--version-script=$(srcdir)/src/libehca.map \
-                       -lpthread -libverbs -nostdlib
+if HAVE_IBV_DEVICE_LIBRARY_EXTENSION
+    lib_LTLIBRARIES = src/libehca.la
+    src_libehca_la_SOURCES = $(EHCA_SOURCES)
+    src_libehca_la_LDFLAGS = -avoid-version -release 
@IBV_DEVICE_LIBRARY_EXTENSION@ \
+                               -Wl,--version-script=$(srcdir)/src/libehca.map \
+                               -lpthread -libverbs -nostdlib
+else
+    ehcalibdir = $(libdir)/infiniband
+    ehcalib_LTLIBRARIES = src/libehca.la
+    src_libehca_la_SOURCES = $(EHCA_SOURCES)
+    src_libehca_la_LDFLAGS = -version-info 1 -export-dynamic \
+                               -Wl,--version-script=$(srcdir)/src/libehca.map \
+                               -lpthread -libverbs -nostdlib
+endif
 
 EXTRA_DIST = src/ehca_asm.h \
        src/ehca_galpa.h \
@@ -59,7 +66,8 @@ EXTRA_DIST = src/ehca_asm.h \
        src/ehca_qes.h \
        src/ehca_utools.h \
        src/hipz_hw.h \
-       src/libehca.map
+       src/libehca.map \
+       src/ehca.driver
 
 # dist-hook: libehca.spec
 #     cp libehca.spec $(distdir)
diff --git a/config.h.in b/config.h.in
index 03adb6e..add7607 100644
--- a/config.h.in
+++ b/config.h.in
@@ -6,6 +6,9 @@
 /* Define to 1 if you have the `ibv_read_sysfs_file' function. */
 #undef HAVE_IBV_READ_SYSFS_FILE
 
+/* Define to 1 if you have the `ibv_register_driver' function. */
+#undef HAVE_IBV_REGISTER_DRIVER
+
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
@@ -27,9 +30,6 @@
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
 
-/* Define to 1 if you have the <sysfs/libsysfs.h> header file. */
-#undef HAVE_SYSFS_LIBSYSFS_H
-
 /* Define to 1 if you have the <sys/stat.h> header file. */
 #undef HAVE_SYS_STAT_H
 
diff --git a/configure.in b/configure.in
index 21f97ff..591b9b0 100644
--- a/configure.in
+++ b/configure.in
@@ -30,9 +30,20 @@ AC_CHECK_HEADER(infiniband/driver.h, [],
     AC_MSG_ERROR([<infiniband/driver.h> not found.  libehca requires 
libibverbs.]))
 
 dnl Checks for library functions
-AC_CHECK_FUNCS(ibv_read_sysfs_file)
+AC_CHECK_FUNCS(ibv_read_sysfs_file ibv_register_driver)
+
+dnl Now check if for libibverbs 1.0 vs 1.1
+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
+AM_CONDITIONAL(HAVE_IBV_DEVICE_LIBRARY_EXTENSION,
+    test $IBV_DEVICE_LIBRARY_EXTENSION != IBV_DEVICE_LIBRARY_EXTENSION)
+AC_SUBST(IBV_DEVICE_LIBRARY_EXTENSION)
 fi
-AC_CHECK_HEADERS(sysfs/libsysfs.h)
 
 dnl Checks for programs.
 AC_PROG_CC
diff --git a/ehca.driver b/ehca.driver
new file mode 100644
index 0000000..b0000e4
--- /dev/null
+++ b/ehca.driver
@@ -0,0 +1 @@
+driver ehca
diff --git a/src/ehca_uinit.c b/src/ehca_uinit.c
index 4618601..47866cf 100644
--- a/src/ehca_uinit.c
+++ b/src/ehca_uinit.c
@@ -184,8 +184,8 @@ static int ibv_read_sysfs_file(const char *dir, const char 
*file,
 }
 #endif /* HAVE_IBV_READ_SYSFS_FILE */
 
-struct ibv_device *ibv_driver_init(const char *uverbs_sys_path,
-                                  int abi_version)
+static struct ibv_device *ehca_driver_init(const char *uverbs_sys_path,
+                                          int abi_version)
 {
        struct ehcau_device *my_dev = NULL;
        char value[64];
@@ -225,6 +225,7 @@ struct ibv_device *ibv_driver_init(const char 
*uverbs_sys_path,
        return &my_dev->ibv_dev;
 }
 
+#ifndef HAVE_IBV_REGISTER_DRIVER
 struct ibv_device *openib_driver_init(struct sysfs_class_device *sysdev)
 {
        int abi_ver = 0;
@@ -234,8 +235,9 @@ struct ibv_device *openib_driver_init(struct 
sysfs_class_device *sysdev)
                                value, sizeof value) > 0)
                abi_ver = strtol(value, NULL, 10);
 
-       return ibv_driver_init(sysdev->path, abi_ver);
+       return ehca_driver_init(sysdev->path, abi_ver);
 }
+#endif /* HAVE_IBV_REGISTER_DRIVER */
 
 /** @brief module initialization
  */
@@ -328,6 +330,10 @@ void __attribute__ ((constructor)) ehcau_init(void)
        } else {
                fprintf(libehca_fh, "tracelevel is:%i\n", libehca_trlevel);
        }
+
+#ifdef HAVE_IBV_REGISTER_DRIVER
+       ibv_register_driver("ehca", ehca_driver_init);
+#endif
 }
 
 /* eof ehca_uinit.c */
-- 
1.4.4.1


_______________________________________________
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