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:
parent
8e4cea59da
commit
7c47aab927
@ -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])
|
||||
|
@ -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 */
|
||||
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user