From 3e82449dbef5304aee71e3fa051c25d56dd7d694 Mon Sep 17 00:00:00 2001 From: Jeff Squyres Date: Tue, 22 Jan 2019 07:42:47 -0800 Subject: [PATCH] sshmem/verbs: So long / farewell / it's time to say goodnight So long sshmem/verbs! After many years of (mostly) faithful service, it is time to remove the sshmem verbs component. It has been fully replaced by other components, such as the UCX PML and OFI MTL. Signed-off-by: Jeff Squyres --- oshmem/mca/sshmem/verbs/Makefile.am | 41 -- oshmem/mca/sshmem/verbs/configure.m4 | 121 ----- oshmem/mca/sshmem/verbs/sshmem_verbs.h | 96 ---- .../mca/sshmem/verbs/sshmem_verbs_component.c | 353 -------------- oshmem/mca/sshmem/verbs/sshmem_verbs_module.c | 460 ------------------ 5 files changed, 1071 deletions(-) delete mode 100644 oshmem/mca/sshmem/verbs/Makefile.am delete mode 100644 oshmem/mca/sshmem/verbs/configure.m4 delete mode 100644 oshmem/mca/sshmem/verbs/sshmem_verbs.h delete mode 100644 oshmem/mca/sshmem/verbs/sshmem_verbs_component.c delete mode 100644 oshmem/mca/sshmem/verbs/sshmem_verbs_module.c 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; -} -