[scsi-target-utils] fix dynamic patch
Andy Grover
grover at fedoraproject.org
Tue Feb 22 23:18:02 UTC 2011
commit 14f9b2359ed3bc3cdaf38f08dfc7769ebc552c0d
Author: Andy Grover <agrover at redhat.com>
Date: Tue Feb 22 12:18:54 2011 -0800
fix dynamic patch
scsi-target-utils-dynamic-link-iser.patch | 313 +++++++----------------------
1 files changed, 69 insertions(+), 244 deletions(-)
---
diff --git a/scsi-target-utils-dynamic-link-iser.patch b/scsi-target-utils-dynamic-link-iser.patch
index 7349a0f..fd07a60 100644
--- a/scsi-target-utils-dynamic-link-iser.patch
+++ b/scsi-target-utils-dynamic-link-iser.patch
@@ -1,27 +1,26 @@
diff --git a/usr/Makefile b/usr/Makefile
-index 2dcae2a..fc88d47 100644
+index 3a75df4..10a2386 100644
--- a/usr/Makefile
+++ b/usr/Makefile
-@@ -17,10 +17,11 @@ TGTD_OBJS += $(addprefix iscsi/, conn.o param.o session.o \
+@@ -19,9 +19,11 @@ TGTD_OBJS += $(addprefix iscsi/, conn.o param.o session.o \
isns.o)
TGTD_OBJS += bs_rdwr.o bs_aio.o
-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
+ TGTD_OBJS += iscsi/iser.o iscsi/iser_text.o
-LIBS += -libverbs -lrdmacm
+LIBS += -libverbs -lrdmacm -ldl
+endif
endif
- endif
-diff --git a/usr/iscsi/iscsi_rdma.c b/usr/iscsi/iscsi_rdma.c
-index 6cf5677..72e4eaf 100644
---- a/usr/iscsi/iscsi_rdma.c
-+++ b/usr/iscsi/iscsi_rdma.c
-@@ -30,6 +30,8 @@
+ ifneq ($(FCP),)
+diff --git a/usr/iscsi/iser.c b/usr/iscsi/iser.c
+index 926832b..f032a6e 100644
+--- a/usr/iscsi/iser.c
++++ b/usr/iscsi/iser.c
+@@ -32,6 +32,8 @@
#include <sys/epoll.h>
#include <infiniband/verbs.h>
#include <rdma/rdma_cma.h>
@@ -30,45 +29,44 @@ index 6cf5677..72e4eaf 100644
#include "util.h"
#include "iscsid.h"
-@@ -283,6 +285,67 @@ static void iser_sched_poll_cq(struct event_data *tev);
- static void iser_sched_consume_cq(struct event_data *tev);
- static void iser_sched_tx(struct event_data *evt);
+@@ -92,6 +94,86 @@ struct iscsi_sense_data {
+ uint8_t data[0];
+ } __packed;
-+
++/* handle dynamic loading of ib libs */
+static void *pverbs;
+static void *prdma;
+typedef void (*ibv_ack_cq_events_t)(struct ibv_cq *cq, unsigned int nevents);
+typedef struct ibv_pd *(*ibv_alloc_pd_t)(struct ibv_context *context);
+typedef struct ibv_comp_channel *(*ibv_create_comp_channel_t)(struct ibv_context *context);
+typedef struct ibv_cq *(*ibv_create_cq_t)(struct ibv_context *context, int cqe,
-+ void *cq_context,
-+ struct ibv_comp_channel *channel,
-+ int comp_vector);
++ void *cq_context,
++ struct ibv_comp_channel *channel,
++ int comp_vector);
+typedef int (*ibv_dereg_mr_t)(struct ibv_mr *mr);
+typedef int (*ibv_destroy_qp_t)(struct ibv_qp *qp);
+typedef int (*ibv_get_cq_event_t)(struct ibv_comp_channel *channel,
-+ struct ibv_cq **cq, void **cq_context);
++ struct ibv_cq **cq, void **cq_context);
+typedef int (*ibv_query_device_t)(struct ibv_context *context,
-+ struct ibv_device_attr *device_attr);
++ struct ibv_device_attr *device_attr);
+typedef struct ibv_mr *(*ibv_reg_mr_t)(struct ibv_pd *pd, void *addr,
-+ size_t length, enum ibv_access_flags access);
++ size_t length, enum ibv_access_flags access);
+typedef int (*rdma_ack_cm_event_t)(struct rdma_cm_event *event);
+typedef int (*rdma_bind_addr_t)(struct rdma_cm_id *id, struct sockaddr *addr);
+typedef struct rdma_event_channel *(*rdma_create_event_channel_t)(void);
+typedef int (*rdma_create_id_t)(struct rdma_event_channel *channel,
-+ struct rdma_cm_id **id, void *context,
-+ enum rdma_port_space ps);
++ struct rdma_cm_id **id, void *context,
++ enum rdma_port_space ps);
+typedef int (*rdma_create_qp_t)(struct rdma_cm_id *id, struct ibv_pd *pd,
-+ struct ibv_qp_init_attr *qp_init_attr);
++ struct ibv_qp_init_attr *qp_init_attr);
+typedef int (*rdma_destroy_id_t)(struct rdma_cm_id *id);
+typedef int (*rdma_disconnect_t)(struct rdma_cm_id *id);
+typedef int (*rdma_get_cm_event_t)(struct rdma_event_channel *channel,
-+ struct rdma_cm_event **event);
++ struct rdma_cm_event **event);
+typedef int (*rdma_listen_t)(struct rdma_cm_id *id, int backlog);
+typedef int (*rdma_accept_t)(struct rdma_cm_id *id, struct rdma_conn_param *conn_param);
+typedef int (*rdma_reject_t)(struct rdma_cm_id *id, const void *private_data,
-+ uint8_t private_data_len);
-+
++ uint8_t private_data_len);
+typedef struct {
+ ibv_ack_cq_events_t ibv_ack_cq_events;
+ ibv_alloc_pd_t ibv_alloc_pd;
@@ -94,217 +92,35 @@ index 6cf5677..72e4eaf 100644
+
+static tgt_fptr_t tgt_fptr;
+
++#define ibv_ack_cq_events(x...) tgt_fptr.ibv_ack_cq_events(x)
++#define ibv_alloc_pd(x...) tgt_fptr.ibv_alloc_pd(x)
++#define ibv_create_comp_channel(x...) tgt_fptr.ibv_create_comp_channel(x)
++#define ibv_create_cq(x...) tgt_fptr.ibv_create_cq(x)
++#define ibv_dereg_mr(x...) tgt_fptr.ibv_dereg_mr(x)
++#define ibv_destroy_qp(x...) tgt_fptr.ibv_destroy_qp(x)
++#define ibv_get_cq_event(x...) tgt_fptr.ibv_get_cq_event(x)
++#define ibv_query_device(x...) tgt_fptr.ibv_query_device(x)
++#define ibv_reg_mr(x...) tgt_fptr.ibv_reg_mr(x)
++#define rdma_ack_cm_event(x...) tgt_fptr.rdma_ack_cm_event(x)
++#define rdma_bind_addr(x...) tgt_fptr.rdma_bind_addr(x)
++#define rdma_create_event_channel(x...) tgt_fptr.rdma_create_event_channel(x)
++#define rdma_create_id(x...) tgt_fptr.rdma_create_id(x)
++#define rdma_create_qp(x...) tgt_fptr.rdma_create_qp(x)
++#define rdma_destroy_id(x...) tgt_fptr.rdma_destroy_id(x)
++#define rdma_disconnect(x...) tgt_fptr.rdma_disconnect(x)
++#define rdma_get_cm_event(x...) tgt_fptr.rdma_get_cm_event(x)
++#define rdma_listen(x...) tgt_fptr.rdma_listen(x)
++#define rdma_accept(x...) tgt_fptr.rdma_accept(x)
++#define rdma_reject(x...) tgt_fptr.rdma_reject(x)
+
/*
- * Called when ready for full feature, builds resources.
- */
-@@ -308,7 +371,7 @@ static int iser_init_comm(struct conn_info *conn)
- goto out;
- }
-
-- conn->srmr = ibv_reg_mr(conn->dev->pd, conn->srbuf, size,
-+ conn->srmr = tgt_fptr.ibv_reg_mr(conn->dev->pd, conn->srbuf, size,
- IBV_ACCESS_LOCAL_WRITE);
- if (!conn->srmr) {
- eprintf("register srbuf\n");
-@@ -415,7 +478,7 @@ static int iser_init_comm_login(struct conn_info *conn)
- goto out;
- }
-
-- conn->srmr_login = ibv_reg_mr(conn->dev->pd, conn->srbuf_login, size,
-+ conn->srmr_login = tgt_fptr.ibv_reg_mr(conn->dev->pd, conn->srbuf_login, size,
- IBV_ACCESS_LOCAL_WRITE);
- if (!conn->srmr_login) {
- eprintf("ibv_reg_mr srbuf failed\n");
-@@ -495,7 +558,7 @@ static void iser_free_comm(struct conn_info *ci)
-
- /* release mr and free the lists */
- dprintf("dereg mr %p\n", ci->srmr);
-- ret = ibv_dereg_mr(ci->srmr);
-+ ret = tgt_fptr.ibv_dereg_mr(ci->srmr);
- if (ret)
- eprintf("ibv_dereg_mr\n");
- free(ci->srbuf);
-@@ -515,7 +578,7 @@ static void iser_free_comm_login(struct conn_info *ci)
- dprintf("freeing, login phase %d\n", ci->login_phase);
-
- /* release mr and free the lists */
-- ret = ibv_dereg_mr(ci->srmr_login);
-+ ret = tgt_fptr.ibv_dereg_mr(ci->srmr_login);
- if (ret)
- eprintf("ibv_dereg_mr\n");
- free(ci->srbuf_login);
-@@ -546,7 +609,7 @@ static int iser_init_mempool(struct iser_device *dev)
- return -ENOMEM;
- }
-
-- dev->mempool_mr = ibv_reg_mr(dev->pd, regbuf,
-+ dev->mempool_mr = tgt_fptr.ibv_reg_mr(dev->pd, regbuf,
- mempool_num * mempool_size,
- IBV_ACCESS_LOCAL_WRITE);
- if (!dev->mempool_mr) {
-@@ -583,7 +646,7 @@ static int iser_device_init(struct iser_device *dev)
- int ret = -1;
-
- dprintf("dev %p\n", dev);
-- dev->pd = ibv_alloc_pd(dev->ibv_hndl);
-+ dev->pd = tgt_fptr.ibv_alloc_pd(dev->ibv_hndl);
- if (dev->pd == NULL) {
- eprintf("ibv_alloc_pd failed\n");
- goto out;
-@@ -595,7 +658,7 @@ static int iser_device_init(struct iser_device *dev)
- goto out;
- }
-
-- ret = ibv_query_device(dev->ibv_hndl, &device_attr);
-+ ret = tgt_fptr.ibv_query_device(dev->ibv_hndl, &device_attr);
- if (ret < 0) {
- eprintf("ibv_query_device: %m\n");
- goto out;
-@@ -604,13 +667,13 @@ static int iser_device_init(struct iser_device *dev)
- dprintf("max %d CQEs\n", cqe_num);
-
- ret = -1;
-- dev->cq_channel = ibv_create_comp_channel(dev->ibv_hndl);
-+ dev->cq_channel = tgt_fptr.ibv_create_comp_channel(dev->ibv_hndl);
- if (dev->cq_channel == NULL) {
- eprintf("ibv_create_comp_channel failed: %m\n");
- goto out;
- }
-
-- dev->cq = ibv_create_cq(dev->ibv_hndl, cqe_num, NULL,
-+ dev->cq = tgt_fptr.ibv_create_cq(dev->ibv_hndl, cqe_num, NULL,
- dev->cq_channel, 0);
- if (dev->cq == NULL) {
- eprintf("ibv_create_cq failed: %m\n");
-@@ -729,7 +792,7 @@ static void iser_accept_connection(struct rdma_cm_event *event)
- /* only generate completion queue entries if requested */
- qp_init_attr.sq_sig_all = 0;
-
-- ret = rdma_create_qp(ci->cma_id, dev->pd, &qp_init_attr);
-+ ret = tgt_fptr.rdma_create_qp(ci->cma_id, dev->pd, &qp_init_attr);
- if (ret) {
- eprintf("create qp failed\n");
- goto free_conn;
-@@ -759,7 +822,7 @@ static void iser_accept_connection(struct rdma_cm_event *event)
- }
-
- /* now we can actually accept the connection */
-- ret = rdma_accept(ci->cma_id, &conn_param);
-+ ret = tgt_fptr.rdma_accept(ci->cma_id, &conn_param);
- if (ret) {
- eprintf("rdma_accept failed\n");
- iser_free_comm_login(ci);
-@@ -772,7 +835,7 @@ free_conn:
- conn_exit(conn);
- free(ci);
- reject:
-- ret = rdma_reject(event->id, NULL, 0);
-+ ret = tgt_fptr.rdma_reject(event->id, NULL, 0);
- if (ret)
- eprintf("rdma_reject failed: %s\n", strerror(-ret));
+ * Number of allocatable data buffers, each of this size. Do at least 128
+ * for linux iser. The membuf size is rounded up at initialization time
+@@ -3318,10 +3400,94 @@ static void iser_nop_work_handler(void *data)
+ add_work(&nop_work, ISER_TIMER_INT_SEC);
}
-@@ -836,7 +899,7 @@ static void iser_handle_rdmacm(int fd __attribute__((unused)),
- struct rdma_cm_id *destroy_cm_id = NULL;
- dprintf("entry\n");
-- ret = rdma_get_cm_event(rdma_evt_channel, &event);
-+ ret = tgt_fptr.rdma_get_cm_event(rdma_evt_channel, &event);
- if (ret) {
- eprintf("rdma_get_cm_event failed\n");
- return;
-@@ -859,14 +922,14 @@ static void iser_handle_rdmacm(int fd __attribute__((unused)),
- break;
- }
-
-- ret = rdma_ack_cm_event(event);
-+ ret = tgt_fptr.rdma_ack_cm_event(event);
- if (ret) {
- eprintf("ack cm event failed\n");
- return;
- }
-
- if (destroy_cm_id) {
-- ret = rdma_destroy_id(destroy_cm_id);
-+ ret = tgt_fptr.rdma_destroy_id(destroy_cm_id);
- if (ret)
- eprintf("rdma_destroy_id failed\n");
- }
-@@ -1089,13 +1152,13 @@ static void iser_cqe_handler(int fd __attribute__((unused)),
- void *cq_context;
- int ret;
-
-- ret = ibv_get_cq_event(dev->cq_channel, &dev->cq, &cq_context);
-+ ret = tgt_fptr.ibv_get_cq_event(dev->cq_channel, &dev->cq, &cq_context);
- if (ret != 0) {
- eprintf("notification, but no CQ event\n");
- exit(1);
- }
-
-- ibv_ack_cq_events(dev->cq, 1);
-+ tgt_fptr.ibv_ack_cq_events(dev->cq, 1);
-
- /* if a poll was previosuly scheduled, remove it,
- as it will be scheduled when necessary */
-@@ -1148,14 +1211,14 @@ static int iscsi_rdma_init(void)
- struct sockaddr_in sock_addr;
- short int port = iscsi_listen_port;
-
-- rdma_evt_channel = rdma_create_event_channel();
-+ rdma_evt_channel = tgt_fptr.rdma_create_event_channel();
-
- if (!rdma_evt_channel) {
- eprintf("cannot initialize RDMA; load kernel modules?\n");
- return -1;
- }
-
-- ret = rdma_create_id(rdma_evt_channel, &cma_listen_id, NULL,
-+ ret = tgt_fptr.rdma_create_id(rdma_evt_channel, &cma_listen_id, NULL,
- RDMA_PS_TCP);
- if (ret) {
- eprintf("rdma_create_id: %s\n", strerror(ret));
-@@ -1166,7 +1229,7 @@ static int iscsi_rdma_init(void)
- sock_addr.sin_family = AF_INET;
- sock_addr.sin_port = htons(port);
- sock_addr.sin_addr.s_addr = INADDR_ANY;
-- ret = rdma_bind_addr(cma_listen_id, (struct sockaddr *) &sock_addr);
-+ ret = tgt_fptr.rdma_bind_addr(cma_listen_id, (struct sockaddr *) &sock_addr);
- if (ret) {
- if (ret == -1)
- eprintf("rdma_bind_addr -1: %m\n");
-@@ -1176,7 +1239,7 @@ static int iscsi_rdma_init(void)
- }
-
- /* 0 == maximum backlog */
-- ret = rdma_listen(cma_listen_id, 0);
-+ ret = tgt_fptr.rdma_listen(cma_listen_id, 0);
- if (ret) {
- if (ret == -1)
- eprintf("rdma_listen -1: %m\n");
-@@ -1574,7 +1637,7 @@ static size_t iscsi_rdma_close(struct iscsi_connection *conn)
- struct conn_info *ci = RDMA_CONN(conn);
- int ret;
-
-- ret = rdma_disconnect(ci->cma_id);
-+ ret = tgt_fptr.rdma_disconnect(ci->cma_id);
- if (ret)
- eprintf("rdma_disconnect: %s\n", strerror(-ret));
- dprintf("did rdma_disconnect\n");
-@@ -1607,7 +1670,7 @@ static void iscsi_rdma_release(struct iscsi_connection *conn)
- iser_free_comm(ci);
-
- /* finally destory QP */
-- ret = ibv_destroy_qp(ci->qp_hndl);
-+ ret = tgt_fptr.ibv_destroy_qp(ci->qp_hndl);
- if (ret)
- eprintf("ibv_destroy_qp: %s\n", strerror(-ret));
-
-@@ -1744,7 +1807,112 @@ static struct iscsi_transport iscsi_iser = {
- .ep_getpeername = iscsi_rdma_getpeername,
- };
-
-+
-+int is_dlerror(const char *symbol)
++static int is_dlerror(const char *symbol)
+{
+ char *error;
+
@@ -315,10 +131,10 @@ index 6cf5677..72e4eaf 100644
+ return 0;
+}
+
-+
-+
- __attribute__((constructor)) static void iser_transport_init(void)
+ static int iser_init(int index, char *args)
{
+ int err;
+
+ pverbs = dlopen("libibverbs.so",RTLD_LAZY);
+ if (!pverbs) {
+ goto Exit; /* do not register iser transport */
@@ -391,9 +207,14 @@ index 6cf5677..72e4eaf 100644
+ if (is_dlerror("rdma_reject"))
+ goto Exit;
+
-+ syslog(LOG_INFO, "iser transport register");
- iscsi_transport_register(&iscsi_iser);
-+ return;
++
+ err = iser_ib_init();
+ if (err)
+ return err;
+@@ -3334,12 +3500,25 @@ static int iser_init(int index, char *args)
+ }
+
+ return 0;
+
+Exit:
+ syslog(LOG_ERR, "%s - iser transport not used", dlerror());
@@ -401,14 +222,18 @@ index 6cf5677..72e4eaf 100644
+ dlclose(pverbs);
+ if (prdma)
+ dlclose(prdma);
++ return -ENOTSUP;
}
+
+ static void iser_exit(void)
+ {
+ if (iser_send_nop)
+ del_work(&nop_work);
+
-+__attribute__((destructor)) static void iser_transport_close(void)
-+{
-+ syslog(LOG_INFO, "iser transport register");
+ if (pverbs)
+ dlclose(pverbs);
+ if (prdma)
+ dlclose(prdma);
-+}
-+
+ }
+
+ static int iser_target_create(struct target *t)
More information about the scm-commits
mailing list