[stgt] [PATCH 2/2] dynamically link libibverbs and librdma
Doron Shoham
dorons at Voltaire.COM
Thu Oct 2 12:30:35 CEST 2008
dynamically link libibverbs and librdma for using
stgt without having userspace IB (e.g tcp mode).
Signed-off-by: Doron Shoham <dorons at voltaire.com>
---
usr/Makefile | 36 ++++++++++++++++-----
usr/iscsi/iscsi_rdma.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++
usr/iscsi/libtgt_rdma.c | 6 +++-
3 files changed, 109 insertions(+), 10 deletions(-)
create mode 100644 usr/iscsi/iscsi_rdma.c
diff --git a/usr/Makefile b/usr/Makefile
index 82ddf07..8867e43 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -1,4 +1,6 @@
mandir = /usr/share/man
+libdir = /usr/lib64
+bindir = /usr/sbin
ifneq ($(IBMVIO),)
CFLAGS += -DIBMVIO -DUSE_KERNEL
@@ -14,11 +16,16 @@ TGTD_OBJS += $(addprefix iscsi/, conn.o param.o session.o \
TGTD_OBJS += bs_rdwr.o bs_aio.o
LIBS += -lcrypto
-ifneq ($(ISCSI_RDMA),)
-CFLAGS += -DISCSI_RDMA
+
+ifneq ($(findstring verbs.h,$(wildcard /usr/include/infiniband/*.h)), )
+ifneq ($(findstring rdma_cma.h,$(wildcard /usr/include/rdma/*.h)), )
TGTD_OBJS += iscsi/iscsi_rdma.o
-LIBS += -libverbs -lrdmacm
+ISER_OBJS = iscsi/libtgt_rdma.o
+SO_NAME = libtgtrdma.so
+SO_LIBS = $(SO_NAME).0.0
+endif
endif
+
endif
ifneq ($(FCP),)
@@ -54,6 +61,7 @@ CFLAGS += -g -O2 -Wall -Wstrict-prototypes -fPIC
LIBS += -lpthread
+
PROGRAMS += tgtd tgtadm
SCRIPTS += ../scripts/tgt-setup-lun ../scripts/tgt-admin
TGTD_OBJS += tgtd.o mgmt.o target.o scsi.o log.o driver.o util.o work.o \
@@ -65,10 +73,10 @@ MANPAGES = ../doc/manpages/tgtadm.8 ../doc/manpages/tgt-admin.8 \
TGTD_DEP = $(TGTD_OBJS:.o=.d)
.PHONY:all
-all: $(PROGRAMS)
+all: $(PROGRAMS) $(SO_LIBS)
tgtd: $(TGTD_OBJS)
- $(CC) $^ -o $@ $(LIBS)
+ $(CC) -Xlinker -E $^ -o $@ $(LIBS)
-include $(TGTD_DEP)
@@ -81,10 +89,20 @@ tgtadm: tgtadm.o
$(CC) -c $(CFLAGS) $*.c -o $*.o
@$(CC) -MM $(CFLAGS) -MF $*.d -MT $*.o $*.c
+$(SO_LIBS): $(ISER_OBJS)
+ rm -f $@ $(SO_NAME)
+ $(LD) -shared -soname $(SO_LIBS) -o $(SO_LIBS) $(ISER_OBJS)
+ ln -s $(SO_LIBS) $(SO_NAME)
+
.PHONY: install
-install: $(PROGRAMS) $(SCRIPTS) install_doc
- install -d -m 755 $(DESTDIR)/usr/sbin
- install -m 755 $(PROGRAMS) $(SCRIPTS) $(DESTDIR)/usr/sbin
+install: $(PROGRAMS) $(SCRIPTS) install_doc install_lib
+ install -d -m 755 $(DESTDIR)$(bindir)
+ install -m 755 $(PROGRAMS) $(SCRIPTS) $(DESTDIR)$(bindir)
+
+install_lib: $(SO_LIBS)
+ rm -f $(DESTDIR)$(libdir)/$(SO_NAME)
+ install -m 755 $(SO_LIBS) $(DESTDIR)$(libdir)
+ ln -s $(DESTDIR)/usr/lib64/$(SO_LIBS) $(DESTDIR)$(libdir)/$(SO_NAME)
install_doc: $(MANPAGES)
install -d -m 755 $(DESTDIR)$(mandir)/man8
@@ -92,4 +110,4 @@ install_doc: $(MANPAGES)
.PHONY: clean
clean:
- rm -f *.[od] $(PROGRAMS) iscsi/*.[od] ibmvio/*.[od] fc/*.[od] fcoe/*.[od]
+ rm -f *.[od] $(PROGRAMS) $(SO_LIBS) iscsi/*.[od] ibmvio/*.[od] fc/*.[od] fcoe/*.[od]
diff --git a/usr/iscsi/iscsi_rdma.c b/usr/iscsi/iscsi_rdma.c
new file mode 100644
index 0000000..31b04a4
--- /dev/null
+++ b/usr/iscsi/iscsi_rdma.c
@@ -0,0 +1,77 @@
+/*
+ * iSCSI extensions for RDMA (iSER) data path
+ *
+ * Copyright (C) 2007 Dennis Dalessandro (dennis at osc.edu)
+ * Copyright (C) 2007 Ananth Devulapalli (ananth at osc.edu)
+ * Copyright (C) 2007 Pete Wyckoff (pw at osc.edu)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+#include <stdio.h>
+#include <dlfcn.h>
+#include <syslog.h>
+
+static void *pverbs;
+static void *prdma;
+static void *ptgtrdma;
+
+__attribute__((constructor)) static void iser_transport_init(void)
+{
+ void (*iser_init)(void);
+ char *error;
+
+ pverbs = dlopen("libibverbs.so",RTLD_NOW|RTLD_GLOBAL);
+ if (!pverbs) {
+ goto Exit; /* do not register iser transport */
+ }
+
+ prdma = dlopen("librdmacm.so",RTLD_NOW|RTLD_GLOBAL);
+ if (!prdma) {
+ goto Exit; /* do not register iser transport */
+ }
+
+ ptgtrdma = dlopen("libtgtrdma.so",RTLD_NOW|RTLD_GLOBAL);
+ if (!ptgtrdma) {
+ goto Exit;
+ }
+
+ dlerror(); /* Clear any existing error */
+ iser_init = dlsym(ptgtrdma, "iser_transport_init");
+ if ((error = dlerror()) != NULL) {
+ syslog(LOG_ERR, "%s\n", error);
+ goto Exit;
+ }
+
+ (*iser_init)();
+ return;
+Exit:
+ syslog(LOG_ERR, "%s - iser transport not used", dlerror());
+ if (pverbs)
+ dlclose(pverbs);
+ if (prdma)
+ dlclose(prdma);
+}
+
+__attribute__((destructor)) static void iser_transport_close(void)
+{
+ syslog(LOG_INFO, "iser transport cleanup");
+ if (pverbs)
+ dlclose(pverbs);
+ if (prdma)
+ dlclose(prdma);
+ if (ptgtrdma)
+ dlclose(ptgtrdma);
+}
diff --git a/usr/iscsi/libtgt_rdma.c b/usr/iscsi/libtgt_rdma.c
index d3b5147..d6ba5fa 100644
--- a/usr/iscsi/libtgt_rdma.c
+++ b/usr/iscsi/libtgt_rdma.c
@@ -30,6 +30,8 @@
#include <sys/epoll.h>
#include <infiniband/verbs.h>
#include <rdma/rdma_cma.h>
+#include <dlfcn.h>
+#include <syslog.h>
#include "util.h"
#include "iscsid.h"
@@ -1754,7 +1756,9 @@ static struct iscsi_transport iscsi_iser = {
.ep_getpeername = iscsi_rdma_getpeername,
};
-__attribute__((constructor)) static void iser_transport_init(void)
+void iser_transport_init(void)
{
+ syslog(LOG_INFO, "iser transport register");
iscsi_transport_register(&iscsi_iser);
+ return;
}
--
1.5.3.8
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list