[openib-general] [PATCH 5/7] libehca: Update libehca 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
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 <rolandd at cisco.com>
---
 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





More information about the general mailing list