From c4118a072e98909fb95199158ed1b1d66cf421ee Mon Sep 17 00:00:00 2001 From: Ned Bass Date: Wed, 19 Oct 2011 14:47:50 -0700 Subject: [PATCH] LU-778 o2iblnd: Add rdma_create_id() compatibility macro As of RHEL6.2 kernel 2.6.32-204.el6, rdma_create_id() requires a queue-pair type as a fourth argument. This was previously inferred from the rdma_port_space argument. Add an autoconf test to detect whether the fourth argument is expected and a compatibility macro that discards the QP type argument if the 3-argument version of rdma_create_id() is present. Change-Id: Idb668e1f059954ecc994ad59b366d54da8b82dc8 Signed-off-by: Ned Bass Reviewed-on: http://review.whamcloud.com/1556 Tested-by: Hudson Reviewed-by: Brian Behlendorf Reviewed-by: Christopher J. Morrone Tested-by: Maloo Reviewed-by: Yang Sheng Reviewed-by: Oleg Drokin --- lnet/autoconf/lustre-lnet.m4 | 18 ++++++++++++++++++ lnet/klnds/o2iblnd/o2iblnd.c | 7 ++++--- lnet/klnds/o2iblnd/o2iblnd.h | 6 ++++++ lnet/klnds/o2iblnd/o2iblnd_cb.c | 4 +++- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/lnet/autoconf/lustre-lnet.m4 b/lnet/autoconf/lustre-lnet.m4 index ca7f785..1a070ac 100644 --- a/lnet/autoconf/lustre-lnet.m4 +++ b/lnet/autoconf/lustre-lnet.m4 @@ -356,6 +356,20 @@ AC_SUBST(MXLND) # LN_CONFIG_O2IB # AC_DEFUN([LN_CONFIG_O2IB],[ + +# In RHEL 6.2, rdma_create_id() takes the queue-pair type as a fourth argument +AC_MSG_CHECKING([if rdma_create_id wants four args]) +LB_LINUX_TRY_COMPILE([ + #include +],[ + rdma_create_id(NULL, NULL, 0, 0); +],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_RDMA_CREATE_ID_4ARG, 1, [rdma_create_id wants 4 args]) +],[ + AC_MSG_RESULT([no]) +]) + AC_MSG_CHECKING([whether to enable OpenIB gen2 support]) # set default AC_ARG_WITH([o2ib], @@ -426,7 +440,11 @@ else struct ib_pool_fmr pool_fmr; enum ib_cm_rej_reason rej_reason; + #ifdef HAVE_RDMA_CREATE_ID_4ARG + cm_id = rdma_create_id(NULL, NULL, RDMA_PS_TCP, 0); + #else cm_id = rdma_create_id(NULL, NULL, RDMA_PS_TCP); + #endif return PTR_ERR(cm_id); ],[ AC_MSG_RESULT([yes]) diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c index 3858118..5eed508 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.c +++ b/lnet/klnds/o2iblnd/o2iblnd.c @@ -2384,8 +2384,8 @@ kiblnd_dev_need_failover(kib_dev_t *dev) * * a. rdma_bind_addr(), it will conflict with listener cmid * b. rdma_resolve_addr() to zero addr */ - cmid = rdma_create_id(kiblnd_dummy_callback, - dev, RDMA_PS_TCP); + cmid = kiblnd_rdma_create_id(kiblnd_dummy_callback, dev, RDMA_PS_TCP, + IB_QPT_RC); if (IS_ERR(cmid)) { rc = PTR_ERR(cmid); CERROR("Failed to create cmid for failover: %d\n", rc); @@ -2457,7 +2457,8 @@ kiblnd_dev_failover(kib_dev_t *dev) rdma_destroy_id(cmid); } - cmid = rdma_create_id(kiblnd_cm_callback, dev, RDMA_PS_TCP); + cmid = kiblnd_rdma_create_id(kiblnd_cm_callback, dev, RDMA_PS_TCP, + IB_QPT_RC); if (IS_ERR(cmid)) { rc = PTR_ERR(cmid); CERROR("Failed to create cmid for failover: %d\n", rc); diff --git a/lnet/klnds/o2iblnd/o2iblnd.h b/lnet/klnds/o2iblnd/o2iblnd.h index 4538b11..9c0409b 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.h +++ b/lnet/klnds/o2iblnd/o2iblnd.h @@ -144,6 +144,12 @@ extern kib_tunables_t kiblnd_tunables; IBLND_CREDIT_HIGHWATER_V1 : \ *kiblnd_tunables.kib_peercredits_hiw) /* when eagerly to return credits */ +#ifdef HAVE_RDMA_CREATE_ID_4ARG +#define kiblnd_rdma_create_id(cb, dev, ps, qpt) rdma_create_id(cb, dev, ps, qpt) +#else +#define kiblnd_rdma_create_id(cb, dev, ps, qpt) rdma_create_id(cb, dev, ps) +#endif + static inline int kiblnd_concurrent_sends_v1(void) { diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c index 374d161..ce9825d 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_cb.c +++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c @@ -1262,7 +1262,9 @@ kiblnd_connect_peer (kib_peer_t *peer) LASSERT (net != NULL); LASSERT (peer->ibp_connecting > 0); - cmid = rdma_create_id(kiblnd_cm_callback, peer, RDMA_PS_TCP); + cmid = kiblnd_rdma_create_id(kiblnd_cm_callback, peer, RDMA_PS_TCP, + IB_QPT_RC); + if (IS_ERR(cmid)) { CERROR("Can't create CMID for %s: %ld\n", libcfs_nid2str(peer->ibp_nid), PTR_ERR(cmid)); -- 1.8.3.1