Remove stale and unused component
Этот коммит содержится в:
родитель
0c553c2693
Коммит
79b90a54b6
@ -1,83 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
|
||||
# Copyright (c) 2009-2014 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
#
|
||||
# $HEADER$
|
||||
#
|
||||
|
||||
AM_CPPFLAGS = $(common_ofacm_CPPFLAGS)
|
||||
|
||||
dist_opaldata_DATA = \
|
||||
help-mpi-common-ofacm-base.txt \
|
||||
help-mpi-common-ofacm-oob.txt
|
||||
headers = \
|
||||
base.h \
|
||||
common_ofacm_oob.h \
|
||||
common_ofacm_empty.h \
|
||||
connect.h
|
||||
|
||||
sources = \
|
||||
common_ofacm_base.c \
|
||||
common_ofacm_oob.c \
|
||||
common_ofacm_empty.c
|
||||
|
||||
# If we have XRC support, build XOOB connection module
|
||||
if MCA_common_ofacm_have_xrc
|
||||
sources += \
|
||||
common_ofacm_xoob.c \
|
||||
common_ofacm_xoob.h
|
||||
endif
|
||||
|
||||
# See opal/mca/common/sm/Makefile.am for an explanation of the
|
||||
# LTLIBRARIES values listed below.
|
||||
|
||||
lib_LTLIBRARIES =
|
||||
noinst_LTLIBRARIES =
|
||||
comp_inst = lib@OPAL_LIB_PREFIX@mca_common_ofacm.la
|
||||
comp_noinst = lib@OPAL_LIB_PREFIX@mca_common_ofacm_noinst.la
|
||||
|
||||
if MCA_BUILD_opal_common_ofacm_DSO
|
||||
lib_LTLIBRARIES += $(comp_inst)
|
||||
else
|
||||
noinst_LTLIBRARIES += $(comp_noinst)
|
||||
endif
|
||||
|
||||
lib@OPAL_LIB_PREFIX@mca_common_ofacm_la_SOURCES = $(headers) $(sources)
|
||||
lib@OPAL_LIB_PREFIX@mca_common_ofacm_la_CPPFLAGS = $(common_ofacm_CPPFLAGS)
|
||||
lib@OPAL_LIB_PREFIX@mca_common_ofacm_la_LDFLAGS = \
|
||||
-version-info $(libmca_common_ofacm_so_version) \
|
||||
$(common_ofacm_LDFLAGS)
|
||||
lib@OPAL_LIB_PREFIX@mca_common_ofacm_la_LIBADD = $(common_ofacm_LIBS)
|
||||
lib@OPAL_LIB_PREFIX@mca_common_ofacm_noinst_la_SOURCES = $(headers) $(sources)
|
||||
|
||||
# Conditionally install the header files
|
||||
|
||||
if WANT_INSTALL_HEADERS
|
||||
opaldir = $(opalincludedir)/opal/mca/common/ofacm
|
||||
opal_HEADERS = $(headers)
|
||||
else
|
||||
opaldir = $(includedir)
|
||||
endif
|
||||
|
||||
# See opal/mca/common/sm/Makefile.am for an explanation of the
|
||||
# the *-local rules, below.
|
||||
|
||||
V=0
|
||||
OMPI_V_LN_SCOMP = $(ompi__v_LN_SCOMP_$V)
|
||||
ompi__v_LN_SCOMP_ = $(ompi__v_LN_SCOMP_$AM_DEFAULT_VERBOSITY)
|
||||
ompi__v_LN_SCOMP_0 = @echo " LN_S " `basename $(comp_inst)`;
|
||||
|
||||
all-local:
|
||||
$(OMPI_V_LN_SCOMP) if test -z "$(lib_LTLIBRARIES)"; then \
|
||||
rm -f "$(comp_inst)"; \
|
||||
$(LN_S) "$(comp_noinst)" "$(comp_inst)"; \
|
||||
fi
|
||||
|
||||
clean-local:
|
||||
if test -z "$(lib_LTLIBRARIES)"; then \
|
||||
rm -f "$(comp_inst)"; \
|
||||
fi
|
@ -1,190 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#ifndef OPAL_COMMON_OFACM_BASE_H
|
||||
#define OPAL_COMMON_OFACM_BASE_H
|
||||
#include "opal_config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "connect.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
#define HAVE_XRC (1 == OPAL_HAVE_CONNECTX_XRC)
|
||||
|
||||
extern int opal_common_ofacm_base_output;
|
||||
extern int opal_common_ofacm_base_verbose; /* disabled by default */
|
||||
/* File for sl data produced only for a 3D-Torus Cluster */
|
||||
extern char* opal_common_ofacm_three_dim_torus;
|
||||
|
||||
static inline int opal_common_ofacm_base_err(const char* fmt, ...)
|
||||
{
|
||||
va_list list;
|
||||
int ret;
|
||||
|
||||
va_start(list, fmt);
|
||||
ret = vfprintf(stderr, fmt, list);
|
||||
va_end(list);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define OFACM_ERROR(args) \
|
||||
do { \
|
||||
opal_common_ofacm_base_err("[%s]%s[%s:%d:%s] ", \
|
||||
opal_proc_local_get()->proc_hostname, \
|
||||
OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), \
|
||||
__FILE__, __LINE__, __func__); \
|
||||
opal_common_ofacm_base_err args; \
|
||||
opal_common_ofacm_base_err("\n"); \
|
||||
} while(0);
|
||||
|
||||
#if OPAL_ENABLE_DEBUG
|
||||
#define OFACM_VERBOSE(args) \
|
||||
do { \
|
||||
if(opal_common_ofacm_base_verbose > 0) { \
|
||||
opal_common_ofacm_base_err("[%s]%s[%s:%d:%s] ",\
|
||||
opal_proc_local_get()->proc_hostname, \
|
||||
OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), \
|
||||
__FILE__, __LINE__, __func__); \
|
||||
opal_common_ofacm_base_err args; \
|
||||
opal_common_ofacm_base_err("\n"); \
|
||||
} \
|
||||
} while(0);
|
||||
#else
|
||||
#define OFACM_VERBOSE(args)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PUBLIC functions
|
||||
* ****************
|
||||
*/
|
||||
|
||||
/*
|
||||
* Open function
|
||||
*/
|
||||
OPAL_DECLSPEC int opal_common_ofacm_base_register(mca_base_component_t *base);
|
||||
|
||||
/*
|
||||
* Query CPCs to see if they want to run on a specific port.
|
||||
* Input:
|
||||
* port - port information
|
||||
* Output:
|
||||
* cpcs - list of availible cpcs
|
||||
* num_cpcs - number of cpcs
|
||||
*/
|
||||
OPAL_DECLSPEC int opal_common_ofacm_base_select_for_local_port
|
||||
(opal_common_ofacm_base_dev_desc_t *dev,
|
||||
opal_common_ofacm_base_module_t ***cpcs, int *num_cpcs);
|
||||
|
||||
/*
|
||||
* Select function
|
||||
* Input:
|
||||
* local_cpcs - local cpc modules
|
||||
* num_local_cpcs - number of local cpc modules
|
||||
* remote_cpc_data - cpc information from remote peer
|
||||
* remote_cpc_data_count - num of remote information from remote peer
|
||||
* Output:
|
||||
* ret_local_cpc - matched cpc module
|
||||
* ret_remote_cpc_data - matched remote cpc data
|
||||
*/
|
||||
OPAL_DECLSPEC int opal_common_ofacm_base_find_match
|
||||
(opal_common_ofacm_base_module_t **local_cpcs, int num_local_cpcs,
|
||||
opal_common_ofacm_base_module_data_t *remote_cpc_data, int remote_cpc_data_count,
|
||||
opal_common_ofacm_base_module_t **ret_local_cpc,
|
||||
opal_common_ofacm_base_module_data_t **ret_remote_cpc_data);
|
||||
|
||||
/*
|
||||
* Find a CPC's index so that we can send it in the modex
|
||||
*/
|
||||
OPAL_DECLSPEC int opal_common_ofacm_base_get_cpc_index
|
||||
(opal_common_ofacm_base_component_t *cpc);
|
||||
|
||||
/*
|
||||
* Start a new connection to an endpoint
|
||||
*/
|
||||
OPAL_DECLSPEC int opal_common_ofacm_base_start_connect
|
||||
(struct opal_common_ofacm_base_local_connection_context_t *context);
|
||||
|
||||
/*
|
||||
* Component-wide CPC finalize
|
||||
*/
|
||||
OPAL_DECLSPEC void opal_common_ofacm_base_finalize(void);
|
||||
|
||||
/*
|
||||
* Component-wide CPC init
|
||||
*/
|
||||
OPAL_DECLSPEC int opal_common_ofacm_base_init(void);
|
||||
|
||||
/*
|
||||
* Lookup a CPC by its index (received from the modex)
|
||||
*/
|
||||
OPAL_DECLSPEC opal_common_ofacm_base_component_t *
|
||||
opal_common_ofacm_base_get_cpc_byindex(uint8_t index);
|
||||
|
||||
/*
|
||||
* PRIVATE functions (called only by cpcs)
|
||||
* ***************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* Proc initialization function
|
||||
*/
|
||||
void opal_common_ofacm_base_proc_setup
|
||||
(opal_common_ofacm_base_proc_t *proc,
|
||||
opal_common_ofacm_base_local_connection_context_t *context,
|
||||
opal_proc_t *proc_opal);
|
||||
/*
|
||||
* Context initialization function
|
||||
*/
|
||||
int opal_common_ofacm_base_context_init
|
||||
(opal_common_ofacm_base_local_connection_context_t *context,
|
||||
opal_common_ofacm_base_module_t *cpc,
|
||||
opal_common_ofacm_base_context_connect_cb_fn_t connect_cb,
|
||||
opal_common_ofacm_base_context_error_cb_fn_t error_cb,
|
||||
opal_common_ofacm_base_context_prepare_recv_cb_fn_t prepare_recv_cb,
|
||||
opal_common_ofacm_base_proc_t *proc,
|
||||
opal_common_ofacm_base_qp_config_t *qp_config,
|
||||
struct ibv_pd *pd, uint64_t subnet_id, int cpc_type,
|
||||
uint16_t lid, uint16_t rem_lid,
|
||||
int32_t user_context_index, void *user_context);
|
||||
|
||||
/*
|
||||
* Remote context initialization.
|
||||
* Returns operation status
|
||||
*/
|
||||
int opal_common_ofacm_base_remote_context_init
|
||||
(opal_common_ofacm_base_remote_connection_context_t *context,
|
||||
int num_qps, int num_srqs);
|
||||
|
||||
/* Find OFACM proc on specific component */
|
||||
opal_common_ofacm_base_proc_t* opal_common_ofacm_base_find_proc
|
||||
(opal_common_ofacm_base_component_t *component, opal_proc_t *proc);
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Allocate a CTS frag
|
||||
*/
|
||||
int opal_common_ofacm_base_alloc_cts(
|
||||
struct mca_btl_base_endpoint_t *endpoint);
|
||||
|
||||
/*
|
||||
* Free a CTS frag
|
||||
*/
|
||||
int opal_common_ofacm_base_free_cts(
|
||||
struct mca_btl_base_endpoint_t *endpoint);
|
||||
#endif
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif
|
@ -1,699 +0,0 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2007-2013 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2007-2012 Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
* Copyright (c) 2013 Intel, Inc. All rights reserved
|
||||
* Copyright (c) 2014 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
|
||||
* reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
#include "opal_config.h"
|
||||
|
||||
#include <string.h>
|
||||
#include "base.h"
|
||||
#include "common_ofacm_oob.h"
|
||||
#include "common_ofacm_empty.h"
|
||||
#if HAVE_XRC
|
||||
#include "common_ofacm_xoob.h"
|
||||
#endif
|
||||
|
||||
#include "opal/constants.h"
|
||||
#include "opal/class/opal_list.h"
|
||||
#include "opal/util/argv.h"
|
||||
#include "opal/util/output.h"
|
||||
#include "opal/util/show_help.h"
|
||||
#include "infiniband/verbs.h"
|
||||
|
||||
static opal_common_ofacm_base_component_t **available = NULL;
|
||||
static int num_available = 0;
|
||||
static char *opal_common_ofacm_cpc_include;
|
||||
static char *opal_common_ofacm_cpc_exclude;
|
||||
|
||||
/* Global variables */
|
||||
int opal_common_ofacm_base_verbose = 0; /* disabled by default */
|
||||
char* opal_common_ofacm_three_dim_torus = NULL;
|
||||
bool cpc_explicitly_defined = false;
|
||||
int opal_common_ofacm_base_output = 1;
|
||||
bool opal_common_ofacm_base_register_was_called = false;
|
||||
bool opal_common_ofacm_base_init_was_called = false;
|
||||
/*
|
||||
* Array of all possible connection functions
|
||||
*/
|
||||
static opal_common_ofacm_base_component_t *all[] = {
|
||||
&opal_common_ofacm_oob,
|
||||
|
||||
/* Always have an entry here so that the CP indexes will always be
|
||||
the same: if XRC is not available, use the "empty" CPC */
|
||||
#if HAVE_XRC
|
||||
&opal_common_ofacm_xoob,
|
||||
#else
|
||||
&opal_common_ofacm_empty,
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
static void ofacm_base_proc_contructor (opal_common_ofacm_base_proc_t *proc)
|
||||
{
|
||||
proc->proc_opal = NULL;
|
||||
OBJ_CONSTRUCT(&proc->all_contexts, opal_list_t);
|
||||
}
|
||||
|
||||
static void ofacm_base_proc_destructor (opal_common_ofacm_base_proc_t *proc)
|
||||
{
|
||||
OBJ_DESTRUCT(&proc->all_contexts);
|
||||
}
|
||||
|
||||
void opal_common_ofacm_base_proc_setup(opal_common_ofacm_base_proc_t *proc,
|
||||
opal_common_ofacm_base_local_connection_context_t *context,
|
||||
opal_proc_t *proc_opal)
|
||||
{
|
||||
if (NULL == proc->proc_opal) {
|
||||
/* first init for the proc, lets set ompi proc */
|
||||
proc->proc_opal = proc_opal;
|
||||
}
|
||||
/* put the context on the proc list */
|
||||
opal_list_append(&proc->all_contexts, (opal_list_item_t *)context);
|
||||
}
|
||||
|
||||
OBJ_CLASS_INSTANCE(opal_common_ofacm_base_proc_t,
|
||||
opal_list_item_t,
|
||||
ofacm_base_proc_contructor,
|
||||
ofacm_base_proc_destructor);
|
||||
|
||||
/* Constructors / Destructors */
|
||||
static void base_local_context_constructor
|
||||
(opal_common_ofacm_base_local_connection_context_t *context)
|
||||
{
|
||||
context->proc = NULL;
|
||||
context->state = MCA_COMMON_OFACM_CLOSED;
|
||||
context->subnet_id = 0;
|
||||
context->lid = 0;
|
||||
context->num_of_qps = 0;
|
||||
context->init_attr = NULL;
|
||||
context->attr = NULL;
|
||||
context->ib_pd = NULL;
|
||||
context->qps = NULL;
|
||||
context->user_context = NULL;
|
||||
context->initiator = 0;
|
||||
context->index = 0;
|
||||
context->xrc_recv_qp_num = 0;
|
||||
/* remote info we will allocate and fill during qp creation */
|
||||
memset(&context->remote_info, 0, sizeof(context->remote_info));
|
||||
OBJ_CONSTRUCT(&context->context_lock, opal_mutex_t);
|
||||
}
|
||||
|
||||
static void base_local_context_destructor
|
||||
(opal_common_ofacm_base_local_connection_context_t *context)
|
||||
{
|
||||
/* Release remote data arrays */
|
||||
if (NULL != context->remote_info.rem_qps) {
|
||||
free(context->remote_info.rem_qps);
|
||||
}
|
||||
if (NULL != context->remote_info.rem_srqs) {
|
||||
free(context->remote_info.rem_srqs);
|
||||
}
|
||||
OBJ_DESTRUCT(&context->context_lock);
|
||||
}
|
||||
|
||||
OBJ_CLASS_INSTANCE(opal_common_ofacm_base_local_connection_context_t,
|
||||
opal_list_item_t,
|
||||
base_local_context_constructor,
|
||||
base_local_context_destructor);
|
||||
|
||||
int opal_common_ofacm_base_context_init(opal_common_ofacm_base_local_connection_context_t *context,
|
||||
opal_common_ofacm_base_module_t *cpc,
|
||||
opal_common_ofacm_base_context_connect_cb_fn_t connect_cb,
|
||||
opal_common_ofacm_base_context_error_cb_fn_t error_cb,
|
||||
opal_common_ofacm_base_context_prepare_recv_cb_fn_t prepare_recv_cb,
|
||||
opal_common_ofacm_base_proc_t *proc,
|
||||
opal_common_ofacm_base_qp_config_t *qp_config,
|
||||
struct ibv_pd *pd, uint64_t subnet_id, int cpc_type,
|
||||
uint16_t lid, uint16_t rem_lid,
|
||||
int32_t user_context_index, void *user_context)
|
||||
{
|
||||
context->proc = proc;
|
||||
context->cpc = cpc;
|
||||
context->subnet_id = subnet_id;
|
||||
context->cpc_type = cpc_type;
|
||||
context->lid = lid;
|
||||
context->rem_lid = rem_lid;
|
||||
context->num_of_qps = qp_config->num_qps;
|
||||
/* If upper layer defines the QPs we do not want to overwrite it */
|
||||
if (NULL == context->qps) {
|
||||
context->qps = calloc(context->num_of_qps, sizeof(opal_common_ofacm_base_qp_t));
|
||||
if(NULL == context->qps) {
|
||||
OFACM_ERROR(("Failed to allocate memory for qps"));
|
||||
return OPAL_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
}
|
||||
|
||||
context->num_of_srqs = qp_config->num_srqs;
|
||||
context->srq_num = qp_config->srq_num;
|
||||
context->init_attr = qp_config->init_attr;
|
||||
context->attr = qp_config->attr;
|
||||
context->custom_init_attr_mask = qp_config->init_attr_mask;
|
||||
context->custom_rtr_attr_mask = qp_config->rtr_attr_mask;
|
||||
context->custom_rts_attr_mask = qp_config->rts_attr_mask;
|
||||
context->ib_pd = pd;
|
||||
context->connect_cb = connect_cb;
|
||||
context->error_cb = error_cb;
|
||||
context->prepare_recv_cb = prepare_recv_cb ;
|
||||
context->index = user_context_index;
|
||||
context->user_context = user_context;
|
||||
return OPAL_SUCCESS;
|
||||
}
|
||||
|
||||
int opal_common_ofacm_base_remote_context_init(opal_common_ofacm_base_remote_connection_context_t *context,
|
||||
int num_qps, int num_srqs)
|
||||
{
|
||||
context->rem_qps = (opal_common_ofacm_base_rem_qp_info_t *)
|
||||
calloc(num_qps, sizeof(opal_common_ofacm_base_rem_qp_info_t));
|
||||
if (NULL == context->rem_qps) {
|
||||
return OPAL_ERROR;
|
||||
}
|
||||
|
||||
context->rem_srqs = (opal_common_ofacm_base_rem_srq_info_t *)
|
||||
calloc(num_qps, sizeof(opal_common_ofacm_base_rem_srq_info_t));
|
||||
if (NULL == context->rem_srqs) {
|
||||
return OPAL_ERROR;
|
||||
}
|
||||
|
||||
return OPAL_SUCCESS;
|
||||
}
|
||||
|
||||
opal_common_ofacm_base_proc_t* opal_common_ofacm_base_find_proc
|
||||
(opal_common_ofacm_base_component_t *component, opal_proc_t *proc)
|
||||
{
|
||||
opal_common_ofacm_base_proc_t *ret = NULL;
|
||||
opal_list_item_t *item;
|
||||
opal_list_t *list = &component->all_procs;
|
||||
|
||||
for (item = opal_list_get_first(list);
|
||||
item != opal_list_get_end(list);
|
||||
item = opal_list_get_next(item)) {
|
||||
if (proc == ((opal_common_ofacm_base_proc_t *)item)->proc_opal){
|
||||
ret = (opal_common_ofacm_base_proc_t *)item;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Register MCA parameters
|
||||
*/
|
||||
int opal_common_ofacm_base_register(mca_base_component_t *base)
|
||||
{
|
||||
int i, j, save;
|
||||
char **temp = NULL, *string = NULL, *all_cpc_names = NULL;
|
||||
|
||||
if (opal_common_ofacm_base_register_was_called) {
|
||||
return OPAL_SUCCESS;
|
||||
}
|
||||
|
||||
opal_common_ofacm_base_register_was_called = true;
|
||||
|
||||
/* Make an MCA parameter to select which connect module to use */
|
||||
for (i = 0; NULL != all[i]; ++i) {
|
||||
/* The CPC name "empty" is reserved for "fake" CPC modules */
|
||||
if (0 != strcmp(all[i]->cbc_name, "empty")) {
|
||||
opal_argv_append_nosize(&temp, all[i]->cbc_name);
|
||||
}
|
||||
}
|
||||
all_cpc_names = opal_argv_join(temp, ',');
|
||||
opal_argv_free(temp);
|
||||
asprintf(&string,
|
||||
"Method used to select OpenFabrics connections (valid values: %s)",
|
||||
all_cpc_names);
|
||||
|
||||
opal_common_ofacm_cpc_include = NULL;
|
||||
(void) mca_base_component_var_register(base, "ofacm_cpc_include", string,
|
||||
MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
|
||||
OPAL_INFO_LVL_9,
|
||||
MCA_BASE_VAR_SCOPE_READONLY,
|
||||
&opal_common_ofacm_cpc_include);
|
||||
free(string);
|
||||
|
||||
asprintf(&string,
|
||||
"Method used to exclude OpenFabrics connections (valid values: %s)",
|
||||
all_cpc_names);
|
||||
opal_common_ofacm_cpc_exclude = NULL;
|
||||
(void) mca_base_component_var_register(base, "ofacm_cpc_exclude", string,
|
||||
MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
|
||||
OPAL_INFO_LVL_9,
|
||||
MCA_BASE_VAR_SCOPE_READONLY,
|
||||
&opal_common_ofacm_cpc_exclude);
|
||||
free(string);
|
||||
|
||||
/* Register the name of the file containing the fabric's Service Levels (SL) */
|
||||
opal_common_ofacm_three_dim_torus = NULL;
|
||||
(void) mca_base_var_register("ompi", "common", "ofacm", "three_dim_torus",
|
||||
"The name of the file contating Service Level (SL) data for 3D-Torus cluster",
|
||||
MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
|
||||
OPAL_INFO_LVL_9,
|
||||
MCA_BASE_VAR_SCOPE_READONLY,
|
||||
&opal_common_ofacm_three_dim_torus);
|
||||
|
||||
opal_common_ofacm_base_verbose = 0;
|
||||
(void) mca_base_var_register("ompi", "common", "ofacm", "base_verbose",
|
||||
"Verbosity level of the OFACM framework",
|
||||
MCA_BASE_VAR_TYPE_INT, NULL, 0, 0,
|
||||
OPAL_INFO_LVL_9,
|
||||
MCA_BASE_VAR_SCOPE_READONLY,
|
||||
&opal_common_ofacm_base_verbose);
|
||||
|
||||
|
||||
/* Parse the if_[in|ex]clude paramters to come up with a list of
|
||||
CPCs that are available */
|
||||
available = calloc(1, sizeof(all));
|
||||
|
||||
/* If we have an "include" list, then find all those CPCs and put
|
||||
them in available[] */
|
||||
if (NULL != opal_common_ofacm_cpc_include) {
|
||||
cpc_explicitly_defined = true;
|
||||
temp = opal_argv_split(opal_common_ofacm_cpc_include, ',');
|
||||
for (save = j = 0; NULL != temp[j]; ++j) {
|
||||
for (i = 0; NULL != all[i]; ++i) {
|
||||
if (0 == strcmp(temp[j], all[i]->cbc_name)) {
|
||||
OFACM_VERBOSE(("include: saving %s", all[i]->cbc_name));
|
||||
available[save++] = all[i];
|
||||
++num_available;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (NULL == all[i]) {
|
||||
opal_show_help("help-mpi-common-ofacm-base.txt",
|
||||
"cpc name not found", true,
|
||||
"include", opal_proc_local_get()->proc_hostname,
|
||||
"include", opal_common_ofacm_cpc_include, temp[j],
|
||||
all_cpc_names);
|
||||
opal_argv_free(temp);
|
||||
free(all_cpc_names);
|
||||
return OPAL_ERR_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
opal_argv_free(temp);
|
||||
}
|
||||
|
||||
/* Otherwise, if we have an "exclude" list, take all the CPCs that
|
||||
are not in that list and put them in available[] */
|
||||
else if (NULL != opal_common_ofacm_cpc_exclude) {
|
||||
cpc_explicitly_defined = true;
|
||||
temp = opal_argv_split(opal_common_ofacm_cpc_exclude, ',');
|
||||
/* First: error check -- ensure that all the names are valid */
|
||||
for (j = 0; NULL != temp[j]; ++j) {
|
||||
for (i = 0; NULL != all[i]; ++i) {
|
||||
if (0 == strcmp(temp[j], all[i]->cbc_name)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (NULL == all[i]) {
|
||||
opal_show_help("help-mpi-common-ofacm-base.txt",
|
||||
"cpc name not found", true,
|
||||
"exclude", opal_proc_local_get()->proc_hostname,
|
||||
"exclude", opal_common_ofacm_cpc_exclude, temp[j],
|
||||
all_cpc_names);
|
||||
opal_argv_free(temp);
|
||||
free(all_cpc_names);
|
||||
return OPAL_ERR_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now do the exclude */
|
||||
for (save = i = 0; NULL != all[i]; ++i) {
|
||||
for (j = 0; NULL != temp[j]; ++j) {
|
||||
if (0 == strcmp(temp[j], all[i]->cbc_name)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (NULL == temp[j]) {
|
||||
OFACM_VERBOSE(("exclude: saving %s", all[i]->cbc_name));
|
||||
available[save++] = all[i];
|
||||
++num_available;
|
||||
}
|
||||
}
|
||||
opal_argv_free(temp);
|
||||
}
|
||||
|
||||
/* If there's no include/exclude list, copy all[] into available[] */
|
||||
else {
|
||||
OFACM_VERBOSE(("no include or exclude: saving all"));
|
||||
memcpy(available, all, sizeof(all));
|
||||
num_available = (sizeof(all) /
|
||||
sizeof(opal_common_ofacm_base_module_t *)) - 1;
|
||||
}
|
||||
|
||||
/* Call the register function on all the CPCs so that they may
|
||||
setup any MCA params specific to the connection type */
|
||||
for (i = 0; NULL != available[i]; ++i) {
|
||||
if (NULL != available[i]->cbc_register) {
|
||||
available[i]->cbc_register();
|
||||
}
|
||||
}
|
||||
|
||||
return OPAL_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called once during openib BTL component initialization to allow CPC
|
||||
* components to initialize.
|
||||
*/
|
||||
int opal_common_ofacm_base_init(void)
|
||||
{
|
||||
int i, rc;
|
||||
|
||||
if (opal_common_ofacm_base_init_was_called) {
|
||||
return OPAL_SUCCESS;
|
||||
}
|
||||
|
||||
opal_common_ofacm_base_init_was_called = true;
|
||||
|
||||
/* Call each available CPC component's open function, if it has
|
||||
one. If the CPC component open function returns OPAL_SUCCESS,
|
||||
keep it. If it returns ERR_NOT_SUPPORTED, remove it from the
|
||||
available[] array. If it returns something else, return that
|
||||
error upward. */
|
||||
for (i = num_available = 0; NULL != available[i]; ++i) {
|
||||
if (NULL == available[i]->cbc_init) {
|
||||
available[num_available++] = available[i];
|
||||
OFACM_VERBOSE(("found available cpc (NULL init): %s",
|
||||
all[i]->cbc_name));
|
||||
continue;
|
||||
}
|
||||
|
||||
rc = available[i]->cbc_init();
|
||||
if (OPAL_SUCCESS == rc) {
|
||||
available[num_available++] = available[i];
|
||||
OFACM_VERBOSE(("found available cpc (SUCCESS init): %s",
|
||||
all[i]->cbc_name));
|
||||
continue;
|
||||
} else if (OPAL_ERR_NOT_SUPPORTED == rc) {
|
||||
continue;
|
||||
} else {
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
available[num_available] = NULL;
|
||||
|
||||
return (num_available > 0) ? OPAL_SUCCESS : OPAL_ERR_NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Find all the CPCs that are eligible for a single local port (i.e.,
|
||||
* openib module).
|
||||
*/
|
||||
int opal_common_ofacm_base_select_for_local_port(opal_common_ofacm_base_dev_desc_t *dev,
|
||||
opal_common_ofacm_base_module_t ***cpcs, int *num_cpcs)
|
||||
{
|
||||
char *msg = NULL;
|
||||
int i, rc, cpc_index, len;
|
||||
opal_common_ofacm_base_module_t **tmp_cpcs;
|
||||
|
||||
tmp_cpcs = calloc(num_available,
|
||||
sizeof(opal_common_ofacm_base_module_t *));
|
||||
if (NULL == tmp_cpcs) {
|
||||
return OPAL_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
/* Go through all available CPCs and query them to see if they
|
||||
want to run on this module. If they do, save them to a running
|
||||
array. */
|
||||
for (len = 1, i = 0; NULL != available[i]; ++i) {
|
||||
len += strlen(available[i]->cbc_name) + 2;
|
||||
}
|
||||
msg = malloc(len);
|
||||
if (NULL == msg) {
|
||||
return OPAL_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
msg[0] = '\0';
|
||||
for (cpc_index = i = 0; NULL != available[i]; ++i) {
|
||||
if (i > 0) {
|
||||
strcat(msg, ", ");
|
||||
}
|
||||
strcat(msg, available[i]->cbc_name);
|
||||
|
||||
rc = available[i]->cbc_query(dev, &tmp_cpcs[cpc_index]);
|
||||
if (OPAL_ERR_NOT_SUPPORTED == rc || OPAL_ERR_UNREACH == rc) {
|
||||
continue;
|
||||
} else if (OPAL_SUCCESS != rc) {
|
||||
free(tmp_cpcs);
|
||||
free(msg);
|
||||
return rc;
|
||||
}
|
||||
OFACM_VERBOSE(("match cpc for local port: %s",
|
||||
available[i]->cbc_name));
|
||||
|
||||
/* If the CPC wants to use the CTS protocol, check to ensure
|
||||
that QP 0 is PP; if it's not, we can't use this CPC (or the
|
||||
CTS protocol) */
|
||||
/* Pasha: Wrong place to check qp type, should be moved to CMs
|
||||
if (cpcs[cpc_index]->cbm_uses_cts &&
|
||||
!BTL_OPENIB_QP_TYPE_PP(0)) {
|
||||
OFACM_VERBOSE(("this CPC only supports when the first btl_openib_receive_queues QP is a PP QP"));
|
||||
continue;
|
||||
}
|
||||
*/
|
||||
|
||||
/* This CPC has indicated that it wants to run on this openib
|
||||
BTL module. Woo hoo! */
|
||||
++cpc_index;
|
||||
}
|
||||
|
||||
/* If we got an empty array, then no CPCs were eligible. Doh! */
|
||||
if (0 == cpc_index) {
|
||||
opal_show_help("help-mpi-common-ofacm-base.txt",
|
||||
"no cpcs for port", true,
|
||||
opal_proc_local_get()->proc_hostname,
|
||||
ibv_get_device_name(dev->ib_dev),
|
||||
msg);
|
||||
free(tmp_cpcs);
|
||||
free(msg);
|
||||
return OPAL_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
free(msg);
|
||||
|
||||
/* We got at least one eligible CPC; save the array into the
|
||||
module's port_info */
|
||||
*num_cpcs = cpc_index;
|
||||
*cpcs = tmp_cpcs;
|
||||
|
||||
return OPAL_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is invoked when determining whether we have a CPC in
|
||||
* common with a specific remote port. We already know that the
|
||||
* subnet ID is the same between a specific local port and the target
|
||||
* remote port; now we need to know if we can find a CPC in common
|
||||
* between the two.
|
||||
*
|
||||
* If yes, be sure to find the *same* CPC on both sides. We know
|
||||
* which CPCs are available on each side, and we know the priorities
|
||||
* that were assigned on both sides. So find a CPC that is common to
|
||||
* both sides and has the highest overall priority (between both
|
||||
* sides).
|
||||
*
|
||||
* Return the matching CPC, or NULL if not found.
|
||||
*/
|
||||
int
|
||||
opal_common_ofacm_base_find_match(opal_common_ofacm_base_module_t **local_cpcs, int num_local_cpcs,
|
||||
opal_common_ofacm_base_module_data_t *remote_cpc_data, int remote_cpc_data_count,
|
||||
opal_common_ofacm_base_module_t **ret_local_cpc,
|
||||
opal_common_ofacm_base_module_data_t **ret_remote_cpc_data)
|
||||
{
|
||||
int i, j, max = -1;
|
||||
opal_common_ofacm_base_module_t *local_cpc, *local_selected = NULL;
|
||||
opal_common_ofacm_base_module_data_t *local_cpcd, *remote_cpcd,
|
||||
*remote_selected = NULL;
|
||||
|
||||
/* Iterate over all the CPCs on the local module */
|
||||
for (i = 0; i < num_local_cpcs; ++i) {
|
||||
local_cpc = local_cpcs[i];
|
||||
local_cpcd = &(local_cpc->data);
|
||||
|
||||
/* Iterate over all the CPCs on the remote port */
|
||||
for (j = 0; j < remote_cpc_data_count; ++j) {
|
||||
remote_cpcd = &(remote_cpc_data[j]);
|
||||
|
||||
/* Are the components the same? */
|
||||
if (local_cpcd->cbm_component == remote_cpcd->cbm_component) {
|
||||
/* If so, update the max priority found so far */
|
||||
if (max < local_cpcd->cbm_priority) {
|
||||
max = local_cpcd->cbm_priority;
|
||||
local_selected = local_cpc;
|
||||
remote_selected = remote_cpcd;
|
||||
}
|
||||
if (max < remote_cpcd->cbm_priority) {
|
||||
max = remote_cpcd->cbm_priority;
|
||||
local_selected = local_cpc;
|
||||
remote_selected = remote_cpcd;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* All done! */
|
||||
if (NULL != local_selected) {
|
||||
*ret_local_cpc = local_selected;
|
||||
*ret_remote_cpc_data = remote_selected;
|
||||
OFACM_VERBOSE(("find_match: found match!"));
|
||||
return OPAL_SUCCESS;
|
||||
} else {
|
||||
OFACM_VERBOSE(("find_match: did NOT find match!"));
|
||||
return OPAL_ERR_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Lookup a CPC component's index in the all[] array so that we can
|
||||
* send it int the modex
|
||||
*/
|
||||
int opal_common_ofacm_base_get_cpc_index(opal_common_ofacm_base_component_t *cpc)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; NULL != all[i]; ++i) {
|
||||
if (all[i] == cpc) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
/* Not found */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Lookup a CPC by its index (received from the modex)
|
||||
*/
|
||||
opal_common_ofacm_base_component_t *
|
||||
opal_common_ofacm_base_get_cpc_byindex(uint8_t index)
|
||||
{
|
||||
return (index >= (sizeof(all) /
|
||||
sizeof(opal_common_ofacm_base_module_t *))) ?
|
||||
NULL : all[index];
|
||||
}
|
||||
|
||||
/*
|
||||
* This function we never call from BTL - so it is no reason to expose it
|
||||
* in base.
|
||||
*/
|
||||
#if 0
|
||||
int opal_common_ofacm_base_alloc_cts(mca_btl_base_endpoint_t *endpoint)
|
||||
{
|
||||
opal_free_list_item_t *fli;
|
||||
int length = sizeof(mca_btl_openib_header_t) +
|
||||
sizeof(mca_btl_openib_header_coalesced_t) +
|
||||
sizeof(mca_btl_openib_control_header_t) +
|
||||
sizeof(mca_btl_openib_footer_t) +
|
||||
mca_btl_openib_component.qp_infos[mca_btl_openib_component.credits_qp].size;
|
||||
|
||||
/* Explicitly don't use the mpool registration */
|
||||
fli = &(endpoint->endpoint_cts_frag.super.super.base.super);
|
||||
fli->registration = NULL;
|
||||
fli->ptr = malloc(length);
|
||||
if (NULL == fli->ptr) {
|
||||
BTL_ERROR(("malloc failed"));
|
||||
return OPAL_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
endpoint->endpoint_cts_mr =
|
||||
ibv_reg_mr(endpoint->endpoint_btl->device->ib_pd,
|
||||
fli->ptr, length,
|
||||
IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE |
|
||||
IBV_ACCESS_REMOTE_READ);
|
||||
OPAL_OUTPUT((-1, "registered memory %p, length %d", fli->ptr, length));
|
||||
if (NULL == endpoint->endpoint_cts_mr) {
|
||||
free(fli->ptr);
|
||||
BTL_ERROR(("Failed to reg mr!"));
|
||||
return OPAL_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
/* Copy the lkey where it needs to go */
|
||||
endpoint->endpoint_cts_frag.super.sg_entry.lkey =
|
||||
endpoint->endpoint_cts_frag.super.super.segment.seg_key.key32[0] =
|
||||
endpoint->endpoint_cts_mr->lkey;
|
||||
endpoint->endpoint_cts_frag.super.sg_entry.length = length;
|
||||
|
||||
/* Construct the rest of the recv_frag_t */
|
||||
OBJ_CONSTRUCT(&(endpoint->endpoint_cts_frag), mca_btl_openib_recv_frag_t);
|
||||
endpoint->endpoint_cts_frag.super.super.base.order =
|
||||
mca_btl_openib_component.credits_qp;
|
||||
endpoint->endpoint_cts_frag.super.endpoint = endpoint;
|
||||
OPAL_OUTPUT((-1, "Got a CTS frag for peer %s, addr %p, length %d, lkey %d",
|
||||
(NULL == endpoint->endpoint_proc->proc_opal->proc_hostname) ?
|
||||
"unknown" : endpoint->endpoint_proc->proc_opal->proc_hostname,
|
||||
(void*) endpoint->endpoint_cts_frag.super.sg_entry.addr,
|
||||
endpoint->endpoint_cts_frag.super.sg_entry.length,
|
||||
endpoint->endpoint_cts_frag.super.sg_entry.lkey));
|
||||
|
||||
return OPAL_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
/* This function is needed for CTS packet release on completion..
|
||||
* and it is bad idea...it is 2 possible solutions:
|
||||
* - make the send operation blocking (simple and not optimal).
|
||||
* - rdmacm should add own progress function (best but not trivial).
|
||||
*/
|
||||
#if 0
|
||||
int opal_common_ofacm_base_free_cts(mca_btl_base_endpoint_t *endpoint)
|
||||
{
|
||||
if (NULL != endpoint->endpoint_cts_mr) {
|
||||
ibv_dereg_mr(endpoint->endpoint_cts_mr);
|
||||
endpoint->endpoint_cts_mr = NULL;
|
||||
}
|
||||
if (NULL != endpoint->endpoint_cts_frag.super.super.base.super.ptr) {
|
||||
free(endpoint->endpoint_cts_frag.super.super.base.super.ptr);
|
||||
endpoint->endpoint_cts_frag.super.super.base.super.ptr = NULL;
|
||||
OPAL_OUTPUT((-1, "Freeing CTS frag"));
|
||||
}
|
||||
|
||||
return OPAL_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Called to start a connection
|
||||
*/
|
||||
int opal_common_ofacm_base_start_connect(
|
||||
opal_common_ofacm_base_local_connection_context_t *context)
|
||||
{
|
||||
#if 0
|
||||
/* If the CPC uses the CTS protocol, provide a frag buffer for the
|
||||
CPC to post. Must allocate these frags up here in the main
|
||||
thread because the FREE_LIST_WAIT is not thread safe. */
|
||||
if (cpc->cbm_uses_cts) {
|
||||
int rc;
|
||||
rc = opal_common_ofacm_base_alloc_cts(context);
|
||||
if (OPAL_SUCCESS != rc) {
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return context->cpc->cbm_start_connect(context);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called during openib btl component close
|
||||
*/
|
||||
void opal_common_ofacm_base_finalize(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (NULL != available) {
|
||||
for (i = 0; NULL != available[i]; ++i) {
|
||||
if (NULL != available[i]->cbc_finalize) {
|
||||
available[i]->cbc_finalize();
|
||||
}
|
||||
}
|
||||
free(available);
|
||||
available = NULL;
|
||||
}
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
* Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#include "opal_config.h"
|
||||
|
||||
#include "base.h"
|
||||
#include "connect.h"
|
||||
#include "opal/constants.h"
|
||||
|
||||
static void empty_component_register(void);
|
||||
static int empty_component_init(void);
|
||||
static int empty_component_query(opal_common_ofacm_base_dev_desc_t *dev,
|
||||
opal_common_ofacm_base_module_t **cpc);
|
||||
|
||||
opal_common_ofacm_base_component_t opal_common_ofacm_empty = {
|
||||
"empty",
|
||||
empty_component_register,
|
||||
empty_component_init,
|
||||
empty_component_query,
|
||||
NULL
|
||||
};
|
||||
|
||||
static void empty_component_register(void)
|
||||
{
|
||||
/* Nothing to do */
|
||||
}
|
||||
|
||||
static int empty_component_init(void)
|
||||
{
|
||||
/* Never let this CPC run */
|
||||
return OPAL_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
static int empty_component_query(opal_common_ofacm_base_dev_desc_t *dev,
|
||||
opal_common_ofacm_base_module_t **cpc)
|
||||
{
|
||||
/* Never let this CPC run */
|
||||
return OPAL_ERR_NOT_SUPPORTED;
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
* Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#ifndef BTL_OPENIB_CONNECT_EMPTY_H
|
||||
#define BTL_OPENIB_CONNECT_EMPTY_H
|
||||
|
||||
#include "opal_config.h"
|
||||
|
||||
#include "connect.h"
|
||||
|
||||
extern opal_common_ofacm_base_component_t opal_common_ofacm_empty;
|
||||
|
||||
#endif
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
@ -1,20 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#ifndef COMMON_OFACM_OOB_H
|
||||
#define COMMON_OFACM_OOB_H
|
||||
|
||||
#include "connect.h"
|
||||
|
||||
extern opal_common_ofacm_base_component_t opal_common_ofacm_oob;
|
||||
|
||||
#endif
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
@ -1,69 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2007-2012 Mellanox Technologies. All rights reserved.
|
||||
* Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#ifndef COMMON_OFACM_XOOB_H
|
||||
#define COMMON_OFACM_XOOB_H
|
||||
|
||||
#include "opal/class/opal_hash_table.h"
|
||||
#include "connect.h"
|
||||
|
||||
extern opal_common_ofacm_base_component_t opal_common_ofacm_xoob;
|
||||
|
||||
typedef enum {
|
||||
XOOB_ADDR_CONNECTING = 100,
|
||||
XOOB_ADDR_CONNECTED,
|
||||
XOOB_ADDR_CLOSED
|
||||
} opal_common_ofacm_ib_addr_state_t;
|
||||
|
||||
struct ofacm_ib_address_t {
|
||||
opal_list_item_t super;
|
||||
void *key; /* the key with size 80bit - [subnet(64) LID(16bit)] */
|
||||
uint64_t subnet_id; /* caching subnet_id */
|
||||
uint16_t lid; /* caching lid */
|
||||
opal_list_t pending_contexts; /* list of endpoints that use this ib_address */
|
||||
struct opal_common_ofacm_base_qp_t *qps; /* pointer to qp that will be used
|
||||
for communication with the
|
||||
destination */
|
||||
uint32_t remote_xrc_rcv_qp_num; /* remote xrc qp number */
|
||||
opal_mutex_t addr_lock; /* protection */
|
||||
opal_common_ofacm_ib_addr_state_t status; /* ib port status */
|
||||
};
|
||||
typedef struct ofacm_ib_address_t
|
||||
ofacm_ib_address_t;
|
||||
|
||||
struct opal_common_ofacm_xoob_local_connection_context_t {
|
||||
opal_common_ofacm_base_local_connection_context_t super;
|
||||
ofacm_ib_address_t *addr;
|
||||
uint32_t xrc_recv_qp_num; /* in xrc we will use it as recv qp */
|
||||
uint32_t xrc_recv_psn;
|
||||
};
|
||||
typedef struct opal_common_ofacm_xoob_local_connection_context_t
|
||||
opal_common_ofacm_xoob_local_connection_context_t;
|
||||
OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_common_ofacm_xoob_local_connection_context_t);
|
||||
|
||||
struct opal_common_ofacm_xoob_module_t {
|
||||
opal_common_ofacm_base_module_t super;
|
||||
opal_hash_table_t ib_addr_table; /**< used only for xrc.hash-table that
|
||||
keeps table of all lids/subnets */
|
||||
};
|
||||
typedef struct opal_common_ofacm_xoob_module_t
|
||||
opal_common_ofacm_xoob_module_t;
|
||||
|
||||
struct pending_context_t {
|
||||
opal_list_item_t super;
|
||||
opal_common_ofacm_xoob_local_connection_context_t *xcontext;
|
||||
};
|
||||
typedef struct pending_context_t
|
||||
pending_context_t;
|
||||
OPAL_DECLSPEC OBJ_CLASS_DECLARATION(pending_context_t);
|
||||
|
||||
#endif
|
@ -1,61 +0,0 @@
|
||||
# -*- shell-script -*-
|
||||
#
|
||||
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
# University Research and Technology
|
||||
# Corporation. All rights reserved.
|
||||
# Copyright (c) 2004-2005 The University of Tennessee and The University
|
||||
# of Tennessee Research Foundation. All rights
|
||||
# reserved.
|
||||
# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
# University of Stuttgart. All rights reserved.
|
||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 2007-2009 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
|
||||
# Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
#
|
||||
# $HEADER$
|
||||
#
|
||||
|
||||
# MCA_opal_common_ofacm_CONFIG([should_build])
|
||||
# ------------------------------------------
|
||||
AC_DEFUN([MCA_opal_common_ofacm_POST_CONFIG], [
|
||||
AM_CONDITIONAL([MCA_common_ofacm_have_xrc], [test $1 -eq 1 -a "x$common_ofacm_have_xrc" = "x1"])
|
||||
])
|
||||
|
||||
|
||||
# MCA_opal_common_ofacm_CONFIG([action-if-can-compile],
|
||||
# [action-if-cant-compile])
|
||||
# ------------------------------------------------
|
||||
AC_DEFUN([MCA_opal_common_ofacm_CONFIG],[
|
||||
AC_CONFIG_FILES([opal/mca/common/ofacm/Makefile])
|
||||
OPAL_VAR_SCOPE_PUSH([modules ofacm_have_threads])
|
||||
modules="oob"
|
||||
|
||||
common_ofacm_happy="no"
|
||||
OPAL_CHECK_OPENFABRICS([common_ofacm],
|
||||
[common_ofacm_happy="yes"
|
||||
OPAL_CHECK_OPENFABRICS_CM([common_ofacm])])
|
||||
|
||||
AS_IF([test "$common_ofacm_happy" = "yes"],
|
||||
[$1],
|
||||
[$2])
|
||||
|
||||
AS_IF([test "$common_ofacm_happy" = "yes"],
|
||||
[if test "x$common_ofacm_have_xrc" = "x1"; then
|
||||
modules="$modules xoob"
|
||||
fi
|
||||
AC_MSG_CHECKING([which OpenFabrics CM modules will be built])
|
||||
AC_MSG_RESULT([$modules])])
|
||||
|
||||
# substitute in the things needed to build openib
|
||||
AC_SUBST([common_ofacm_CFLAGS])
|
||||
AC_SUBST([common_ofacm_CPPFLAGS])
|
||||
AC_SUBST([common_ofacm_LDFLAGS])
|
||||
AC_SUBST([common_ofacm_LIBS])
|
||||
|
||||
OPAL_VAR_SCOPE_POP
|
||||
])dnl
|
@ -1,542 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2009 Mellanox Technogies, Inc. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
* Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* This interface is designed to hide the back-end details of how IB
|
||||
* RC connections are made from the rest of the openib BTL. There are
|
||||
* module-like instances of the implemented functionality (dlopen and
|
||||
* friends are not used, but all the functionality is accessed through
|
||||
* struct's of function pointers, so you can swap between multiple
|
||||
* different implementations at run time, just like real components).
|
||||
* Hence, these entities are referred to as "Connect
|
||||
* Pseudo-Components" (CPCs).
|
||||
*
|
||||
* The CPCs are referenced by their names (e.g., "oob", "rdma_cm").
|
||||
*
|
||||
* CPCs are split into components and modules, similar to all other
|
||||
* MCA frameworks in this code base.
|
||||
*
|
||||
* Before diving into the CPC interface, let's discuss some
|
||||
* terminology and mappings of data structures:
|
||||
*
|
||||
* - a BTL module represents a network port (in the case of the openib
|
||||
* BTL, a LID)
|
||||
* - a CPC module represents one way to make connections to a BTL module
|
||||
* - hence, a BTL module has potentially multiple CPC modules
|
||||
* associated with it
|
||||
* - an endpoint represnts a connection between a local BTL module and
|
||||
* a remote BTL module (in the openib BTL, because of BSRQ, an
|
||||
* endpoint can contain multiple QPs)
|
||||
* - when an endpoint is created, one of the CPC modules associated
|
||||
* with the local BTL is selected and associated with the endpoint
|
||||
* (obviously, it is a CPC module that is common between the local
|
||||
* and remote BTL modules)
|
||||
* - endpoints may be created and destroyed during the MPI job
|
||||
* - endpoints are created lazily, during the first communication
|
||||
* between two peers
|
||||
* - endpoints are destroyed when two MPI processes become
|
||||
* disconnected (e.g., MPI-2 dynamics or MPI_FINALIZE)
|
||||
* - hence, BTL modules and CPC modules outlive endpoints.
|
||||
* Specifically, BTL modules and CPC modules live from MPI_INIT to
|
||||
* MPI_FINALIZE. endpoints come and go as MPI semantics demand it.
|
||||
* - therefore, CPC modules need to cache information on endpoints that
|
||||
* are specific to that connection.
|
||||
*
|
||||
* Component interface:
|
||||
*
|
||||
* - component_register(): The openib BTL's component_open() function
|
||||
* calls the connect_base_register() function, which scans all
|
||||
* compiled-in CPC's. If they have component_register() functions,
|
||||
* they are called (component_register() functions are only allowed to
|
||||
* register MCA parameters).
|
||||
*
|
||||
* NOTE: The connect_base_register() function will process the
|
||||
* btl_openib_cpc_include and btl_openib_cpc_exclude MCA parameters
|
||||
* and automatically include/exclude CPCs as relevant. If a CPC is
|
||||
* excluded, none of its other interface functions will be invoked for
|
||||
* the duration of the process.
|
||||
*
|
||||
* - component_init(): The openib BTL's component_init() function
|
||||
* calls connect_base_init(), which will invoke this query function on
|
||||
* each CPC to see if it wants to run at all. CPCs can gracefully
|
||||
* remove themselves from consideration in this process by returning
|
||||
* OPAL_ERR_NOT_SUPPORTED.
|
||||
*
|
||||
* - component_query(): The openib BTL's init_one_port() calls the
|
||||
* connect_base_select_for_local_port() function, which, for each LID
|
||||
* on that port, calls the component_query() function on every
|
||||
* available CPC on that LID. This function is intended to see if a
|
||||
* CPC can run on a sepcific openib BTL module (i.e., LID). If it
|
||||
* can, the CPC is supposed to create a CPC module that is specific to
|
||||
* that BTL/LID and return it. If it cannot, it should return
|
||||
* OPAL_ERR_NOT_SUPPORTED and be gracefully skipped for this
|
||||
* OpenFabrics port.
|
||||
*
|
||||
* component_finalize(): The openib BTL's component_close() function
|
||||
* calls connect_base_finalize(), which, in turn, calls the
|
||||
* component_finalize() function on all available CPCs. Note that all
|
||||
* CPC modules will have been finalized by this point; the CPC
|
||||
* component_finalize() function is a chance for the CPC to clean up
|
||||
* any component-specific resources.
|
||||
*
|
||||
* Module interface:
|
||||
*
|
||||
* cbm_component member: A pointer pointing to the single, global
|
||||
* instance of the CPC component. This member is used for creating a
|
||||
* unique index representing the modules' component so that it can be
|
||||
* shared with remote peer processes.
|
||||
*
|
||||
* cbm_priority member: An integer between 0 and 100, inclusive,
|
||||
* representing the priority of this CPC.
|
||||
*
|
||||
* cbm_modex_message member: A pointer to a blob buffer that will be
|
||||
* included in the modex message for this port for this CPC (it is
|
||||
* assumed that this blob is a) only understandable by the
|
||||
* corresponding CPC in the peer process, and b) contains specific
|
||||
* addressing/contact information for *this* port's CPC module).
|
||||
*
|
||||
* cbm_modex_message_len member: The length of the cbm_modex_message
|
||||
* blob, in bytes.
|
||||
*
|
||||
* cbm_endpoint_init(): Called during endpoint creation, allowing a
|
||||
* CPC module to cache information on the endpoint. A pointer to the
|
||||
* endpoint's CPC module is already cached on the endpoint.
|
||||
*
|
||||
* cbm_start_connect(): initiate a connection to a remote peer. The
|
||||
* CPC is responsible for setting itself up for asyncronous operation
|
||||
* for progressing the outgoing connection request.
|
||||
*
|
||||
* cbm_endpoint_finalize(): Called during the endpoint destrouction,
|
||||
* allowing the CPC module to destroy anything that it cached on the
|
||||
* endpoint.
|
||||
*
|
||||
* cbm_finalize(): shut down all asynchronous handling and clean up
|
||||
* any state that was setup for this CPC module/BTL. Some CPCs setup
|
||||
* asynchronous support on a per-HCA/NIC basis (vs. per-port/LID). It
|
||||
* is the reponsibility of the CPC to figure out such issues (e.g.,
|
||||
* via reference counting) -- there is no notification from the
|
||||
* upper-level BTL about when an entire HCA/NIC is no longer being
|
||||
* used. There is only this function, which tells when a specific
|
||||
* CPC/BTL module is no longer being used.
|
||||
*
|
||||
* cbm_uses_cts: a bool that indicates whether the CPC will use the
|
||||
* CTS protocol or not.
|
||||
* - if true: the CPC will post the fragment on
|
||||
* endpoint->endpoint_cts_frag as a receive buffer and will *not*
|
||||
* call opal_btl_openib_post_recvs().
|
||||
* - if false: the CPC will call opal_btl_openib_post_recvs() before
|
||||
* calling opal_btl_openib_cpc_complete().
|
||||
*
|
||||
* There are two functions in the main openib BTL that the CPC may
|
||||
* call:
|
||||
*
|
||||
* - opal_btl_openib_post_recvs(endpoint): once a QP is locally
|
||||
* connected to the remote side (but we don't know if the remote side
|
||||
* is connected to us yet), this function is invoked to post buffers
|
||||
* on the QP, setup credits for the endpoint, etc. This function is
|
||||
* *only* invoked if the CPC's cbm_uses_cts is false.
|
||||
*
|
||||
* - opal_btl_openib_cpc_complete(endpoint): once that a CPC knows
|
||||
* that a QP is connected on *both* sides, this function is invoked to
|
||||
* tell the main openib BTL "ok, you can use this connection now."
|
||||
* (e.g., the main openib BTL will either invoke the CTS protocol or
|
||||
* start sending out fragments that were queued while the connection
|
||||
* was establishing, etc.).
|
||||
*/
|
||||
#ifndef OPAL_COMMON_OFACM_CONNECT_H
|
||||
#define OPAL_COMMON_OFACM_CONNECT_H
|
||||
|
||||
/* System includes */
|
||||
#include <infiniband/verbs.h>
|
||||
|
||||
#include "opal/threads/mutex.h"
|
||||
#include "opal/class/opal_list.h"
|
||||
#include "opal/util/proc.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
#define BCF_MAX_NAME 64
|
||||
|
||||
/**
|
||||
* Must forward declare these structs to avoid include file loops.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This is struct is defined below
|
||||
*/
|
||||
struct opal_common_ofacm_base_module_t;
|
||||
|
||||
/* special capabilities */
|
||||
#define OPAL_COMMON_OFACM_XRC_ONLY 1
|
||||
#define OPAL_COMMON_OFACM_IWARP_ONLY 1 << 1
|
||||
|
||||
/**
|
||||
* State of OFACM connection.
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
/* Defines the state in which this BTL instance
|
||||
* has started the process of connection */
|
||||
MCA_COMMON_OFACM_CONNECTING,
|
||||
|
||||
/* Waiting for ack from endpoint */
|
||||
MCA_COMMON_OFACM_CONNECT_ACK,
|
||||
|
||||
/*Waiting for final connection ACK from endpoint */
|
||||
MCA_COMMON_OFACM_WAITING_ACK,
|
||||
|
||||
/* Connected ... both sender & receiver have
|
||||
* buffers associated with this connection */
|
||||
MCA_COMMON_OFACM_CONNECTED,
|
||||
|
||||
/* Connection is closed, there are no resources
|
||||
* associated with this */
|
||||
MCA_COMMON_OFACM_CLOSED,
|
||||
|
||||
/* Maximum number of retries have been used.
|
||||
* Report failure on send to upper layer */
|
||||
MCA_COMMON_OFACM_FAILED,
|
||||
|
||||
/* We found is useful to have one more
|
||||
* state that maybe utilized for user needs */
|
||||
MCA_COMMON_OFACM_USER_CUSTOM
|
||||
} opal_common_ofacm_connection_state_t;
|
||||
|
||||
typedef enum {
|
||||
MCA_COMMON_OFACM_BTL = 0,
|
||||
MCA_COMMON_OFACM_COLL = 100
|
||||
} opal_common_ofacm_type;
|
||||
|
||||
typedef struct opal_common_ofacm_base_dev_desc_t {
|
||||
struct ibv_device* ib_dev; /* device */
|
||||
struct ibv_context* ib_dev_context; /* device context */
|
||||
int capabilities; /* Special capabilities like: XRC, Iwarp, etc.. */
|
||||
} opal_common_ofacm_base_dev_desc_t;
|
||||
|
||||
/* QPs configuration container that should be filled by
|
||||
* upper layer, for example - btl */
|
||||
typedef struct opal_common_ofacm_base_qp_config_t {
|
||||
int num_qps;
|
||||
int num_srqs;
|
||||
struct ibv_qp_init_attr *init_attr;
|
||||
struct ibv_qp_attr *attr;
|
||||
uint32_t *srq_num;
|
||||
uint32_t *init_attr_mask;
|
||||
uint32_t *rtr_attr_mask;
|
||||
uint32_t *rts_attr_mask;
|
||||
} opal_common_ofacm_base_qp_config_t;
|
||||
|
||||
/* QP base data */
|
||||
typedef struct opal_common_ofacm_base_qp_t {
|
||||
struct ibv_qp *lcl_qp;
|
||||
size_t ib_inline_max; /**< max size of IB inline send */
|
||||
uint32_t lcl_psn;
|
||||
int32_t sd_wqe; /**< number of available send wqe entries */
|
||||
int users;
|
||||
opal_mutex_t lock;
|
||||
} opal_common_ofacm_base_qp_t;
|
||||
|
||||
/* Remote QP info */
|
||||
typedef struct opal_common_ofacm_base_rem_qp_info_t {
|
||||
uint32_t rem_qp_num;
|
||||
/* Remote QP number */
|
||||
uint32_t rem_psn;
|
||||
/* Remote processes port sequence number */
|
||||
} opal_common_ofacm_base_rem_qp_info_t;
|
||||
|
||||
/* Remote SRQ info */
|
||||
typedef struct opal_common_ofacm_base_rem_srq_info_t {
|
||||
/* Remote SRQ number */
|
||||
uint32_t rem_srq_num;
|
||||
} opal_common_ofacm_base_rem_srq_info_t;
|
||||
|
||||
/* Remote connection context */
|
||||
typedef struct opal_common_ofacm_base_remote_connection_context_t {
|
||||
opal_object_t super;
|
||||
/* Local identifier of the remote process */
|
||||
uint16_t rem_lid;
|
||||
/* subnet id of remote process */
|
||||
uint64_t rem_subnet_id;
|
||||
/* MTU of remote process */
|
||||
uint32_t rem_mtu; /* TBD: not sure that i need this one */
|
||||
/* index of remote endpoint in endpoint array */
|
||||
uint32_t rem_index; /* TBD: the index we use as immidiate data */
|
||||
/* Remote QPs */
|
||||
opal_common_ofacm_base_rem_qp_info_t *rem_qps;
|
||||
/* Remote xrc_srq info, used only with XRC connections */
|
||||
opal_common_ofacm_base_rem_srq_info_t *rem_srqs;
|
||||
} opal_common_ofacm_base_remote_connection_context_t;
|
||||
|
||||
typedef struct opal_common_ofacm_base_proc_t {
|
||||
opal_list_item_t super;
|
||||
opal_proc_t *proc_opal; /* target proc */
|
||||
opal_list_t all_contexts; /* list of all contexts connected to
|
||||
this endpoint*/
|
||||
} opal_common_ofacm_base_proc_t;
|
||||
OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_common_ofacm_base_proc_t);
|
||||
|
||||
/* Connection call back function that is called on connection setup */
|
||||
typedef void (*opal_common_ofacm_base_context_connect_cb_fn_t)(void *);
|
||||
|
||||
/* Connection call back function that is called on context error */
|
||||
typedef void (*opal_common_ofacm_base_context_error_cb_fn_t)(void *);
|
||||
/* Prepare recive call back function that is when recv side should be prepared,
|
||||
* for example recv packet prepost */
|
||||
typedef int (*opal_common_ofacm_base_context_prepare_recv_cb_fn_t)(void *);
|
||||
|
||||
/* Basic connection context
|
||||
* ========================
|
||||
* The initial connection contxet is created during endpoint initialazation call.
|
||||
* Each CPC will return opal_common_ofacm_base_local_connection_context_t that
|
||||
* is based on CPC connection context.
|
||||
*
|
||||
* As Input for context creation user must provide:
|
||||
* ================================================
|
||||
* number of QPs
|
||||
* qp init atributes
|
||||
* qp standart attribute
|
||||
* pointer to protection domain
|
||||
* pointer to user context (for example pointer to endpoint in case of btl)
|
||||
*/
|
||||
typedef struct opal_common_ofacm_base_local_connection_context_t {
|
||||
opal_list_item_t super;
|
||||
struct opal_common_ofacm_base_proc_t *proc; /* target proc */
|
||||
struct opal_common_ofacm_base_module_t *cpc; /* Pointer to context cpc */
|
||||
opal_common_ofacm_connection_state_t state; /* Connection context status */
|
||||
uint64_t subnet_id; /* caching subnet_id */
|
||||
int cpc_type; /* connection manager family: openib, coll, etc..*/
|
||||
uint16_t lid; /* caching lid */
|
||||
uint16_t rem_lid; /* remote lid */
|
||||
uint8_t num_of_qps; /* Number of qps that we want to open */
|
||||
struct opal_common_ofacm_base_qp_t *qps; /* qps data */
|
||||
uint8_t num_of_srqs; /* Number of qps that we want to open */
|
||||
uint32_t *srq_num; /* srq numbers for recv on this context */
|
||||
struct ibv_qp_init_attr *init_attr; /* list of initial attr for each qp */
|
||||
struct ibv_qp_attr *attr; /* qp attributes */
|
||||
struct ibv_pd* ib_pd; /* protection domain */
|
||||
uint32_t *custom_init_attr_mask; /* in additional to standard attr_mask we want allow to user
|
||||
specify special custom masks for init */
|
||||
uint32_t *custom_rtr_attr_mask; /* in additional to standard attr_mask we want allow to user
|
||||
specify special custom masks for rtr */
|
||||
uint32_t *custom_rts_attr_mask; /* in additional to standard attr_mask we want allow to user
|
||||
specify special custom masks for rts */
|
||||
void *user_context; /* back pointer to endpoint */
|
||||
opal_common_ofacm_base_context_connect_cb_fn_t connect_cb; /* Connection callback function */
|
||||
opal_common_ofacm_base_context_error_cb_fn_t error_cb; /* Error callback function */
|
||||
opal_common_ofacm_base_context_prepare_recv_cb_fn_t prepare_recv_cb; /* Prepare recv side
|
||||
(prepost) callback function */
|
||||
/* TBD: Need to check when we can update the index. I think during endpoint creation we do not
|
||||
* have it. It mean that BTL should some how to update it later ...*/
|
||||
int32_t index; /* user context index */
|
||||
bool initiator; /* initiator of connection ? */
|
||||
opal_common_ofacm_base_remote_connection_context_t remote_info; /* data about remote side of this
|
||||
connection*/
|
||||
uint32_t xrc_recv_qp_num ; /* in xrc we will use it as recv qp */
|
||||
|
||||
opal_mutex_t context_lock; /* protection */
|
||||
} opal_common_ofacm_base_local_connection_context_t;
|
||||
OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_common_ofacm_base_local_connection_context_t);
|
||||
/* Constructor and destructor are located in common_ofacm_base.c */
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
/**
|
||||
* Function to register MCA params in the connect functions. It
|
||||
* returns no value, so it cannot fail.
|
||||
*/
|
||||
typedef void (*opal_common_ofacm_base_component_register_fn_t)(void);
|
||||
|
||||
/**
|
||||
* This function is invoked once by the openib BTL component during
|
||||
* startup. It is intended to have CPC component-wide startup.
|
||||
*
|
||||
* Return value:
|
||||
*
|
||||
* - OPAL_SUCCESS: this CPC component will be used in selection during
|
||||
* this process.
|
||||
*
|
||||
* - OPAL_ERR_NOT_SUPPORTED: this CPC component will be silently
|
||||
* ignored in this process.
|
||||
*
|
||||
* - Other OPAL_ERR_* values: the error will be propagated upwards,
|
||||
* likely causing a fatal error (and/or the openib BTL component
|
||||
* being ignored).
|
||||
*/
|
||||
typedef int (*opal_common_ofacm_base_component_init_fn_t)(void);
|
||||
|
||||
/**
|
||||
* Query the CPC to see if it wants to run on a specific port (i.e., a
|
||||
* specific BTL module). If the component init function previously
|
||||
* returned OPAL_SUCCESS, this function is invoked once per BTL module
|
||||
* creation (i.e., for each port found by an MPI process). If this
|
||||
* CPC wants to be used on this BTL module, it returns a CPC module
|
||||
* that is specific to this BTL module.
|
||||
*
|
||||
* The BTL module in question is passed to the function; all of its
|
||||
* attributes can be used to query to see if it's eligible for this
|
||||
* CPC.
|
||||
*
|
||||
* If it is eligible, the CPC is responsible for creating a
|
||||
* corresponding CPC module, filling in all the relevant fields on the
|
||||
* modules, and for setting itself up to run (per above) and returning
|
||||
* a CPC module (this is effectively the "module_init" function).
|
||||
* Note that the module priority must be between 0 and 100
|
||||
* (inclusive). When multiple CPCs are eligible for a single module,
|
||||
* the CPC with the highest priority will be used.
|
||||
*
|
||||
* Return value:
|
||||
*
|
||||
* - OPAL_SUCCESS if this CPC is eligible for and was able to be setup
|
||||
* for this BTL module. It is assumed that the CPC is now completely
|
||||
* setup to run on this openib module (per description above).
|
||||
*
|
||||
* - OPAL_ERR_NOT_SUPPORTED if this CPC cannot support this BTL
|
||||
* module. This is not an error; it's just the CPC saying "sorry, I
|
||||
* cannot support this BTL module."
|
||||
*
|
||||
* - Other OPAL_ERR_* code: an error occurred.
|
||||
*/
|
||||
typedef int (*opal_common_ofacm_base_func_component_query_t)
|
||||
(struct opal_common_ofacm_base_dev_desc_t *dev,
|
||||
struct opal_common_ofacm_base_module_t **cpc);
|
||||
|
||||
/**
|
||||
* This function is invoked once by the openib BTL component during
|
||||
* shutdown. It is intended to have CPC component-wide shutdown.
|
||||
*/
|
||||
typedef int (*opal_common_ofacm_base_component_finalize_fn_t)(void);
|
||||
|
||||
/**
|
||||
* CPC component struct
|
||||
*/
|
||||
typedef struct opal_common_ofacm_base_component_t {
|
||||
/** Name of this set of connection functions */
|
||||
char cbc_name[BCF_MAX_NAME];
|
||||
|
||||
/** Register function. Can be NULL. */
|
||||
opal_common_ofacm_base_component_register_fn_t cbc_register;
|
||||
|
||||
/** CPC component init function. Can be NULL. */
|
||||
opal_common_ofacm_base_component_init_fn_t cbc_init;
|
||||
|
||||
/** Query the CPC component to get a CPC module corresponding to
|
||||
an openib BTL module. Cannot be NULL. */
|
||||
opal_common_ofacm_base_func_component_query_t cbc_query;
|
||||
|
||||
/** CPC component finalize function. Can be NULL. */
|
||||
opal_common_ofacm_base_component_finalize_fn_t cbc_finalize;
|
||||
/** All connection contexts that are using this CPC **/
|
||||
opal_list_t all_procs;
|
||||
} opal_common_ofacm_base_component_t;
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
/**
|
||||
* Function called when an endpoint has been created and has been
|
||||
* associated with a CPC.
|
||||
*/
|
||||
typedef opal_common_ofacm_base_local_connection_context_t*
|
||||
(*opal_common_ofacm_base_module_endpoint_init_fn_t)
|
||||
(opal_proc_t *proc,
|
||||
opal_common_ofacm_base_qp_config_t *qp_config, struct ibv_pd *pd,
|
||||
uint64_t subnet_id, int cpc_type, uint16_t lid, uint16_t rem_lid,
|
||||
int32_t user_context_index, void *user_context,
|
||||
struct opal_common_ofacm_base_module_t *cpc,
|
||||
opal_common_ofacm_base_context_connect_cb_fn_t connect_cb,
|
||||
opal_common_ofacm_base_context_error_cb_fn_t error_cb,
|
||||
opal_common_ofacm_base_context_prepare_recv_cb_fn_t prepare_recv_cb);
|
||||
|
||||
/**
|
||||
* Function to initiate a connection to a remote process.
|
||||
*/
|
||||
typedef int (*opal_common_ofacm_base_module_start_connect_fn_t)
|
||||
(struct opal_common_ofacm_base_local_connection_context_t *context);
|
||||
|
||||
/**
|
||||
* Function called when an endpoint is being destroyed.
|
||||
*/
|
||||
typedef int (*opal_common_ofacm_base_module_endpoint_finalize_fn_t)
|
||||
(struct opal_common_ofacm_base_local_connection_context_t *context);
|
||||
|
||||
/**
|
||||
* Function to finalize the CPC module. It is called once when the
|
||||
* CPC module's corresponding openib BTL module is being finalized.
|
||||
*/
|
||||
typedef int (*opal_common_ofacm_base_module_finalize_fn_t)(void);
|
||||
|
||||
/**
|
||||
* Error callback that is called by cpc module on error.
|
||||
* The callback should be set on upper layer (for example BTL)
|
||||
*/
|
||||
typedef int (*opal_common_ofacm_base_module_error_cb_fn_t)(void *);
|
||||
/**
|
||||
* Meta data about a CPC module. This is in a standalone struct
|
||||
* because it is used in both the CPC module struct and the
|
||||
* openib_btl_proc_t struct to hold information received from the
|
||||
* modex.
|
||||
*/
|
||||
typedef struct opal_common_ofacm_base_module_data_t {
|
||||
/** Pointer back to the component. Used by the base and openib
|
||||
btl to calculate this module's index for the modex. */
|
||||
opal_common_ofacm_base_component_t *cbm_component;
|
||||
|
||||
/** Priority of the CPC module (must be >=0 and <=100) */
|
||||
uint8_t cbm_priority;
|
||||
|
||||
/** Blob that the CPC wants to include in the openib modex message
|
||||
for a specific port, or NULL if the CPC does not want to
|
||||
include a message in the modex. */
|
||||
void *cbm_modex_message;
|
||||
|
||||
/** Length of the cbm_modex_message blob (0 if
|
||||
cbm_modex_message==NULL). The message is intended to be short
|
||||
(because the size of the modex broadcast is a function of
|
||||
sum(cbm_modex_message_len[i]) for
|
||||
i=(0...total_num_ports_in_MPI_job) -- e.g., IBCM imposes its
|
||||
own [very short] limits (per IBTA volume 1, chapter 12). */
|
||||
uint8_t cbm_modex_message_len;
|
||||
} opal_common_ofacm_base_module_data_t;
|
||||
|
||||
/**
|
||||
* Struct for holding CPC module and associated meta data
|
||||
*/
|
||||
typedef struct opal_common_ofacm_base_module_t {
|
||||
/** Meta data about the module */
|
||||
opal_common_ofacm_base_module_data_t data;
|
||||
|
||||
/** Endpoint initialization function */
|
||||
opal_common_ofacm_base_module_endpoint_init_fn_t cbm_endpoint_init;
|
||||
|
||||
/** Connect function */
|
||||
opal_common_ofacm_base_module_start_connect_fn_t cbm_start_connect;
|
||||
|
||||
/** Endpoint finalization function */
|
||||
opal_common_ofacm_base_module_endpoint_finalize_fn_t cbm_endpoint_finalize;
|
||||
|
||||
/** Finalize the cpc module */
|
||||
opal_common_ofacm_base_module_finalize_fn_t cbm_finalize;
|
||||
|
||||
/** Whether this module will use the CTS protocol or not. This
|
||||
directly states whether this module will call
|
||||
mca_btl_openib_endpoint_post_recvs() or not: true = this
|
||||
module will *not* call _post_recvs() and instead will post the
|
||||
receive buffer provided at endpoint->endpoint_cts_frag on qp
|
||||
0. */
|
||||
bool cbm_uses_cts;
|
||||
} opal_common_ofacm_base_module_t;
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif
|
@ -1,41 +0,0 @@
|
||||
# -*- text -*-
|
||||
#
|
||||
# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
# Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
#
|
||||
# $HEADER$
|
||||
#
|
||||
# This is the US/English help file for Open MPI's OpenFabrics IB CPC
|
||||
# support.
|
||||
#
|
||||
[no cpcs for port]
|
||||
No OpenFabrics connection schemes reported that they were able to be
|
||||
used on a specific port. As such, the openib BTL (OpenFabrics
|
||||
support) will be disabled for this port.
|
||||
|
||||
Local host: %s
|
||||
Local device: %s
|
||||
CPCs attempted: %s
|
||||
#
|
||||
[cpc name not found]
|
||||
An invalid CPC name was specified via the btl_openib_cpc_%s MCA
|
||||
parameter.
|
||||
|
||||
Local host: %s
|
||||
btl_openib_cpc_%s value: %s
|
||||
Invalid name: %s
|
||||
All possible valid names: %s
|
||||
#
|
||||
[inline truncated]
|
||||
WARNING: The btl_openib_max_inline_data MCA parameter was used to
|
||||
specify how much inline data should be used, but a device reduced this
|
||||
value. This is not an error; it simply means that your run will use
|
||||
a smaller inline data value than was requested.
|
||||
|
||||
Local host: %s
|
||||
Requested value: %d
|
||||
Value used by device: %d
|
@ -1,20 +0,0 @@
|
||||
# -*- text -*-
|
||||
#
|
||||
# Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
|
||||
# Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
#
|
||||
# $HEADER$
|
||||
#
|
||||
[ofacm oob fatal error]
|
||||
The OOB OpenFabrics Connection Manager module tried to raise fatal error,
|
||||
but failed.
|
||||
|
||||
Local host: %s
|
||||
Source file: %s
|
||||
Source line: %d
|
||||
|
||||
Your job is now going to abort, sorry.
|
||||
#
|
@ -1,7 +0,0 @@
|
||||
#
|
||||
# owner/status file
|
||||
# owner: institution that is responsible for this package
|
||||
# status: e.g. active, maintenance, unmaintained
|
||||
#
|
||||
owner: nobody
|
||||
status: dead?
|
Загрузка…
x
Ссылка в новой задаче
Block a user