From 7c47aab92796083caa3405ff0fd2d54059381b12 Mon Sep 17 00:00:00 2001 From: Mike Dubman Date: Wed, 23 Apr 2014 11:38:44 +0000 Subject: [PATCH] OSHMEM: fix segv with new OFED new OFED changed struct layout and static assignment caused segv. detect struct new layout and use dynamic assignment fixed by AlexM, reviewed by Miked cmr=v1.8.2:reviewer=ompi-rm1.8 This commit was SVN r31502. --- oshmem/mca/sshmem/verbs/configure.m4 | 9 +++++++++ oshmem/mca/sshmem/verbs/sshmem_verbs.h | 15 +++++++++++++-- oshmem/mca/sshmem/verbs/sshmem_verbs_component.c | 6 ++++-- oshmem/mca/sshmem/verbs/sshmem_verbs_module.c | 7 ++++--- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/oshmem/mca/sshmem/verbs/configure.m4 b/oshmem/mca/sshmem/verbs/configure.m4 index 56e308d846..cf67bc4dfb 100644 --- a/oshmem/mca/sshmem/verbs/configure.m4 +++ b/oshmem/mca/sshmem/verbs/configure.m4 @@ -72,6 +72,15 @@ AC_DEFUN([MCA_oshmem_sshmem_verbs_CONFIG],[ oshmem_verbs_sm_build_verbs=0 fi ]) + AS_IF([test "$oshmem_have_mpage" = "3"], + [ + AC_CHECK_MEMBER([struct ibv_exp_reg_shared_mr_in.exp_access], + [AC_DEFINE_UNQUOTED(MPAGE_HAVE_SMR_EXP_ACCESS, 1, + [exp_access field is part of ibv_exp_reg_shared_mr_in] + )], + [], + [#include ]) + ]) AS_IF([test "$enable_verbs_sshmem" = "yes" -a "$oshmem_verbs_sm_build_verbs" = "0"], [AC_MSG_WARN([VERBS shared memory support requested but not found]) diff --git a/oshmem/mca/sshmem/verbs/sshmem_verbs.h b/oshmem/mca/sshmem/verbs/sshmem_verbs.h index f97540d949..4f6c98f328 100644 --- a/oshmem/mca/sshmem/verbs/sshmem_verbs.h +++ b/oshmem/mca/sshmem/verbs/sshmem_verbs.h @@ -53,9 +53,20 @@ static inline struct ibv_mr *ibv_exp_reg_mr(struct ibv_exp_reg_mr_in *in) { return ibv_reg_mr(in->pd, in->addr, in->length, in->access); } - - # endif + +static inline void mca_sshmem_verbs_fill_shared_mr(struct ibv_exp_reg_shared_mr_in *mr, struct ibv_pd *pd, uint32_t handle, void *addr, uint64_t access) +{ + mr->pd = pd; + mr->addr = addr; + mr->mr_handle = handle; +#if defined(MPAGE_HAVE_SMR_EXP_ACCESS) + mr->exp_access = access; +#else + mr->access = access; +#endif + mr->comp_mask = 0; +} #endif /* MPAGE_ENABLE */ diff --git a/oshmem/mca/sshmem/verbs/sshmem_verbs_component.c b/oshmem/mca/sshmem/verbs/sshmem_verbs_component.c index b0b8300fdf..b0aae02a7f 100644 --- a/oshmem/mca/sshmem/verbs/sshmem_verbs_component.c +++ b/oshmem/mca/sshmem/verbs/sshmem_verbs_component.c @@ -173,14 +173,16 @@ verbs_runtime_query(mca_base_module_t **module, #if defined(MPAGE_ENABLE) && (MPAGE_ENABLE > 0) if (!rc) { + struct ibv_exp_reg_shared_mr_in in_smr; + access_flag = IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ| IBV_EXP_ACCESS_NO_RDMA; addr = (void *)mca_sshmem_base_start_address; - struct ibv_exp_reg_shared_mr_in in = {0, device->ib_mr_shared->handle, device->ib_pd, addr, access_flag}; - ib_mr = ibv_exp_reg_shared_mr(&in); + mca_sshmem_verbs_fill_shared_mr(&in_smr, device->ib_pd, device->ib_mr_shared->handle, addr, access_flag); + ib_mr = ibv_exp_reg_shared_mr(&in_smr); if (NULL == ib_mr) { mca_sshmem_verbs_component.has_shared_mr = 0; } else { diff --git a/oshmem/mca/sshmem/verbs/sshmem_verbs_module.c b/oshmem/mca/sshmem/verbs/sshmem_verbs_module.c index 2d6f0f97a7..efd6b55124 100644 --- a/oshmem/mca/sshmem/verbs/sshmem_verbs_module.c +++ b/oshmem/mca/sshmem/verbs/sshmem_verbs_module.c @@ -281,7 +281,8 @@ segment_create(map_segment_t *ds_buf, IBV_EXP_ACCESS_NO_RDMA; addr = (void *)mca_sshmem_base_start_address; - struct ibv_exp_reg_shared_mr_in in = {0,device->ib_mr_shared->handle,device->ib_pd, addr, access_flag}; + struct ibv_exp_reg_shared_mr_in in; + mca_sshmem_verbs_fill_shared_mr(&in, device->ib_pd, device->ib_mr_shared->handle, addr, access_flag); ib_mr = ibv_exp_reg_shared_mr(&in); if (NULL == ib_mr) { OPAL_OUTPUT_VERBOSE( @@ -361,9 +362,9 @@ segment_attach(map_segment_t *ds_buf, sshmem_mkey_t *mkey) IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ | IBV_EXP_ACCESS_NO_RDMA; - struct ibv_exp_reg_shared_mr_in in = { - 0, mkey->u.key, device->ib_pd, addr, access_flag}; + struct ibv_exp_reg_shared_mr_in in; + mca_sshmem_verbs_fill_shared_mr(&in, device->ib_pd, mkey->u.key, addr, access_flag); ib_mr = ibv_exp_reg_shared_mr(&in); if (NULL == ib_mr) { mkey->va_base = (void *)-1;