diff --git a/oshmem/mca/sshmem/verbs/Makefile.am b/oshmem/mca/sshmem/verbs/Makefile.am deleted file mode 100644 index cdbbf02e6c..0000000000 --- a/oshmem/mca/sshmem/verbs/Makefile.am +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) 2014 Mellanox Technologies, Inc. -# All rights reserved. -# Copyright (c) 2017 IBM Corporation. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -AM_CPPFLAGS = $(oshmem_verbs_CPPFLAGS) - -sources = \ - sshmem_verbs.h \ - sshmem_verbs_component.c \ - sshmem_verbs_module.c - -# Make the output library in this directory, and name it either -# mca__.la (for DSO builds) or libmca__.la -# (for static builds). - -if MCA_BUILD_oshmem_sshmem_verbs_DSO -component_noinst = -component_install = mca_sshmem_verbs.la -else -component_noinst = libmca_sshmem_verbs.la -component_install = -endif - -mcacomponentdir = $(oshmemlibdir) -mcacomponent_LTLIBRARIES = $(component_install) -mca_sshmem_verbs_la_SOURCES = $(sources) -mca_sshmem_verbs_la_LDFLAGS = -module -avoid-version $(oshmem_verbs_LDFLAGS) -mca_sshmem_verbs_la_LIBADD = $(top_builddir)/oshmem/liboshmem.la \ - $(oshmem_verbs_LIBS) \ - $(OPAL_TOP_BUILDDIR)/opal/mca/common/verbs/lib@OPAL_LIB_PREFIX@mca_common_verbs.la - -noinst_LTLIBRARIES = $(component_noinst) -libmca_sshmem_verbs_la_SOURCES =$(sources) -libmca_sshmem_verbs_la_LDFLAGS = -module -avoid-version $(oshmem_verbs_LDFLAGS) -libmca_sshmem_verbs_la_LIBADD = $(oshmem_verbs_LIBS) diff --git a/oshmem/mca/sshmem/verbs/configure.m4 b/oshmem/mca/sshmem/verbs/configure.m4 deleted file mode 100644 index 1f8820386e..0000000000 --- a/oshmem/mca/sshmem/verbs/configure.m4 +++ /dev/null @@ -1,121 +0,0 @@ -# -*- shell-script -*- -# -# Copyright (c) 2014 Mellanox Technologies, Inc. -# All rights reserved. -# Copyright (c) 2015 Research Organization for Information Science -# and Technology (RIST). All rights reserved. -# -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -# MCA_mca_sshmem_verbs_CONFIG(action-if-can-compile, -# [action-if-cant-compile]) -# ------------------------------------------------ -AC_DEFUN([MCA_oshmem_sshmem_verbs_CONFIG],[ - AC_CONFIG_FILES([oshmem/mca/sshmem/verbs/Makefile]) - - # do we have the verbs shm stuff? - AC_MSG_CHECKING([if want verbs shared memory support]) - AC_ARG_ENABLE(verbs-sshmem, - AC_HELP_STRING([--disable-verbs-sshmem], - [disable verbs shared memory support (default: enabled)])) - AS_IF([test "$enable_verbs_sshmem" = "no"], - [AC_MSG_RESULT([no]) - oshmem_verbs_sm_build_verbs=0], - [AC_MSG_RESULT([yes]) - OPAL_CHECK_OPENFABRICS([oshmem_verbs], - [oshmem_verbs_sm_build_verbs=1], - [oshmem_verbs_sm_build_verbs=0])]) - - # substitute in the things needed to build - AC_SUBST([oshmem_verbs_CFLAGS]) - AC_SUBST([oshmem_verbs_CPPFLAGS]) - AC_SUBST([oshmem_verbs_LDFLAGS]) - AC_SUBST([oshmem_verbs_LIBS]) - - # ibv_reg_shared_mr was added in MOFED 1.8 - oshmem_have_mpage=0 - # If we have the oshmem_verbs stuff available, find out what we've got - AS_IF( - [test "$oshmem_verbs_sm_build_verbs" = "1"], - [ - OSHMEM_LIBSHMEM_EXTRA_LDFLAGS="$OSHMEM_LIBSHMEM_EXTRA_LDFLAGS $oshmem_verbs_LDFLAGS" - OSHMEM_LIBSHMEM_EXTRA_LIBS="$OSHMEM_LIBSHMEM_EXTRA_LIBS $oshmem_verbs_LIBS" - - oshmem_verbs_save_CPPFLAGS="$CPPFLAGS" - oshmem_verbs_save_LDFLAGS="$LDFLAGS" - oshmem_verbs_save_LIBS="$LIBS" - - CPPFLAGS="$CPPFLAGS $oshmem_verbs_CPPFLAGS" - LDFLAGS="$LDFLAGS $oshmem_verbs_LDFLAGS" - LIBS="$LIBS $oshmem_verbs_LIBS" - - AC_CHECK_DECLS([IBV_ACCESS_ALLOCATE_MR,IBV_ACCESS_SHARED_MR_USER_READ], - [oshmem_have_mpage=2], [], - [#include ]) - - AC_CHECK_DECLS([IBV_EXP_ACCESS_ALLOCATE_MR,IBV_EXP_ACCESS_SHARED_MR_USER_READ], - [oshmem_have_mpage=3], [], - [#include ]) - - CPPFLAGS="$oshmem_verbs_save_CPPFLAGS" - LDFLAGS="$oshmem_verbs_save_LDFLAGS" - LIBS="$oshmem_verbs_save_LIBS" - - if test "x$oshmem_have_mpage" = "x0"; then - oshmem_verbs_sm_build_verbs=0 - fi - ]) - AC_DEFINE_UNQUOTED(MPAGE_ENABLE, $oshmem_have_mpage, [Whether we can use M-PAGE supported since MOFED 1.8]) - - exp_access_happy=0 - exp_reg_mr_happy=0 - AS_IF([test "$oshmem_have_mpage" = "3"], - [ - oshmem_verbs_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -Wno-strict-prototypes -Werror" - - AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM([[#include ]], - [[ - struct ibv_exp_reg_shared_mr_in in_smr; - uint64_t access_flags = IBV_EXP_ACCESS_SHARED_MR_USER_READ | - IBV_EXP_ACCESS_SHARED_MR_USER_WRITE | - IBV_EXP_ACCESS_SHARED_MR_GROUP_READ | - IBV_EXP_ACCESS_SHARED_MR_GROUP_WRITE | - IBV_EXP_ACCESS_SHARED_MR_OTHER_READ | - IBV_EXP_ACCESS_SHARED_MR_OTHER_WRITE; - in_smr.exp_access = access_flags; - ibv_exp_reg_shared_mr(&in_smr); - ]])], [], - [oshmem_verbs_sm_build_verbs=0]) - - CFLAGS="$oshmem_verbs_save_CFLAGS" - - AC_CHECK_MEMBER([struct ibv_exp_reg_shared_mr_in.exp_access], - [exp_access_happy=1], - [], - [#include ]) - - AC_CHECK_MEMBER([struct ibv_exp_reg_mr_in.create_flags], - [exp_reg_mr_happy=1], - [], - [#include ]) - ]) - AC_DEFINE_UNQUOTED(MPAGE_HAVE_SMR_EXP_ACCESS, $exp_access_happy, [exp_access field is part of ibv_exp_reg_shared_mr_in]) - AC_DEFINE_UNQUOTED(MPAGE_HAVE_IBV_EXP_REG_MR_CREATE_FLAGS, $exp_reg_mr_happy, [create_flags field is part of ibv_exp_reg_mr_in]) - - AS_IF([test "$enable_verbs_sshmem" = "yes" && test "$oshmem_verbs_sm_build_verbs" = "0"], - [AC_MSG_WARN([VERBS shared memory support requested but not found]) - AC_MSG_ERROR([Cannot continue])]) - - AS_IF([test "$oshmem_verbs_sm_build_verbs" = "1"], [$1], [$2]) - - AC_DEFINE_UNQUOTED([OSHMEM_SSHMEM_VERBS], - [$oshmem_verbs_sm_build_verbs], - [Whether we have shared memory support for verbs or not]) -])dnl diff --git a/oshmem/mca/sshmem/verbs/sshmem_verbs.h b/oshmem/mca/sshmem/verbs/sshmem_verbs.h deleted file mode 100644 index 3b4e1694d2..0000000000 --- a/oshmem/mca/sshmem/verbs/sshmem_verbs.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2014 Mellanox Technologies, Inc. - * All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#ifndef MCA_SSHMEM_VERBS_EXPORT_H -#define MCA_SSHMEM_VERBS_EXPORT_H - -#include "oshmem_config.h" - -#include "oshmem/mca/sshmem/sshmem.h" - -BEGIN_C_DECLS - -#include -#include "opal/class/opal_list.h" -#include "opal/class/opal_value_array.h" - -typedef struct openib_device_t { - struct ibv_device **ib_devs; - struct ibv_device *ib_dev; - struct ibv_context *ib_dev_context; - struct ibv_device_attr ib_dev_attr; - struct ibv_pd *ib_pd; - opal_value_array_t ib_mr_array; - struct ibv_mr *ib_mr_shared; -} openib_device_t; - -#if (MPAGE_ENABLE > 0) - -# if MPAGE_ENABLE < 3 -# define IBV_EXP_ACCESS_ALLOCATE_MR IBV_ACCESS_ALLOCATE_MR -# define IBV_EXP_ACCESS_SHARED_MR_USER_READ IBV_ACCESS_SHARED_MR_USER_READ -# define IBV_EXP_ACCESS_SHARED_MR_USER_WRITE IBV_ACCESS_SHARED_MR_USER_WRITE -# define IBV_EXP_ACCESS_NO_RDMA IBV_ACCESS_NO_RDMA -# define ibv_exp_reg_shared_mr ibv_reg_shared_mr_ex -# define ibv_exp_reg_shared_mr_in ibv_reg_shared_mr_in - -struct ibv_exp_reg_mr_in { - struct ibv_pd *pd; - void *addr; - size_t length; - uint64_t access; - uint32_t comp_mask; -}; - -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 (MPAGE_HAVE_SMR_EXP_ACCESS) - mr->exp_access = access; -#else - mr->access = access; -#endif - mr->comp_mask = 0; -} -#endif /* MPAGE_ENABLE */ - - -/** - * globally exported variable to hold the verbs component. - */ -typedef struct mca_sshmem_verbs_component_t { - /* base component struct */ - mca_sshmem_base_component_t super; - /* priority for verbs component */ - int priority; - char* hca_name; - int mr_interleave_factor; - int has_shared_mr; -} mca_sshmem_verbs_component_t; - -OSHMEM_MODULE_DECLSPEC extern mca_sshmem_verbs_component_t -mca_sshmem_verbs_component; - -typedef struct mca_sshmem_verbs_module_t { - mca_sshmem_base_module_t super; -} mca_sshmem_verbs_module_t; -extern mca_sshmem_verbs_module_t mca_sshmem_verbs_module; - -END_C_DECLS - -#endif /* MCA_SSHMEM_VERBS_EXPORT_H */ diff --git a/oshmem/mca/sshmem/verbs/sshmem_verbs_component.c b/oshmem/mca/sshmem/verbs/sshmem_verbs_component.c deleted file mode 100644 index 1b99bb0541..0000000000 --- a/oshmem/mca/sshmem/verbs/sshmem_verbs_component.c +++ /dev/null @@ -1,353 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ -/* - * Copyright (c) 2014 Mellanox Technologies, Inc. - * All rights reserved. - * Copyright (c) 2014 Research Organization for Information Science - * and Technology (RIST). All rights reserved. - * Copyright (c) 2014 NVIDIA Corporation. All rights reserved. - * Copyright (c) 2015 Los Alamos National Security, LLC. All rights - * reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include "oshmem_config.h" - -#ifdef HAVE_UNISTD_H -#include -#endif /* HAVE_UNISTD_H */ - -#include "opal/constants.h" -#include "opal/util/sys_limits.h" -#include "opal/mca/common/verbs/common_verbs.h" - -#include "oshmem/mca/sshmem/sshmem.h" -#include "oshmem/mca/sshmem/base/base.h" - -#include "sshmem_verbs.h" - -/** - * public string showing the shmem ompi_mmap component version number - */ -const char *mca_sshmem_verbs_component_version_string = - "OSHMEM mmap sshmem MCA component version " OSHMEM_VERSION; - -int mca_sshmem_verbs_relocate_backing_file = 0; -char *mca_sshmem_verbs_backing_file_base_dir = NULL; -bool mca_sshmem_verbs_nfs_warning = true; - -/** - * local functions - */ -static int verbs_register(void); -static int verbs_open(void); -static int verbs_close(void); -static int verbs_query(mca_base_module_t **module, int *priority); -static int verbs_runtime_query(mca_base_module_t **module, - int *priority, - const char *hint); - -/** - * instantiate the public struct with all of our public information - * and pointers to our public functions in it - */ -mca_sshmem_verbs_component_t mca_sshmem_verbs_component = { - /* ////////////////////////////////////////////////////////////////////// */ - /* super */ - /* ////////////////////////////////////////////////////////////////////// */ - { - /** - * common MCA component data - */ - .base_version = { - MCA_SSHMEM_BASE_VERSION_2_0_0, - - /* component name and version */ - .mca_component_name = "verbs", - MCA_BASE_MAKE_VERSION(component, OSHMEM_MAJOR_VERSION, OSHMEM_MINOR_VERSION, - OSHMEM_RELEASE_VERSION), - - .mca_open_component = verbs_open, - .mca_close_component = verbs_close, - .mca_query_component = verbs_query, - .mca_register_component_params = verbs_register, - }, - /* MCA v2.0.0 component meta data */ - .base_data = { - /* the component is checkpoint ready */ - MCA_BASE_METADATA_PARAM_CHECKPOINT - }, - .runtime_query = verbs_runtime_query, - }, -}; - -/* ////////////////////////////////////////////////////////////////////////// */ -static int -verbs_runtime_query(mca_base_module_t **module, - int *priority, - const char *hint) -{ - int rc = OSHMEM_SUCCESS; - openib_device_t my_device; - openib_device_t *device = &my_device; - int num_devs = 0; - int i = 0; - - *priority = 0; - *module = NULL; - - /* If fork support is requested, try to enable it */ - if (OSHMEM_SUCCESS != (rc = opal_common_verbs_fork_test())) { - return OSHMEM_ERROR; - } - - memset(device, 0, sizeof(*device)); - -#ifdef HAVE_IBV_GET_DEVICE_LIST - device->ib_devs = ibv_get_device_list(&num_devs); -#else - #error unsupported ibv_get_device_list in infiniband/verbs.h -#endif - - if (num_devs == 0 || !device->ib_devs) { - return OSHMEM_ERR_NOT_SUPPORTED; - } - - /* Open device */ - if (NULL != mca_sshmem_verbs_component.hca_name) { - for (i = 0; i < num_devs; i++) { - if (0 == strcmp(mca_sshmem_verbs_component.hca_name, ibv_get_device_name(device->ib_devs[i]))) { - device->ib_dev = device->ib_devs[i]; - break; - } - } - } else { - device->ib_dev = device->ib_devs[0]; - } - - if (NULL == device->ib_dev) { - rc = OSHMEM_ERR_NOT_FOUND; - goto out; - } - - if (NULL == (device->ib_dev_context = ibv_open_device(device->ib_dev))) { - rc = OSHMEM_ERR_RESOURCE_BUSY; - goto out; - } - - /* Obtain device attributes */ - if (ibv_query_device(device->ib_dev_context, &device->ib_dev_attr)) { - rc = OSHMEM_ERR_RESOURCE_BUSY; - goto out; - } - - /* Allocate the protection domain for the device */ - device->ib_pd = ibv_alloc_pd(device->ib_dev_context); - if (NULL == device->ib_pd) { - rc = OSHMEM_ERR_RESOURCE_BUSY; - goto out; - } - - /* Allocate memory */ - if (!rc) { - void *addr = NULL; - size_t size = (size_t)opal_getpagesize(); - struct ibv_mr *ib_mr = NULL; - uint64_t access_flag = IBV_ACCESS_LOCAL_WRITE | - IBV_ACCESS_REMOTE_WRITE | - IBV_ACCESS_REMOTE_READ; - uint64_t exp_access_flag = 0; - - OBJ_CONSTRUCT(&device->ib_mr_array, opal_value_array_t); - opal_value_array_init(&device->ib_mr_array, sizeof(struct ibv_mr *)); - -#if (MPAGE_ENABLE > 0) - exp_access_flag = IBV_EXP_ACCESS_ALLOCATE_MR | - IBV_EXP_ACCESS_SHARED_MR_USER_READ | - IBV_EXP_ACCESS_SHARED_MR_USER_WRITE; -#endif /* MPAGE_ENABLE */ - - struct ibv_exp_reg_mr_in in = {device->ib_pd, addr, size, access_flag|exp_access_flag, 0}; - ib_mr = ibv_exp_reg_mr(&in); - if (NULL == ib_mr) { - rc = OSHMEM_ERR_OUT_OF_RESOURCE; - } else { - device->ib_mr_shared = ib_mr; - opal_value_array_append_item(&device->ib_mr_array, &ib_mr); - } - -#if (MPAGE_ENABLE > 0) - if (!rc && (0 != mca_sshmem_verbs_component.has_shared_mr)) { - 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; - 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) { - if (mca_sshmem_verbs_component.has_shared_mr == 1) - rc = OSHMEM_ERR_OUT_OF_RESOURCE; - - mca_sshmem_verbs_component.has_shared_mr = 0; - } else { - opal_value_array_append_item(&device->ib_mr_array, &ib_mr); - mca_sshmem_verbs_component.has_shared_mr = 1; - } - } -#else - if (!rc && mca_sshmem_verbs_component.has_shared_mr == 1) { - rc = OSHMEM_ERR_OUT_OF_RESOURCE; - } - mca_sshmem_verbs_component.has_shared_mr = 0; -#endif /* MPAGE_ENABLE */ - } - -#if !MPAGE_HAVE_IBV_EXP_REG_MR_CREATE_FLAGS - /* disqualify ourselves if we can not alloc contig - * pages at fixed address - */ - if (mca_sshmem_verbs_component.has_shared_mr == 0) - rc = OSHMEM_ERR_OUT_OF_RESOURCE; -#endif - - /* all is well - rainbows and butterflies */ - if (!rc) { - *priority = mca_sshmem_verbs_component.priority; - *module = (mca_base_module_t *)&mca_sshmem_verbs_module.super; - } - -out: - if (device) { - if (0 < (i = opal_value_array_get_size(&device->ib_mr_array))) { - struct ibv_mr** array; - struct ibv_mr* ib_mr = NULL; - array = OPAL_VALUE_ARRAY_GET_BASE(&device->ib_mr_array, struct ibv_mr *); - /* destruct shared_mr first in order to avoid proc fs race */ - for (i--;i >= 0; i--) { - ib_mr = array[i]; - ibv_dereg_mr(ib_mr); - opal_value_array_remove_item(&device->ib_mr_array, i); - } - - if (device->ib_mr_shared) { - device->ib_mr_shared = NULL; - } - OBJ_DESTRUCT(&device->ib_mr_array); - } - - if (device->ib_pd) { - ibv_dealloc_pd(device->ib_pd); - device->ib_pd = NULL; - } - - if(device->ib_dev_context) { - ibv_close_device(device->ib_dev_context); - device->ib_dev_context = NULL; - } - - if(device->ib_devs) { - ibv_free_device_list(device->ib_devs); - device->ib_devs = NULL; - } - } - - return rc; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -static int -verbs_register(void) -{ - int index; - - /* ////////////////////////////////////////////////////////////////////// */ - /* (default) priority - set high to make verbs the default */ - mca_sshmem_verbs_component.priority = 20; - index = mca_base_component_var_register (&mca_sshmem_verbs_component.super.base_version, - "priority", "Priority for sshmem verbs " - "component (default: 20)", MCA_BASE_VAR_TYPE_INT, - NULL, 0, MCA_BASE_VAR_FLAG_SETTABLE, - OPAL_INFO_LVL_3, - MCA_BASE_VAR_SCOPE_ALL_EQ, - &mca_sshmem_verbs_component.priority); - - mca_sshmem_verbs_component.hca_name = NULL; - index = mca_base_component_var_register (&mca_sshmem_verbs_component.super.base_version, - "hca_name", "Preferred hca (default: the first)", MCA_BASE_VAR_TYPE_STRING, - NULL, 0, MCA_BASE_VAR_FLAG_SETTABLE, - OPAL_INFO_LVL_3, - MCA_BASE_VAR_SCOPE_READONLY, - &mca_sshmem_verbs_component.hca_name); - if (index) { - (void) mca_base_var_register_synonym(index, "oshmem", "memheap", "base", - "hca_name", - MCA_BASE_VAR_SYN_FLAG_DEPRECATED); - } - /* allow user specify hca port, extract hca name - * ex: mlx_4_0:1 is allowed - */ - if (mca_sshmem_verbs_component.hca_name) { - char *p; - - p = strchr(mca_sshmem_verbs_component.hca_name, ':'); - if (p) - *p = 0; - } - - - mca_sshmem_verbs_component.mr_interleave_factor = 2; - index = mca_base_component_var_register (&mca_sshmem_verbs_component.super.base_version, - "mr_interleave_factor", "try to give at least N Gbytes spaces between mapped memheaps " - "of other PEs that are local to me (default: 2)", MCA_BASE_VAR_TYPE_INT, - NULL, 0, MCA_BASE_VAR_FLAG_SETTABLE, - OPAL_INFO_LVL_3, - MCA_BASE_VAR_SCOPE_READONLY, - &mca_sshmem_verbs_component.mr_interleave_factor); - if (index) { - (void) mca_base_var_register_synonym(index, "oshmem", "memheap", "base", - "mr_interleave_factor", - MCA_BASE_VAR_SYN_FLAG_DEPRECATED); - } - - mca_sshmem_verbs_component.has_shared_mr = -1; - index = mca_base_component_var_register (&mca_sshmem_verbs_component.super.base_version, - "shared_mr", "Shared memory region usage " - "[0 - off, 1 - on, -1 - auto] (default: -1)", MCA_BASE_VAR_TYPE_INT, - NULL, 0, MCA_BASE_VAR_FLAG_SETTABLE, - OPAL_INFO_LVL_4, - MCA_BASE_VAR_SCOPE_ALL_EQ, - &mca_sshmem_verbs_component.has_shared_mr); - - return OSHMEM_SUCCESS; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -static int -verbs_open(void) -{ - return OSHMEM_SUCCESS; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -static int -verbs_query(mca_base_module_t **module, int *priority) -{ - *priority = mca_sshmem_verbs_component.priority; - *module = (mca_base_module_t *)&mca_sshmem_verbs_module.super; - return OSHMEM_SUCCESS; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -static int -verbs_close(void) -{ - return OSHMEM_SUCCESS; -} - diff --git a/oshmem/mca/sshmem/verbs/sshmem_verbs_module.c b/oshmem/mca/sshmem/verbs/sshmem_verbs_module.c deleted file mode 100644 index 04d925e700..0000000000 --- a/oshmem/mca/sshmem/verbs/sshmem_verbs_module.c +++ /dev/null @@ -1,460 +0,0 @@ -/* - * Copyright (c) 2014 Mellanox Technologies, Inc. - * All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include "oshmem_config.h" - -#include -#ifdef HAVE_FCNTL_H -#include -#endif /* HAVE_FCNTL_H */ -#ifdef HAVE_SYS_MMAN_H -#include -#endif /* HAVE_SYS_MMAN_H */ -#ifdef HAVE_UNISTD_H -#include -#endif /* HAVE_UNISTD_H */ -#ifdef HAVE_SYS_TYPES_H -#include -#endif /* HAVE_SYS_TYPES_H */ -#include -#ifdef HAVE_NETDB_H -#include -#endif /* HAVE_NETDB_H */ -#include -#ifdef HAVE_SYS_STAT_H -#include -#endif /* HAVE_SYS_STAT_H */ - -#include "opal/constants.h" -#include "opal/util/output.h" -#include "opal/util/path.h" -#include "opal/util/show_help.h" - -#include "oshmem/mca/sshmem/sshmem.h" -#include "oshmem/mca/sshmem/base/base.h" - -#include "sshmem_verbs.h" - - -static openib_device_t memheap_device; - -/* ////////////////////////////////////////////////////////////////////////// */ -/*local functions */ -/* local functions */ -static int -module_init(void); - -static int -segment_create(map_segment_t *ds_buf, - const char *file_name, - size_t size); - -static void * -segment_attach(map_segment_t *ds_buf, sshmem_mkey_t *mkey); - -static int -segment_detach(map_segment_t *ds_buf, sshmem_mkey_t *mkey); - -static int -segment_unlink(map_segment_t *ds_buf); - -static int -module_finalize(void); - -/* - * mmap shmem module - */ -mca_sshmem_verbs_module_t mca_sshmem_verbs_module = { - /* super */ - { - module_init, - segment_create, - segment_attach, - segment_detach, - segment_unlink, - module_finalize - } -}; - -/* ////////////////////////////////////////////////////////////////////////// */ -static int -module_init(void) -{ - /* nothing to do */ - return OSHMEM_SUCCESS; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -static int -module_finalize(void) -{ - /* nothing to do */ - return OSHMEM_SUCCESS; -} - - -/* ////////////////////////////////////////////////////////////////////////// */ -static int -segment_create(map_segment_t *ds_buf, - const char *file_name, - size_t size) -{ - int rc = OSHMEM_SUCCESS; - openib_device_t *device = &memheap_device; - int num_devs = 0; - int i = 0; - - assert(ds_buf); - - /* init the contents of map_segment_t */ - shmem_ds_reset(ds_buf); - - memset(device, 0, sizeof(*device)); - -#ifdef HAVE_IBV_GET_DEVICE_LIST - device->ib_devs = ibv_get_device_list(&num_devs); -#else -#error unsupported ibv_get_device_list in infiniband/verbs.h -#endif - - if (num_devs == 0 || !device->ib_devs) { - return OSHMEM_ERR_NOT_SUPPORTED; - } - - /* Open device */ - if (NULL != mca_sshmem_verbs_component.hca_name) { - for (i = 0; i < num_devs; i++) { - if (0 == strcmp(mca_sshmem_verbs_component.hca_name, ibv_get_device_name(device->ib_devs[i]))) { - device->ib_dev = device->ib_devs[i]; - break; - } - } - } else { - device->ib_dev = device->ib_devs[0]; - } - - if (NULL == device->ib_dev) { - OPAL_OUTPUT_VERBOSE( - (5, oshmem_sshmem_base_framework.framework_output, - "error getting device says %d: %s", - errno, strerror(errno)) - ); - return OSHMEM_ERR_NOT_FOUND; - } - - if (NULL == (device->ib_dev_context = ibv_open_device(device->ib_dev))) { - OPAL_OUTPUT_VERBOSE( - (5, oshmem_sshmem_base_framework.framework_output, - "error obtaining device context for %s errno says %d: %s", - ibv_get_device_name(device->ib_dev), errno, strerror(errno)) - ); - return OSHMEM_ERR_RESOURCE_BUSY; - } - - /* Obtain device attributes */ - if (ibv_query_device(device->ib_dev_context, &device->ib_dev_attr)) { - OPAL_OUTPUT_VERBOSE( - (5, oshmem_sshmem_base_framework.framework_output, - "error obtaining device attributes for %s errno says %d: %s", - ibv_get_device_name(device->ib_dev), errno, strerror(errno)) - ); - return OSHMEM_ERR_RESOURCE_BUSY; - } - - /* Allocate the protection domain for the device */ - device->ib_pd = ibv_alloc_pd(device->ib_dev_context); - if (NULL == device->ib_pd) { - OPAL_OUTPUT_VERBOSE( - (5, oshmem_sshmem_base_framework.framework_output, - "error allocating protection domain for %s errno says %d: %s", - ibv_get_device_name(device->ib_dev), errno, strerror(errno)) - ); - return OSHMEM_ERR_RESOURCE_BUSY; - } - - /* Allocate memory */ - if (!rc) { - void *addr = NULL; - struct ibv_mr *ib_mr = NULL; - uint64_t access_flag = IBV_ACCESS_LOCAL_WRITE | - IBV_ACCESS_REMOTE_WRITE | - IBV_ACCESS_REMOTE_READ; - uint64_t exp_access_flag = 0; - - OBJ_CONSTRUCT(&device->ib_mr_array, opal_value_array_t); - opal_value_array_init(&device->ib_mr_array, sizeof(struct ibv_mr *)); - -#if (MPAGE_ENABLE > 0) - exp_access_flag = IBV_EXP_ACCESS_ALLOCATE_MR | - IBV_EXP_ACCESS_SHARED_MR_USER_READ | - IBV_EXP_ACCESS_SHARED_MR_USER_WRITE; -#endif /* MPAGE_ENABLE */ - - struct ibv_exp_reg_mr_in in = {device->ib_pd, addr, size, access_flag|exp_access_flag, 0}; - -#if MPAGE_HAVE_IBV_EXP_REG_MR_CREATE_FLAGS - if (0 == mca_sshmem_verbs_component.has_shared_mr) { - in.addr = (void *)mca_sshmem_base_start_address; - in.comp_mask = IBV_EXP_REG_MR_CREATE_FLAGS; - in.create_flags = IBV_EXP_REG_MR_CREATE_CONTIG; - in.exp_access = access_flag; - } -#endif - ib_mr = ibv_exp_reg_mr(&in); - if (NULL == ib_mr) { - OPAL_OUTPUT_VERBOSE( - (5, oshmem_sshmem_base_framework.framework_output, - "error to ibv_exp_reg_mr() %llu bytes errno says %d: %s", - (unsigned long long)size, errno, strerror(errno)) - ); - rc = OSHMEM_ERR_OUT_OF_RESOURCE; - } else { - device->ib_mr_shared = ib_mr; - opal_value_array_append_item(&device->ib_mr_array, &ib_mr); - } - -#if (MPAGE_ENABLE > 0) - if (!rc && mca_sshmem_verbs_component.has_shared_mr) { - void *addr = NULL; - 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; - 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( - (5, oshmem_sshmem_base_framework.framework_output, - "error to ibv_reg_shared_mr() %llu bytes errno says %d: %s has_shared_mr: %d", - (unsigned long long)size, errno, strerror(errno), - mca_sshmem_verbs_component.has_shared_mr - ) - ); - rc = OSHMEM_ERR_OUT_OF_RESOURCE; - } else { - opal_value_array_append_item(&device->ib_mr_array, &ib_mr); - } - } -#endif /* MPAGE_ENABLE */ - - if (!rc) { - OPAL_OUTPUT_VERBOSE( - (70, oshmem_sshmem_base_framework.framework_output, - "ibv device %s shared_mr: %d", - ibv_get_device_name(device->ib_dev), - mca_sshmem_verbs_component.has_shared_mr) - ); - - if (mca_sshmem_verbs_component.has_shared_mr) { - assert(size == device->ib_mr_shared->length); - ds_buf->type = MAP_SEGMENT_ALLOC_IBV; - ds_buf->seg_id = device->ib_mr_shared->handle; - } else { - ds_buf->type = MAP_SEGMENT_ALLOC_IBV_NOSHMR; - ds_buf->seg_id = MAP_SEGMENT_SHM_INVALID; - } - ds_buf->super.va_base = ib_mr->addr; - ds_buf->seg_size = size; - ds_buf->super.va_end = (void*)((uintptr_t)ds_buf->super.va_base + ds_buf->seg_size); - } - } - - OPAL_OUTPUT_VERBOSE( - (70, oshmem_sshmem_base_framework.framework_output, - "%s: %s: create %s " - "(id: %d, addr: %p size: %lu)\n", - mca_sshmem_verbs_component.super.base_version.mca_type_name, - mca_sshmem_verbs_component.super.base_version.mca_component_name, - (rc ? "failure" : "successful"), - ds_buf->seg_id, ds_buf->super.va_base, (unsigned long)ds_buf->seg_size) - ); - - return rc; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/** - * segment_attach can only be called after a successful call to segment_create - */ -static void * -segment_attach(map_segment_t *ds_buf, sshmem_mkey_t *mkey) -{ - openib_device_t *device = &memheap_device; - static int mr_count = 0; - void *addr = NULL; - - assert(ds_buf); - assert(mkey->va_base == 0); - - if (MAP_SEGMENT_SHM_INVALID == (int)(mkey->u.key)) { - return (mkey->va_base); - } - - /* workaround mtt problem - request aligned addresses */ - ++mr_count; - addr = (void *)((uintptr_t)mca_sshmem_base_start_address + - mca_sshmem_verbs_component.mr_interleave_factor * 1024ULL * 1024ULL * 1024ULL * mr_count); - { - struct ibv_mr *ib_mr = NULL; - uint64_t access_flag = IBV_ACCESS_LOCAL_WRITE | - IBV_ACCESS_REMOTE_WRITE | - IBV_ACCESS_REMOTE_READ | - IBV_EXP_ACCESS_NO_RDMA; - 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; - OPAL_OUTPUT_VERBOSE( - (5, oshmem_sshmem_base_framework.framework_output, - "error to ibv_reg_shared_mr() %llu bytes errno says %d: %s", - (unsigned long long)ds_buf->seg_size, errno, strerror(errno)) - ); - } else { - if (ib_mr->addr != addr) { - OPAL_OUTPUT_VERBOSE( - (5, oshmem_sshmem_base_framework.framework_output, - "Failed to map shared region to address %p got addr %p. Try to increase 'memheap_mr_interleave_factor' from %d", - addr, ib_mr->addr, mca_sshmem_verbs_component.mr_interleave_factor) - ); - } - - opal_value_array_append_item(&device->ib_mr_array, &ib_mr); - mkey->va_base = ib_mr->addr; - } - } - - OPAL_OUTPUT_VERBOSE( - (70, oshmem_sshmem_base_framework.framework_output, - "%s: %s: attach successful " - "(id: %d, addr: %p size: %lu | va_base: 0x%p len: %d key %llx)\n", - mca_sshmem_verbs_component.super.base_version.mca_type_name, - mca_sshmem_verbs_component.super.base_version.mca_component_name, - ds_buf->seg_id, ds_buf->super.va_base, (unsigned long)ds_buf->seg_size, - mkey->va_base, mkey->len, (unsigned long long)mkey->u.key) - ); - - /* update returned base pointer with an offset that hides our stuff */ - return (mkey->va_base); -} - -/* ////////////////////////////////////////////////////////////////////////// */ -static int -segment_detach(map_segment_t *ds_buf, sshmem_mkey_t *mkey) -{ - int rc = OSHMEM_SUCCESS; - openib_device_t *device = &memheap_device; - int i; - - assert(ds_buf); - - OPAL_OUTPUT_VERBOSE( - (70, oshmem_sshmem_base_framework.framework_output, - "%s: %s: detaching " - "(id: %d, addr: %p size: %lu)\n", - mca_sshmem_verbs_component.super.base_version.mca_type_name, - mca_sshmem_verbs_component.super.base_version.mca_component_name, - ds_buf->seg_id, ds_buf->super.va_base, (unsigned long)ds_buf->seg_size) - ); - - if (device) { - if (0 < (i = opal_value_array_get_size(&device->ib_mr_array))) { - struct ibv_mr** array; - struct ibv_mr* ib_mr = NULL; - array = OPAL_VALUE_ARRAY_GET_BASE(&device->ib_mr_array, struct ibv_mr *); - for (i--;i >= 0; i--) { - ib_mr = array[i]; - if(ibv_dereg_mr(ib_mr)) { - OPAL_OUTPUT_VERBOSE( - (5, oshmem_sshmem_base_framework.framework_output, - "error ibv_dereg_mr(): %d: %s", - errno, strerror(errno)) - ); - rc = OSHMEM_ERROR; - } - opal_value_array_remove_item(&device->ib_mr_array, i); - } - - if (!rc && device->ib_mr_shared) { - device->ib_mr_shared = NULL; - } - OBJ_DESTRUCT(&device->ib_mr_array); - } - - if (!rc && device->ib_pd) { - if (ibv_dealloc_pd(device->ib_pd)) { - OPAL_OUTPUT_VERBOSE( - (5, oshmem_sshmem_base_framework.framework_output, - "error ibv_dealloc_pd(): %d: %s", - errno, strerror(errno)) - ); - rc = OSHMEM_ERROR; - } else { - device->ib_pd = NULL; - } - } - - if(!rc && device->ib_dev_context) { - if(ibv_close_device(device->ib_dev_context)) { - OPAL_OUTPUT_VERBOSE( - (5, oshmem_sshmem_base_framework.framework_output, - "error ibv_close_device(): %d: %s", - errno, strerror(errno)) - ); - rc = OSHMEM_ERROR; - } else { - device->ib_dev_context = NULL; - } - } - - if(!rc && device->ib_devs) { - ibv_free_device_list(device->ib_devs); - device->ib_devs = NULL; - } - } - - /* reset the contents of the map_segment_t associated with this - * shared memory segment. - */ - shmem_ds_reset(ds_buf); - - return rc; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -static int -segment_unlink(map_segment_t *ds_buf) -{ - /* not much unlink work needed for sysv */ - - OPAL_OUTPUT_VERBOSE( - (70, oshmem_sshmem_base_framework.framework_output, - "%s: %s: unlinking " - "(id: %d, addr: %p size: %lu)\n", - mca_sshmem_verbs_component.super.base_version.mca_type_name, - mca_sshmem_verbs_component.super.base_version.mca_component_name, - ds_buf->seg_id, ds_buf->super.va_base, (unsigned long)ds_buf->seg_size) - ); - - /* don't completely reset. in particular, only reset - * the id and flip the invalid bit. size and name values will remain valid - * across unlinks. other information stored in flags will remain untouched. - */ - ds_buf->seg_id = MAP_SEGMENT_SHM_INVALID; - /* note: this is only changing the valid bit to 0. */ - MAP_SEGMENT_INVALIDATE(ds_buf); - - return OSHMEM_SUCCESS; -} -