2005-07-01 01:28:35 +04:00
|
|
|
/*
|
2007-03-17 02:11:45 +03:00
|
|
|
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
|
2005-11-05 22:57:48 +03:00
|
|
|
* 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.
|
2005-07-01 01:28:35 +04:00
|
|
|
* 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.
|
2007-01-13 17:22:42 +03:00
|
|
|
* Copyright (c) 2006-2007 Cisco Systems, Inc. All rights reserved.
|
2007-02-15 21:03:20 +03:00
|
|
|
* Copyright (c) 2006-2007 Mellanox Technologies. All rights reserved.
|
2005-07-01 01:28:35 +04:00
|
|
|
* $COPYRIGHT$
|
|
|
|
*
|
|
|
|
* Additional copyrights may follow
|
|
|
|
*
|
|
|
|
* $HEADER$
|
Bring over all the work from the /tmp/ib-hw-detect branch. In
addition to my design and testing, it was conceptually approved by
Gil, Gleb, Pasha, Brad, and Galen. Functionally [probably somewhat
lightly] tested by Galen. We may still have to shake out some bugs
during the next few months, but it seems to be working for all the
cases that I can throw at it.
Here's a summary of the changes from that branch:
* Move MCA parameter registration to a new file (btl_openib_mca.c):
* Properly check the retun status of registering MCA params
* Check for valid values of MCA parameters
* Make help strings better
* Otherwise, the only default value of an MCA param that was
changed was max_btls; it went from 4 to -1 (meaning: use all
available)
* Properly prototyped internal functions in _component.c
* Made a bunch of functions static that didn't need to be public
* Renamed to remove "mca_" prefix from static functions
* Call new MCA param registration function
* Call new INI file read/lookup/finalize functions
* Updated a bunch of macros to be "BTL_" instead of "ORTE_"
* Be a little more consistent with return values
* Handle -1 for the max_btls MCA param
* Fixed a free() that should have been an OBJ_RELEASE()
* Some re-indenting
* Added INI-file parsing
* New flex file: btl_openib_ini.l
* New default HCA params .ini file (probably to be expanded over
time by other HCA vendors)
* Added more show_help messages for parsing problems
* Read in INI files and cache the values for later lookup
* When component opens an HCA, lookup to see if any corresponding
values were found in the INI files (ID'ed by the HCA vendor_id
and vendor_part_id)
* Added btl_openib_verbose MCA param that shows what the INI-file
stuff does (e.g., shows which MTU your HCA ends up using)
* Added btl_openib_hca_param_files as a colon-delimited list of INI
files to check for values during startup (in order,
left-to-right, just like the MCA base directory param).
* MTU is currently the only value supported in this framework.
* It is not a fatal error if we don't find params for the HCA in
the INI file(s). Instead, just print a warning. New MCA param
btl_openib_warn_no_hca_params_found can be used to disable
printing the warning.
* Add MTU to peer negotiation when making a connection
* Exchange maximum MTU; select the lesser of the two
This commit was SVN r11182.
2006-08-14 23:30:37 +04:00
|
|
|
*
|
2005-07-01 01:28:35 +04:00
|
|
|
* @file
|
|
|
|
*/
|
Bring over all the work from the /tmp/ib-hw-detect branch. In
addition to my design and testing, it was conceptually approved by
Gil, Gleb, Pasha, Brad, and Galen. Functionally [probably somewhat
lightly] tested by Galen. We may still have to shake out some bugs
during the next few months, but it seems to be working for all the
cases that I can throw at it.
Here's a summary of the changes from that branch:
* Move MCA parameter registration to a new file (btl_openib_mca.c):
* Properly check the retun status of registering MCA params
* Check for valid values of MCA parameters
* Make help strings better
* Otherwise, the only default value of an MCA param that was
changed was max_btls; it went from 4 to -1 (meaning: use all
available)
* Properly prototyped internal functions in _component.c
* Made a bunch of functions static that didn't need to be public
* Renamed to remove "mca_" prefix from static functions
* Call new MCA param registration function
* Call new INI file read/lookup/finalize functions
* Updated a bunch of macros to be "BTL_" instead of "ORTE_"
* Be a little more consistent with return values
* Handle -1 for the max_btls MCA param
* Fixed a free() that should have been an OBJ_RELEASE()
* Some re-indenting
* Added INI-file parsing
* New flex file: btl_openib_ini.l
* New default HCA params .ini file (probably to be expanded over
time by other HCA vendors)
* Added more show_help messages for parsing problems
* Read in INI files and cache the values for later lookup
* When component opens an HCA, lookup to see if any corresponding
values were found in the INI files (ID'ed by the HCA vendor_id
and vendor_part_id)
* Added btl_openib_verbose MCA param that shows what the INI-file
stuff does (e.g., shows which MTU your HCA ends up using)
* Added btl_openib_hca_param_files as a colon-delimited list of INI
files to check for values during startup (in order,
left-to-right, just like the MCA base directory param).
* MTU is currently the only value supported in this framework.
* It is not a fatal error if we don't find params for the HCA in
the INI file(s). Instead, just print a warning. New MCA param
btl_openib_warn_no_hca_params_found can be used to disable
printing the warning.
* Add MTU to peer negotiation when making a connection
* Exchange maximum MTU; select the lesser of the two
This commit was SVN r11182.
2006-08-14 23:30:37 +04:00
|
|
|
|
2005-07-01 01:28:35 +04:00
|
|
|
#ifndef MCA_PTL_IB_H
|
|
|
|
#define MCA_PTL_IB_H
|
|
|
|
|
|
|
|
/* Standard system includes */
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <string.h>
|
2006-06-28 11:23:08 +04:00
|
|
|
#include <infiniband/verbs.h>
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
/* Open MPI includes */
|
2006-02-12 04:33:29 +03:00
|
|
|
#include "ompi/class/ompi_free_list.h"
|
|
|
|
#include "ompi/class/ompi_bitmap.h"
|
2006-03-26 12:30:50 +04:00
|
|
|
#include "orte/class/orte_pointer_array.h"
|
2005-07-04 03:09:55 +04:00
|
|
|
#include "opal/event/event.h"
|
2006-02-12 04:33:29 +03:00
|
|
|
#include "ompi/mca/pml/pml.h"
|
|
|
|
#include "ompi/mca/btl/btl.h"
|
2005-07-04 03:31:27 +04:00
|
|
|
#include "opal/util/output.h"
|
2006-02-12 04:33:29 +03:00
|
|
|
#include "ompi/mca/mpool/mpool.h"
|
|
|
|
#include "ompi/mca/btl/base/btl_base_error.h"
|
2005-07-01 01:28:35 +04:00
|
|
|
|
2006-02-12 04:33:29 +03:00
|
|
|
#include "ompi/mca/btl/btl.h"
|
|
|
|
#include "ompi/mca/btl/base/base.h"
|
2006-09-07 17:05:41 +04:00
|
|
|
|
|
|
|
#include "btl_openib_frag.h"
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
#if defined(c_plusplus) || defined(__cplusplus)
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define MCA_BTL_IB_LEAVE_PINNED 1
|
2006-09-26 16:12:33 +04:00
|
|
|
#define IB_DEFAULT_GID_PREFIX 0xfe80000000000000ll
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Infiniband (IB) BTL component.
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct mca_btl_openib_component_t {
|
2006-08-18 02:02:01 +04:00
|
|
|
mca_btl_base_component_1_0_1_t super; /**< base BTL component */
|
2006-03-13 20:03:21 +03:00
|
|
|
|
|
|
|
int ib_max_btls;
|
|
|
|
/**< maximum number of hcas available to the IB component */
|
2005-07-01 01:28:35 +04:00
|
|
|
|
2006-06-01 06:32:18 +04:00
|
|
|
int ib_num_btls;
|
2005-07-01 01:28:35 +04:00
|
|
|
/**< number of hcas available to the IB component */
|
|
|
|
|
2005-07-12 17:38:54 +04:00
|
|
|
struct mca_btl_openib_module_t *openib_btls;
|
2005-07-01 01:28:35 +04:00
|
|
|
/**< array of available PTLs */
|
|
|
|
|
|
|
|
int ib_free_list_num;
|
|
|
|
/**< initial size of free lists */
|
|
|
|
|
|
|
|
int ib_free_list_max;
|
|
|
|
/**< maximum size of free lists */
|
|
|
|
|
|
|
|
int ib_free_list_inc;
|
|
|
|
/**< number of elements to alloc when growing free lists */
|
|
|
|
|
2005-07-03 20:22:16 +04:00
|
|
|
opal_list_t ib_procs;
|
2005-07-01 01:28:35 +04:00
|
|
|
/**< list of ib proc structures */
|
|
|
|
|
2005-07-04 03:09:55 +04:00
|
|
|
opal_event_t ib_send_event;
|
2005-07-01 01:28:35 +04:00
|
|
|
/**< event structure for sends */
|
|
|
|
|
2005-07-04 03:09:55 +04:00
|
|
|
opal_event_t ib_recv_event;
|
2005-07-01 01:28:35 +04:00
|
|
|
/**< event structure for recvs */
|
|
|
|
|
2005-07-04 02:45:48 +04:00
|
|
|
opal_mutex_t ib_lock;
|
2005-07-01 01:28:35 +04:00
|
|
|
/**< lock for accessing module state */
|
|
|
|
|
|
|
|
char* ib_mpool_name;
|
|
|
|
/**< name of ib memory pool */
|
|
|
|
|
2005-11-10 23:15:02 +03:00
|
|
|
int32_t rd_num; /**< the number of receive descriptors to post to each queue pair */
|
|
|
|
int32_t rd_low; /**< low water mark to reach before posting additional receive descriptors */
|
|
|
|
int32_t rd_win; /**< ack credits when window size exceeded */
|
|
|
|
int32_t rd_rsv; /**< descriptors held in reserve for control messages */
|
|
|
|
|
2005-11-11 02:29:54 +03:00
|
|
|
int32_t srq_rd_max; /* maximum number of receive descriptors posted */
|
2005-11-10 23:15:02 +03:00
|
|
|
int32_t srq_rd_per_peer; /* number of receive descriptors to post per log2(peers) in SRQ mode */
|
2005-11-11 02:29:54 +03:00
|
|
|
int32_t srq_sd_max; /* maximum number of send descriptors posted */
|
2005-11-10 23:15:02 +03:00
|
|
|
|
2005-07-01 01:28:35 +04:00
|
|
|
size_t eager_limit;
|
|
|
|
size_t max_send_size;
|
|
|
|
uint32_t reg_mru_len;
|
2005-10-02 22:58:57 +04:00
|
|
|
uint32_t use_srq;
|
|
|
|
|
2005-07-15 19:13:19 +04:00
|
|
|
uint32_t ib_cq_size; /**< Max outstanding CQE on the CQ */
|
|
|
|
uint32_t ib_sg_list_size; /**< Max scatter/gather descriptor entries on the WQ*/
|
|
|
|
uint32_t ib_pkey_ix;
|
2007-04-22 14:22:12 +04:00
|
|
|
uint32_t ib_pkey_val;
|
2005-07-15 19:13:19 +04:00
|
|
|
uint32_t ib_psn;
|
|
|
|
uint32_t ib_qp_ous_rd_atom;
|
|
|
|
uint32_t ib_mtu;
|
|
|
|
uint32_t ib_min_rnr_timer;
|
|
|
|
uint32_t ib_timeout;
|
|
|
|
uint32_t ib_retry_count;
|
|
|
|
uint32_t ib_rnr_retry;
|
|
|
|
uint32_t ib_max_rdma_dst_ops;
|
|
|
|
uint32_t ib_service_level;
|
|
|
|
uint32_t ib_static_rate;
|
2006-03-26 12:30:50 +04:00
|
|
|
uint32_t use_eager_rdma;
|
2006-09-05 13:16:22 +04:00
|
|
|
int32_t eager_rdma_threshold;
|
2006-03-26 12:30:50 +04:00
|
|
|
uint32_t eager_rdma_num;
|
2006-10-31 20:29:25 +03:00
|
|
|
int32_t max_eager_rdma;
|
2006-06-28 11:23:08 +04:00
|
|
|
uint32_t btls_per_lid;
|
|
|
|
uint32_t max_lmc;
|
2006-07-20 18:39:05 +04:00
|
|
|
uint32_t buffer_alignment;
|
2005-07-15 19:13:19 +04:00
|
|
|
|
Bring over all the work from the /tmp/ib-hw-detect branch. In
addition to my design and testing, it was conceptually approved by
Gil, Gleb, Pasha, Brad, and Galen. Functionally [probably somewhat
lightly] tested by Galen. We may still have to shake out some bugs
during the next few months, but it seems to be working for all the
cases that I can throw at it.
Here's a summary of the changes from that branch:
* Move MCA parameter registration to a new file (btl_openib_mca.c):
* Properly check the retun status of registering MCA params
* Check for valid values of MCA parameters
* Make help strings better
* Otherwise, the only default value of an MCA param that was
changed was max_btls; it went from 4 to -1 (meaning: use all
available)
* Properly prototyped internal functions in _component.c
* Made a bunch of functions static that didn't need to be public
* Renamed to remove "mca_" prefix from static functions
* Call new MCA param registration function
* Call new INI file read/lookup/finalize functions
* Updated a bunch of macros to be "BTL_" instead of "ORTE_"
* Be a little more consistent with return values
* Handle -1 for the max_btls MCA param
* Fixed a free() that should have been an OBJ_RELEASE()
* Some re-indenting
* Added INI-file parsing
* New flex file: btl_openib_ini.l
* New default HCA params .ini file (probably to be expanded over
time by other HCA vendors)
* Added more show_help messages for parsing problems
* Read in INI files and cache the values for later lookup
* When component opens an HCA, lookup to see if any corresponding
values were found in the INI files (ID'ed by the HCA vendor_id
and vendor_part_id)
* Added btl_openib_verbose MCA param that shows what the INI-file
stuff does (e.g., shows which MTU your HCA ends up using)
* Added btl_openib_hca_param_files as a colon-delimited list of INI
files to check for values during startup (in order,
left-to-right, just like the MCA base directory param).
* MTU is currently the only value supported in this framework.
* It is not a fatal error if we don't find params for the HCA in
the INI file(s). Instead, just print a warning. New MCA param
btl_openib_warn_no_hca_params_found can be used to disable
printing the warning.
* Add MTU to peer negotiation when making a connection
* Exchange maximum MTU; select the lesser of the two
This commit was SVN r11182.
2006-08-14 23:30:37 +04:00
|
|
|
/** Colon-delimited list of filenames for HCA parameters */
|
|
|
|
char *hca_params_file_names;
|
|
|
|
|
|
|
|
/** Whether we're in verbose mode or not */
|
|
|
|
bool verbose;
|
|
|
|
|
|
|
|
/** Whether we want a warning if no HCA-specific parameters are
|
|
|
|
found in INI files */
|
|
|
|
bool warn_no_hca_params_found;
|
2006-09-26 16:12:33 +04:00
|
|
|
/** Whether we want a warning if non default GID prefix is not configured
|
|
|
|
on multiport setup */
|
|
|
|
bool warn_default_gid_prefix;
|
2007-04-21 04:15:05 +04:00
|
|
|
#ifdef HAVE_IBV_FORK_INIT
|
|
|
|
/** Whether we want fork support or not */
|
|
|
|
int want_fork_support;
|
|
|
|
#endif
|
2005-07-01 01:28:35 +04:00
|
|
|
}; typedef struct mca_btl_openib_component_t mca_btl_openib_component_t;
|
|
|
|
|
2006-09-15 02:19:39 +04:00
|
|
|
OMPI_MODULE_DECLSPEC extern mca_btl_openib_component_t mca_btl_openib_component;
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
typedef mca_btl_base_recv_reg_t mca_btl_openib_recv_reg_t;
|
|
|
|
|
2006-09-07 17:05:41 +04:00
|
|
|
struct mca_btl_openib_port_info_t {
|
|
|
|
uint32_t mtu;
|
2006-12-04 23:11:42 +03:00
|
|
|
#if OMPI_ENABLE_HETEROGENEOUS_SUPPORT
|
|
|
|
uint8_t padding[4];
|
|
|
|
#endif
|
2007-01-13 01:42:20 +03:00
|
|
|
uint64_t subnet_id;
|
2006-09-07 17:05:41 +04:00
|
|
|
};
|
|
|
|
typedef struct mca_btl_openib_port_info_t mca_btl_openib_port_info_t;
|
2005-07-01 01:28:35 +04:00
|
|
|
|
2007-01-13 02:14:45 +03:00
|
|
|
#define MCA_BTL_OPENIB_PORT_INFO_NTOH(hdr) \
|
|
|
|
do { \
|
|
|
|
(hdr).mtu = ntohl((hdr).mtu); \
|
2007-01-13 17:22:42 +03:00
|
|
|
(hdr).subnet_id = ntoh64((hdr).subnet_id); \
|
2007-01-13 02:14:45 +03:00
|
|
|
} while (0)
|
|
|
|
#define MCA_BTL_OPENIB_PORT_INFO_HTON(hdr) \
|
|
|
|
do { \
|
|
|
|
(hdr).mtu = htonl((hdr).mtu); \
|
2007-01-13 17:22:42 +03:00
|
|
|
(hdr).subnet_id = hton64((hdr).subnet_id); \
|
2007-01-13 02:14:45 +03:00
|
|
|
} while (0)
|
|
|
|
|
2006-06-28 11:23:08 +04:00
|
|
|
struct mca_btl_openib_hca_t {
|
|
|
|
struct ibv_device *ib_dev; /* the ib device */
|
2006-11-02 19:15:21 +03:00
|
|
|
#if OMPI_ENABLE_PROGRESS_THREADS == 1
|
|
|
|
struct ibv_comp_channel *ib_channel; /* Channel event for the HCA */
|
|
|
|
opal_thread_t thread; /* Progress thread */
|
|
|
|
volatile bool progress; /* Progress status */
|
|
|
|
#endif
|
|
|
|
opal_mutex_t hca_lock; /* hca level lock */
|
2006-06-28 11:23:08 +04:00
|
|
|
struct ibv_context *ib_dev_context;
|
|
|
|
struct ibv_device_attr ib_dev_attr;
|
|
|
|
struct ibv_pd *ib_pd;
|
|
|
|
mca_mpool_base_module_t *mpool;
|
Bring over all the work from the /tmp/ib-hw-detect branch. In
addition to my design and testing, it was conceptually approved by
Gil, Gleb, Pasha, Brad, and Galen. Functionally [probably somewhat
lightly] tested by Galen. We may still have to shake out some bugs
during the next few months, but it seems to be working for all the
cases that I can throw at it.
Here's a summary of the changes from that branch:
* Move MCA parameter registration to a new file (btl_openib_mca.c):
* Properly check the retun status of registering MCA params
* Check for valid values of MCA parameters
* Make help strings better
* Otherwise, the only default value of an MCA param that was
changed was max_btls; it went from 4 to -1 (meaning: use all
available)
* Properly prototyped internal functions in _component.c
* Made a bunch of functions static that didn't need to be public
* Renamed to remove "mca_" prefix from static functions
* Call new MCA param registration function
* Call new INI file read/lookup/finalize functions
* Updated a bunch of macros to be "BTL_" instead of "ORTE_"
* Be a little more consistent with return values
* Handle -1 for the max_btls MCA param
* Fixed a free() that should have been an OBJ_RELEASE()
* Some re-indenting
* Added INI-file parsing
* New flex file: btl_openib_ini.l
* New default HCA params .ini file (probably to be expanded over
time by other HCA vendors)
* Added more show_help messages for parsing problems
* Read in INI files and cache the values for later lookup
* When component opens an HCA, lookup to see if any corresponding
values were found in the INI files (ID'ed by the HCA vendor_id
and vendor_part_id)
* Added btl_openib_verbose MCA param that shows what the INI-file
stuff does (e.g., shows which MTU your HCA ends up using)
* Added btl_openib_hca_param_files as a colon-delimited list of INI
files to check for values during startup (in order,
left-to-right, just like the MCA base directory param).
* MTU is currently the only value supported in this framework.
* It is not a fatal error if we don't find params for the HCA in
the INI file(s). Instead, just print a warning. New MCA param
btl_openib_warn_no_hca_params_found can be used to disable
printing the warning.
* Add MTU to peer negotiation when making a connection
* Exchange maximum MTU; select the lesser of the two
This commit was SVN r11182.
2006-08-14 23:30:37 +04:00
|
|
|
/* MTU for this HCA */
|
|
|
|
uint32_t mtu;
|
2006-12-14 18:52:13 +03:00
|
|
|
/* Whether this HCA supports eager RDMA */
|
|
|
|
uint8_t use_eager_rdma;
|
2006-06-28 11:23:08 +04:00
|
|
|
uint8_t btls; /** < number of btls using this HCA */
|
|
|
|
};
|
|
|
|
typedef struct mca_btl_openib_hca_t mca_btl_openib_hca_t;
|
2005-07-01 01:28:35 +04:00
|
|
|
/**
|
|
|
|
* IB PTL Interface
|
|
|
|
*/
|
|
|
|
struct mca_btl_openib_module_t {
|
|
|
|
mca_btl_base_module_t super; /**< base PTL interface */
|
|
|
|
bool btl_inited;
|
|
|
|
mca_btl_openib_recv_reg_t ib_reg[256];
|
2007-01-13 01:42:20 +03:00
|
|
|
mca_btl_openib_port_info_t port_info; /* contains only the subnet id right now */
|
2006-06-28 11:23:08 +04:00
|
|
|
mca_btl_openib_hca_t *hca;
|
2005-07-12 17:38:54 +04:00
|
|
|
uint8_t port_num; /**< ID of the PORT */
|
2007-04-22 14:22:12 +04:00
|
|
|
uint16_t pkey_index;
|
2006-09-12 13:17:59 +04:00
|
|
|
struct ibv_cq *ib_cq[2];
|
2006-06-28 11:23:08 +04:00
|
|
|
struct ibv_port_attr ib_port_attr;
|
|
|
|
uint16_t lid; /**< lid that is actually used (for LMC) */
|
|
|
|
uint8_t src_path_bits; /**< offset from base lid (for LMC) */
|
2005-07-12 17:38:54 +04:00
|
|
|
|
2007-03-14 17:36:03 +03:00
|
|
|
ompi_free_list_t send_free[2]; /**< free lists of send buffer descriptors */
|
2005-11-10 23:15:02 +03:00
|
|
|
ompi_free_list_t send_free_frag; /**< free list of frags only... used for pining memory */
|
2005-07-01 01:28:35 +04:00
|
|
|
|
2007-03-14 17:36:03 +03:00
|
|
|
ompi_free_list_t recv_free[2]; /**< free lists of receive buffer descriptors */
|
2007-02-28 16:43:38 +03:00
|
|
|
ompi_free_list_t recv_free_frag; /**< free list of frags only... used for pining memory */
|
2005-07-01 01:28:35 +04:00
|
|
|
|
2006-07-27 18:09:30 +04:00
|
|
|
ompi_free_list_t send_free_control; /**< frags for control massages */
|
2005-07-04 02:45:48 +04:00
|
|
|
opal_mutex_t ib_lock; /**< module level lock */
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
|
|
|
|
/**< an array to allow posting of rr in one swoop */
|
|
|
|
size_t ib_inline_max; /**< max size of inline send*/
|
2005-07-20 01:04:22 +04:00
|
|
|
bool poll_cq;
|
2005-07-15 19:13:19 +04:00
|
|
|
|
2006-09-07 17:05:41 +04:00
|
|
|
struct ibv_srq *srq[2];
|
|
|
|
int32_t srd_posted[2];
|
2005-11-10 23:15:02 +03:00
|
|
|
int32_t num_peers;
|
|
|
|
int32_t rd_num;
|
|
|
|
int32_t rd_low;
|
2005-07-01 01:28:35 +04:00
|
|
|
|
2006-09-05 20:00:18 +04:00
|
|
|
int32_t sd_tokens[2];
|
|
|
|
/**< number of frags that can be outstanding (down counter) */
|
2005-10-21 06:21:45 +04:00
|
|
|
|
2006-09-05 20:00:18 +04:00
|
|
|
opal_list_t pending_frags[2]; /**< list of pending frags */
|
2005-10-21 06:21:45 +04:00
|
|
|
|
2006-03-26 12:30:50 +04:00
|
|
|
size_t eager_rdma_frag_size; /**< length of eager frag */
|
|
|
|
orte_pointer_array_t *eager_rdma_buffers; /**< RDMA buffers to poll */
|
2006-10-31 20:29:25 +03:00
|
|
|
volatile int32_t eager_rdma_buffers_count; /**< number of RDMA buffers */
|
2006-08-17 00:21:38 +04:00
|
|
|
|
|
|
|
mca_btl_base_module_error_cb_fn_t error_cb; /**< error handler */
|
2006-09-05 20:04:04 +04:00
|
|
|
|
|
|
|
orte_pointer_array_t *endpoints;
|
2005-07-01 01:28:35 +04:00
|
|
|
}; typedef struct mca_btl_openib_module_t mca_btl_openib_module_t;
|
2006-12-17 15:26:41 +03:00
|
|
|
|
2005-07-01 01:28:35 +04:00
|
|
|
extern mca_btl_openib_module_t mca_btl_openib_module;
|
|
|
|
|
2006-12-17 15:26:41 +03:00
|
|
|
struct mca_btl_openib_reg_t {
|
|
|
|
mca_mpool_base_registration_t base;
|
|
|
|
struct ibv_mr *mr;
|
|
|
|
};
|
|
|
|
typedef struct mca_btl_openib_reg_t mca_btl_openib_reg_t;
|
|
|
|
|
2006-11-02 19:15:21 +03:00
|
|
|
#if OMPI_ENABLE_PROGRESS_THREADS == 1
|
|
|
|
extern void* mca_btl_openib_progress_thread(opal_object_t*);
|
|
|
|
#endif
|
2005-07-01 01:28:35 +04:00
|
|
|
/**
|
|
|
|
* Register a callback function that is called on receipt
|
|
|
|
* of a fragment.
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL module
|
|
|
|
* @return Status indicating if cleanup was successful
|
|
|
|
*
|
|
|
|
* When the process list changes, the PML notifies the BTL of the
|
|
|
|
* change, to provide the opportunity to cleanup or release any
|
|
|
|
* resources associated with the peer.
|
|
|
|
*/
|
|
|
|
|
|
|
|
int mca_btl_openib_register(
|
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
mca_btl_base_tag_t tag,
|
|
|
|
mca_btl_base_module_recv_cb_fn_t cbfunc,
|
|
|
|
void* cbdata
|
|
|
|
);
|
2006-08-17 00:21:38 +04:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Register a callback function that is called on error..
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL module
|
|
|
|
* @return Status indicating if cleanup was successful
|
|
|
|
*/
|
|
|
|
|
|
|
|
int mca_btl_openib_register_error_cb(
|
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
mca_btl_base_module_error_cb_fn_t cbfunc
|
|
|
|
);
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Cleanup any resources held by the BTL.
|
|
|
|
*
|
|
|
|
* @param btl BTL instance.
|
|
|
|
* @return OMPI_SUCCESS or error status on failure.
|
|
|
|
*/
|
|
|
|
|
|
|
|
extern int mca_btl_openib_finalize(
|
|
|
|
struct mca_btl_base_module_t* btl
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* PML->BTL notification of change in the process list.
|
|
|
|
*
|
|
|
|
* @param btl (IN)
|
|
|
|
* @param nprocs (IN) Number of processes
|
|
|
|
* @param procs (IN) Set of processes
|
|
|
|
* @param peers (OUT) Set of (optional) peer addressing info.
|
|
|
|
* @param peers (IN/OUT) Set of processes that are reachable via this BTL.
|
|
|
|
* @return OMPI_SUCCESS or error status on failure.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
extern int mca_btl_openib_add_procs(
|
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
size_t nprocs,
|
|
|
|
struct ompi_proc_t **procs,
|
|
|
|
struct mca_btl_base_endpoint_t** peers,
|
|
|
|
ompi_bitmap_t* reachable
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* PML->BTL notification of change in the process list.
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL instance
|
|
|
|
* @param nproc (IN) Number of processes.
|
|
|
|
* @param procs (IN) Set of processes.
|
|
|
|
* @param peers (IN) Set of peer data structures.
|
|
|
|
* @return Status indicating if cleanup was successful
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
extern int mca_btl_openib_del_procs(
|
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
size_t nprocs,
|
|
|
|
struct ompi_proc_t **procs,
|
|
|
|
struct mca_btl_base_endpoint_t** peers
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* PML->BTL Initiate a send of the specified size.
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL instance
|
|
|
|
* @param btl_base_peer (IN) BTL peer addressing
|
|
|
|
* @param send_request (IN/OUT) Send request (allocated by PML via mca_btl_base_request_alloc_fn_t)
|
|
|
|
* @param size (IN) Number of bytes PML is requesting BTL to deliver
|
|
|
|
* @param flags (IN) Flags that should be passed to the peer via the message header.
|
|
|
|
* @param request (OUT) OMPI_SUCCESS if the BTL was able to queue one or more fragments
|
|
|
|
*/
|
|
|
|
extern int mca_btl_openib_send(
|
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
struct mca_btl_base_endpoint_t* btl_peer,
|
|
|
|
struct mca_btl_base_descriptor_t* descriptor,
|
|
|
|
mca_btl_base_tag_t tag
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* PML->BTL Initiate a put of the specified size.
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL instance
|
|
|
|
* @param btl_base_peer (IN) BTL peer addressing
|
|
|
|
* @param send_request (IN/OUT) Send request (allocated by PML via mca_btl_base_request_alloc_fn_t)
|
|
|
|
* @param size (IN) Number of bytes PML is requesting BTL to deliver
|
|
|
|
* @param flags (IN) Flags that should be passed to the peer via the message header.
|
|
|
|
* @param request (OUT) OMPI_SUCCESS if the BTL was able to queue one or more fragments
|
|
|
|
*/
|
|
|
|
extern int mca_btl_openib_put(
|
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
struct mca_btl_base_endpoint_t* btl_peer,
|
|
|
|
struct mca_btl_base_descriptor_t* decriptor
|
2005-08-18 21:08:27 +04:00
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* PML->BTL Initiate a get of the specified size.
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL instance
|
|
|
|
* @param btl_base_peer (IN) BTL peer addressing
|
|
|
|
* @param send_request (IN/OUT) Send request (allocated by PML via mca_btl_base_request_alloc_fn_t)
|
|
|
|
* @param size (IN) Number of bytes PML is requesting BTL to deliver
|
|
|
|
* @param flags (IN) Flags that should be passed to the peer via the message header.
|
|
|
|
* @param request (OUT) OMPI_SUCCESS if the BTL was able to queue one or more fragments
|
|
|
|
*/
|
|
|
|
extern int mca_btl_openib_get(
|
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
struct mca_btl_base_endpoint_t* btl_peer,
|
|
|
|
struct mca_btl_base_descriptor_t* decriptor
|
|
|
|
);
|
|
|
|
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Allocate a descriptor.
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL module
|
|
|
|
* @param size (IN) Requested descriptor size.
|
|
|
|
*/
|
|
|
|
extern mca_btl_base_descriptor_t* mca_btl_openib_alloc(
|
2005-07-12 17:38:54 +04:00
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
size_t size);
|
|
|
|
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Return a segment allocated by this BTL.
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL module
|
|
|
|
* @param descriptor (IN) Allocated descriptor.
|
|
|
|
*/
|
|
|
|
extern int mca_btl_openib_free(
|
2005-07-12 17:38:54 +04:00
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
mca_btl_base_descriptor_t* des);
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Pack data and return a descriptor that can be
|
|
|
|
* used for send/put.
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL module
|
|
|
|
* @param peer (IN) BTL peer addressing
|
|
|
|
*/
|
|
|
|
mca_btl_base_descriptor_t* mca_btl_openib_prepare_src(
|
2005-07-12 17:38:54 +04:00
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
struct mca_btl_base_endpoint_t* peer,
|
|
|
|
mca_mpool_base_registration_t* registration,
|
|
|
|
struct ompi_convertor_t* convertor,
|
|
|
|
size_t reserve,
|
|
|
|
size_t* size
|
|
|
|
);
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Allocate a descriptor initialized for RDMA write.
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL module
|
|
|
|
* @param peer (IN) BTL peer addressing
|
|
|
|
*/
|
|
|
|
extern mca_btl_base_descriptor_t* mca_btl_openib_prepare_dst(
|
2005-07-12 17:38:54 +04:00
|
|
|
struct mca_btl_base_module_t* btl,
|
|
|
|
struct mca_btl_base_endpoint_t* peer,
|
|
|
|
mca_mpool_base_registration_t* registration,
|
|
|
|
struct ompi_convertor_t* convertor,
|
|
|
|
size_t reserve,
|
|
|
|
size_t* size);
|
2005-07-01 01:28:35 +04:00
|
|
|
/**
|
|
|
|
* Return a send fragment to the modules free list.
|
|
|
|
*
|
|
|
|
* @param btl (IN) BTL instance
|
|
|
|
* @param frag (IN) IB send fragment
|
|
|
|
*
|
|
|
|
*/
|
2006-12-17 15:26:41 +03:00
|
|
|
extern void mca_btl_openib_send_frag_return(mca_btl_base_module_t* btl,
|
|
|
|
mca_btl_openib_frag_t*);
|
2005-07-01 01:28:35 +04:00
|
|
|
|
|
|
|
|
2006-07-30 04:58:40 +04:00
|
|
|
int mca_btl_openib_create_cq_srq(mca_btl_openib_module_t* openib_btl);
|
2005-07-01 01:28:35 +04:00
|
|
|
|
2007-03-17 02:11:45 +03:00
|
|
|
/**
|
|
|
|
* Fault Tolerance Event Notification Function
|
|
|
|
* @param state Checkpoint Stae
|
|
|
|
* @return OMPI_SUCCESS or failure status
|
|
|
|
*/
|
|
|
|
int mca_btl_openib_ft_event(int state);
|
|
|
|
|
2006-09-05 20:00:18 +04:00
|
|
|
#define BTL_OPENIB_HP_QP 0
|
|
|
|
#define BTL_OPENIB_LP_QP 1
|
|
|
|
|
2006-09-07 17:31:50 +04:00
|
|
|
static inline int mca_btl_openib_post_srr(mca_btl_openib_module_t* openib_btl,
|
2006-09-07 17:05:41 +04:00
|
|
|
const int additional, const int prio)
|
|
|
|
{
|
|
|
|
OPAL_THREAD_LOCK(&openib_btl->ib_lock);
|
|
|
|
if(openib_btl->srd_posted[prio] <= openib_btl->rd_low + additional &&
|
|
|
|
openib_btl->srd_posted[prio] < openib_btl->rd_num) {
|
|
|
|
int32_t i, rc;
|
|
|
|
int32_t num_post = openib_btl->rd_num - openib_btl->srd_posted[prio];
|
|
|
|
ompi_free_list_item_t* item;
|
|
|
|
mca_btl_openib_frag_t* frag;
|
|
|
|
struct ibv_recv_wr *bad_wr;
|
|
|
|
ompi_free_list_t *free_list;
|
|
|
|
|
2007-03-14 17:36:03 +03:00
|
|
|
free_list = &openib_btl->recv_free[prio];
|
2006-09-07 17:05:41 +04:00
|
|
|
|
|
|
|
for(i = 0; i < num_post; i++) {
|
|
|
|
OMPI_FREE_LIST_WAIT(free_list, item, rc);
|
|
|
|
frag = (mca_btl_openib_frag_t*)item;
|
|
|
|
if(ibv_post_srq_recv(openib_btl->srq[prio], &frag->wr_desc.rd_desc,
|
|
|
|
&bad_wr)) {
|
|
|
|
BTL_ERROR(("error posting receive descriptors to shared "
|
|
|
|
"receive queue: %s", strerror(errno)));
|
|
|
|
return OMPI_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
OPAL_THREAD_ADD32(&openib_btl->srd_posted[prio], num_post);
|
|
|
|
}
|
|
|
|
OPAL_THREAD_UNLOCK(&openib_btl->ib_lock);
|
2006-09-07 17:31:50 +04:00
|
|
|
|
|
|
|
return OMPI_SUCCESS;
|
2006-09-07 17:05:41 +04:00
|
|
|
}
|
|
|
|
|
2005-07-01 01:28:35 +04:00
|
|
|
#if defined(c_plusplus) || defined(__cplusplus)
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|