1
1

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.
This commit is contained in:
Mike Dubman 2014-04-23 11:38:44 +00:00
parent 8e4cea59da
commit 7c47aab927
4 changed files with 30 additions and 7 deletions

View File

@ -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 <infiniband/verbs_exp.h>])
])
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])

View File

@ -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 */

View File

@ -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 {

View File

@ -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;