Hi Jeff, Just checked in r24900.
On 09-Jul-11 2:24 PM, Jeff Squyres wrote: > I'm still getting warnings about OMPI_ENABLE_DYNAMIC_SL not being defined, > even though I see this in my configure output: > > checking if can use dynamic SL support... yes > > That's why I wanted that macro *always* defined by the m4 (to either 0 or 1) > -- not just defining it or not. This is one of the OMPI coding guidelines: > always define logical preprocessor macros to 0 or 1, not define-them-or-not. > If you always define them, then you can get preprocessor warnings if you > misspell a macro name. E.g.: > > #if MISSPELLED_MACRO_NAME > > will return a warning because the macro doesn't exist. But if you just > define-the-macro-or-not and use > > #ifdef MISSPELLED_MACRO_NAME > > then you won't get a warning and it may be a difficult-to-find bug that you > misspelled the macro name in the code. OK, got it. Fixed. > Also, note that the 4-argument version of AC_ARG_ENABLE isn't really > necessary: > > AC_ARG_ENABLE([openib-dynamic-sl], > [AC_HELP_STRING([--enable-openib-dynamic-sl], > [Enable openib BTL to query Subnet Manager for IB SL > (default: enabled)])], > [enable_openib_dynamic_sl="$enableval"], > [enable_openib_dynamic_sl="not_provided"]) > > You can shorten it to: > > AC_ARG_ENABLE([openib-dynamic-sl], > [AC_HELP_STRING([--enable-openib-dynamic-sl], > [Enable openib BTL to query Subnet Manager for IB SL > (default: enabled)])]) > > because $enable_openib_dynamic_sl will automatically be set to "yes" (when > --enable-openib-dynamic-sl is used), "no" (when --disable-openib-dynamic-sl > is used), or "" (when neither is used). So there's no need to manually set > this variable in args 3 and 4 -- it's set for you automatically. > > I know we have some of the older 4-arg forms in ompi_check_openib.m4, but > they're just old and haven't been updated. You probably don't want to > introduce *new* 4-arg usage. Guess I was copying from one of those old usages. Fixed. > Finally, are you sure that infiniband/complib/cl_types_osd.h exists on all > platforms? (e.g., Solaris) I know you said you don't have any Solaris > machines to test with, but you should ping Oracle directly for some testing > -- Terry might not be paying attention to this specific thread... I'll check it, but my guess would be that Solaris doesn't have it. AFAIK Solaris doesn't use OpenFabrics OpenSM - it has a separate subnet manager, so I can't assume that it has. So right now the dynamic SL will probably not work on Solaris (though it won't break the compilation). > > ----- > > Here's the warnings I'm seeing -- did you remove the AC_DEFINE for > OMPI_ENABLE_DYNAMIC_SL altogether by accident? It appears that I did lose it... I'm spoiled by git, hard to get used to svn again... :) -- YK > [4:13] svbu-mpi:~/svn/ompi5/ompi/mca/btl/openib % make > CC btl_openib.lo > In file included from btl_openib_ini.h:16:0, > from btl_openib.c:47: > btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC btl_openib_component.lo > In file included from btl_openib_component.c:80:0: > btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC btl_openib_endpoint.lo > In file included from btl_openib_endpoint.h:32:0, > from btl_openib_endpoint.c:46: > btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC btl_openib_frag.lo > In file included from btl_openib_frag.c:22:0: > btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC btl_openib_proc.lo > In file included from btl_openib_proc.c:27:0: > btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC btl_openib_lex.lo > btl_openib_lex.c: In function 'yy_get_next_buffer': > btl_openib_lex.c:1229:3: warning: comparison between signed and unsigned > integer expressions > btl_openib_lex.l: At top level: > btl_openib_lex.c:1323:17: warning: 'yyunput' defined but not used > btl_openib_lex.c:1364:16: warning: 'input' defined but not used > CC btl_openib_mca.lo > In file included from btl_openib_mca.c:33:0: > btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > btl_openib_mca.c: In function 'btl_openib_register_mca_params': > btl_openib_mca.c:401:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC btl_openib_ini.lo > In file included from btl_openib_ini.c:35:0: > btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC btl_openib_async.lo > In file included from btl_openib_async.c:26:0: > btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC btl_openib_xrc.lo > In file included from btl_openib_xrc.h:14:0, > from btl_openib_xrc.c:23: > btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC btl_openib_fd.lo > CC btl_openib_ip.lo > In file included from btl_openib_endpoint.h:32:0, > from btl_openib_ip.c:30: > btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC connect/btl_openib_connect_base.lo > In file included from connect/btl_openib_connect_base.c:13:0: > ./btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC connect/btl_openib_connect_oob.lo > In file included from connect/btl_openib_connect_oob.c:41:0: > ./btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > connect/btl_openib_connect_oob.c:47:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is > not defined > connect/btl_openib_connect_oob.c:65:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is > not defined > connect/btl_openib_connect_oob.c:115:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is > not defined > connect/btl_openib_connect_oob.c:271:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is > not defined > connect/btl_openib_connect_oob.c: In function 'oob_component_finalize': > connect/btl_openib_connect_oob.c:307:7: warning: "OMPI_ENABLE_DYNAMIC_SL" is > not defined > connect/btl_openib_connect_oob.c: In function 'qp_connect_all': > connect/btl_openib_connect_oob.c:396:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is > not defined > connect/btl_openib_connect_oob.c: At top level: > connect/btl_openib_connect_oob.c:1011:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is > not defined > CC connect/btl_openib_connect_empty.lo > In file included from connect/btl_openib_connect_empty.c:13:0: > ./btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC connect/btl_openib_connect_xoob.lo > In file included from connect/btl_openib_connect_xoob.c:30:0: > ./btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CC connect/btl_openib_connect_rdmacm.lo > In file included from ./btl_openib_proc.h:26:0, > from connect/btl_openib_connect_rdmacm.c:53: > ./btl_openib.h:219:6: warning: "OMPI_ENABLE_DYNAMIC_SL" is not defined > CCLD libmca_btl_openib.la > [4:13] svbu-mpi:~/svn/ompi5/ompi/mca/btl/openib % cd > > > > On Jul 3, 2011, at 11:07 AM, Yevgeny Kliteynik wrote: > >> Hi Jeff, >> >> On 02-Jul-11 11:52 PM, Jeff Squyres (jsquyres) wrote: >>> Were all the issueswith this code fixed? There were m4 issues and solaris >>> issues, IIRC. >> >> I took all the fixes I could find based on the trac: >> "Be sure also to look at r24196; Josh committed a >> bunch of warning fixes for you after r24915" >> >> I also removed all the libibmad dependencies and unneded macros, >> so I hope that this is OK. However, I don't have any Solaris machine >> to try this to make sure that there are no issues. >> >> The only complaint w.r.t. Solaris that I could find was Terry's >> mail from last week, but it turned out to be a different problem. >> >> Are there any other problems that I'm not aware of? >> >> -- YK >> >> >>> Sent from my phone. No type good. >>> >>> On Jun 28, 2011, at 9:28 AM, "klit...@osl.iu.edu"<klit...@osl.iu.edu> >>> wrote: >>> >>>> Author: kliteyn >>>> Date: 2011-06-28 10:28:29 EDT (Tue, 28 Jun 2011) >>>> New Revision: 24830 >>>> URL: https://svn.open-mpi.org/trac/ompi/changeset/24830 >>>> >>>> Log: >>>> Supporting dynamic SL (#2674) >>>> >>>> - Added enable/disable configuration parameter for dynamic SL >>>> - All the dynamic SL code is conditionalized >>>> - Removed libibmad dependency >>>> - Using only one include - ib_types.h (part of opensm-devel package) >>>> - Removed all the macro and data types definitions, using the >>>> existing definitions from ib_types.h instead >>>> - general cleaning here and there >>>> >>>> The async mode is not implemented yet - stay tuned... >>>> >>>> >>>> Text files modified: >>>> trunk/ompi/config/ompi_check_openib.m4 | 38 ++++ >>>> trunk/ompi/mca/btl/openib/btl_openib.h | 5 >>>> trunk/ompi/mca/btl/openib/btl_openib_mca.c | 10 >>>> trunk/ompi/mca/btl/openib/connect/btl_openib_connect_oob.c | 309 >>>> +++++++++++++++++---------------------- >>>> 4 files changed, 182 insertions(+), 180 deletions(-) >>>> >>>> Modified: trunk/ompi/config/ompi_check_openib.m4 >>>> ============================================================================== >>>> --- trunk/ompi/config/ompi_check_openib.m4 (original) >>>> +++ trunk/ompi/config/ompi_check_openib.m4 2011-06-28 10:28:29 EDT >>>> (Tue, 28 Jun 2011) >>>> @@ -155,11 +155,21 @@ >>>> [$ompi_cv_func_ibv_create_cq_args], >>>> [Number of arguments to >>>> ibv_create_cq])])]) >>>> >>>> + # >>>> + # OpenIB dynamic SL >>>> + # >>>> + AC_ARG_ENABLE([openib-dynamic-sl], >>>> + [AC_HELP_STRING([--enable-openib-dynamic-sl], >>>> + [Enable openib BTL to query Subnet Manager for IB >>>> SL (default: enabled)])], >>>> + [enable_openib_dynamic_sl="$enableval"], >>>> + [enable_openib_dynamic_sl="yes"]) >>>> + >>>> # Set these up so that we can do an AC_DEFINE below >>>> # (unconditionally) >>>> $1_have_xrc=0 >>>> $1_have_rdmacm=0 >>>> $1_have_ibcm=0 >>>> + $1_have_dynamic_sl=0 >>>> >>>> # If we have the openib stuff available, find out what we've got >>>> AS_IF([test "$ompi_check_openib_happy" = "yes"], >>>> @@ -176,6 +186,19 @@ >>>> AC_CHECK_FUNCS([ibv_create_xrc_rcv_qp], [$1_have_xrc=1]) >>>> fi >>>> >>>> + if test "$enable_openib_dynamic_sl" = "yes"; then >>>> + # We need ib_types.h file, which is installed with >>>> opensm-devel >>>> + # package. However, ib_types.h has a bad include directive, >>>> + # which will cause AC_CHECK_HEADER to fail. >>>> + # So instead, we will look for another file that is also >>>> + # installed as part of opensm-devel package and included in >>>> + # ib_types.h, but it doesn't include any other IB-related >>>> files. >>>> + AC_CHECK_HEADER([infiniband/complib/cl_types_osd.h], >>>> + [$1_have_dynamic_sl=1], >>>> + [AC_MSG_ERROR([opensm-devel package not >>>> found - please install it or disable dynamic SL support with >>>> \"--disable-openib-dynamic-sl\"])], >>>> + []) >>>> + fi >>>> + >>>> # Do we have a recent enough RDMA CM? Need to have the >>>> # rdma_get_peer_addr (inline) function (originally appeared >>>> # in OFED v1.3). >>>> @@ -244,6 +267,15 @@ >>>> else >>>> AC_MSG_RESULT([no]) >>>> fi >>>> + >>>> + AC_MSG_CHECKING([if dynamic SL is enabled]) >>>> + AC_DEFINE_UNQUOTED([OMPI_ENABLE_DYNAMIC_SL], [$$1_have_dynamic_sl], >>>> + [Enable features required for dynamic SL support]) >>>> + if test "1" = "$$1_have_dynamic_sl"; then >>>> + AC_MSG_RESULT([yes]) >>>> + else >>>> + AC_MSG_RESULT([no]) >>>> + fi >>>> >>>> AC_MSG_CHECKING([if OpenFabrics RDMACM support is enabled]) >>>> AC_DEFINE_UNQUOTED([OMPI_HAVE_RDMACM], [$$1_have_rdmacm], >>>> @@ -267,7 +299,11 @@ >>>> AC_MSG_RESULT([no]) >>>> fi >>>> >>>> - CPPFLAGS="$ompi_check_openib_$1_save_CPPFLAGS" >>>> + AS_IF([test -z "$ompi_check_openib_dir"], >>>> + [openib_include_dir="/usr/include"], >>>> + [openib_include_dir="$ompi_check_openib_dir/include"]) >>>> + >>>> + CPPFLAGS="$ompi_check_openib_$1_save_CPPFLAGS >>>> -I$openib_include_dir/infiniband" >>>> LDFLAGS="$ompi_check_openib_$1_save_LDFLAGS" >>>> LIBS="$ompi_check_openib_$1_save_LIBS" >>>> >>>> >>>> Modified: trunk/ompi/mca/btl/openib/btl_openib.h >>>> ============================================================================== >>>> --- trunk/ompi/mca/btl/openib/btl_openib.h (original) >>>> +++ trunk/ompi/mca/btl/openib/btl_openib.h 2011-06-28 10:28:29 EDT >>>> (Tue, 28 Jun 2011) >>>> @@ -52,6 +52,7 @@ >>>> BEGIN_C_DECLS >>>> >>>> #define HAVE_XRC (1 == OMPI_HAVE_CONNECTX_XRC) >>>> +#define ENABLE_DYNAMIC_SL (1 == OMPI_ENABLE_DYNAMIC_SL) >>>> >>>> #define MCA_BTL_IB_LEAVE_PINNED 1 >>>> #define IB_DEFAULT_GID_PREFIX 0xfe80000000000000ll >>>> @@ -215,7 +216,9 @@ >>>> uint32_t ib_rnr_retry; >>>> uint32_t ib_max_rdma_dst_ops; >>>> uint32_t ib_service_level; >>>> - uint32_t ib_path_rec_service_level; >>>> +#if (ENABLE_DYNAMIC_SL) >>>> + uint32_t ib_path_record_service_level; >>>> +#endif >>>> int32_t use_eager_rdma; >>>> int32_t eager_rdma_threshold; /**< After this number of msg, use >>>> RDMA for short messages, always */ >>>> int32_t eager_rdma_num; >>>> >>>> Modified: trunk/ompi/mca/btl/openib/btl_openib_mca.c >>>> ============================================================================== >>>> --- trunk/ompi/mca/btl/openib/btl_openib_mca.c (original) >>>> +++ trunk/ompi/mca/btl/openib/btl_openib_mca.c 2011-06-28 10:28:29 EDT >>>> (Tue, 28 Jun 2011) >>>> @@ -398,10 +398,14 @@ >>>> } >>>> mca_btl_openib_component.ib_service_level = (uint32_t) ival; >>>> >>>> - CHECK(reg_int("ib_path_rec_service_level", NULL, "Enable getting >>>> InfiniBand service level from PathRecord " >>>> - "(must be>= 0, 0 = disabled, positive = try to get the >>>> service level from PathRecord)", >>>> +#if (ENABLE_DYNAMIC_SL) >>>> + CHECK(reg_int("ib_path_record_service_level", NULL, >>>> + "Enable getting InfiniBand service level from >>>> PathRecord " >>>> + "(must be>= 0, 0 = disabled, positive = try to get the " >>>> + "service level from PathRecord)", >>>> 0,&ival, REGINT_GE_ZERO)); >>>> - mca_btl_openib_component.ib_path_rec_service_level = (uint32_t) ival; >>>> + mca_btl_openib_component.ib_path_record_service_level = (uint32_t) >>>> ival; >>>> +#endif >>>> >>>> CHECK(reg_int("use_eager_rdma", NULL, "Use RDMA for eager messages " >>>> "(-1 = use device default, 0 = do not use eager RDMA, " >>>> >>>> Modified: trunk/ompi/mca/btl/openib/connect/btl_openib_connect_oob.c >>>> ============================================================================== >>>> --- trunk/ompi/mca/btl/openib/connect/btl_openib_connect_oob.c >>>> (original) >>>> +++ trunk/ompi/mca/btl/openib/connect/btl_openib_connect_oob.c >>>> 2011-06-28 10:28:29 EDT (Tue, 28 Jun 2011) >>>> @@ -44,6 +44,10 @@ >>>> #include "connect/connect.h" >>>> #include "orte/util/show_help.h" >>>> >>>> +#if (ENABLE_DYNAMIC_SL) >>>> +#include<infiniband/iba/ib_types.h> >>>> +#endif >>>> + >>>> #ifdef HAVE_UNISTD_H >>>> #include<unistd.h> >>>> #endif >>>> @@ -54,109 +58,17 @@ >>>> ENDPOINT_CONNECT_ACK >>>> } connect_message_type_t; >>>> >>>> -#ifndef __WINDOWS__ >>>> -#define PACK_SUFFIX __attribute__((packed)) >>>> -#else >>>> -#define PACK_SUFFIX >>>> -#endif >>>> - >>>> -#define SL_NOT_PRESENT 0x7F >>>> +#define SL_NOT_PRESENT 0xFF >>>> #define MAX_GET_SL_REC_RETRIES 20 >>>> #define GET_SL_REC_RETRIES_TIMEOUT_MS 2000000 >>>> >>>> -#define IB_SA_QPN 1 >>>> -#define IB_GLOBAL_QKEY 0x80010000UL >>>> -#define IB_MGMT_BASE_VERSION 1 >>>> -#define IB_MGMT_CLASS_SUBN_ADM 0x03 >>>> -#define IB_MGMT_METHOD_GET 0x01 >>>> -#define IB_SA_TID_GET_PATH_REC_0 0xCA000000UL >>>> -#define IB_SA_TID_GET_PATH_REC_1 0xBEEF0000UL >>>> -#define IB_PATH_REC_SL_MASK 0x000F >>>> -#define IB_SA_ATTR_PATH_REC 0x35 >>>> -#define IB_SA_PATH_REC_DLID (1<<4) >>>> -#define IB_SA_PATH_REC_SLID (1<<5) >>>> - >>>> - >>>> -#ifdef __WINDOWS__ >>>> - #pragma pack(push) >>>> - #pragma pack(1) >>>> -#endif >>>> - >>>> -struct ib_mad_hdr { >>>> - uint8_t base_version; >>>> - uint8_t mgmt_class; >>>> - uint8_t class_version; >>>> - uint8_t method; >>>> - uint16_t status; >>>> - uint16_t class_spec; >>>> - uint32_t tid[2]; >>>> - uint16_t attr_id; >>>> - uint16_t resv; >>>> - uint32_t attr_mod; >>>> -} PACK_SUFFIX; >>>> - >>>> -struct ib_rmpp_hdr { >>>> - uint32_t raw[3]; >>>> -} PACK_SUFFIX; >>>> - >>>> -struct ib_sa_hdr { >>>> - uint32_t sm_key[2]; >>>> - uint16_t reserved; >>>> - uint16_t attrib_offset; >>>> - uint32_t comp_mask[2]; >>>> -} PACK_SUFFIX; >>>> - >>>> -typedef union _ib_gid { >>>> - uint8_t raw[16]; >>>> - struct _ib_gid_unicast { >>>> - uint64_t prefix; >>>> - uint64_t interface_id; >>>> - } PACK_SUFFIX unicast; >>>> - struct _ib_gid_multicast { >>>> - uint8_t header[2]; >>>> - uint8_t raw_group_id[14]; >>>> - } PACK_SUFFIX multicast; >>>> -} PACK_SUFFIX ib_gid_t; >>>> - >>>> -struct ib_path_record { >>>> - uint64_t service_id; >>>> - ib_gid_t dgit; >>>> - ib_gid_t sgit; >>>> - uint16_t dlid; >>>> - uint16_t slid; >>>> - uint32_t hop_flow_raw; >>>> - uint8_t tclass; >>>> - uint8_t num_path; >>>> - uint16_t pkey; >>>> - uint8_t reserved1; >>>> - uint8_t qos_class_sl; >>>> - uint8_t mtu; >>>> - uint8_t rate; >>>> - uint32_t preference__packet_lifetime__packet_lifetime_selector; >>>> - uint32_t reserved2[35]; >>>> -} PACK_SUFFIX; >>>> - >>>> -union ib_sa_data { >>>> - struct ib_path_record path_record; >>>> -} PACK_SUFFIX; >>>> - >>>> -struct ib_mad_sa { >>>> - struct ib_mad_hdr mad_hdr; >>>> - struct ib_rmpp_hdr rmpp_hdr; >>>> - struct ib_sa_hdr sa_hdr; >>>> - union ib_sa_data sa_data; >>>> -} PACK_SUFFIX; >>>> - >>>> -#ifdef __WINDOWS__ >>>> - #pragma pack(pop) >>>> -#endif >>>> - >>>> +#if (ENABLE_DYNAMIC_SL) >>>> static struct mca_btl_openib_sa_qp_cache { >>>> /* There will be a MR with the one send and receive buffer together */ >>>> /* The send buffer is first, the receive buffer is second */ >>>> /* The receive buffer in a UD queue pair needs room for the 40 byte >>>> GRH */ >>>> /* The buffers are first in the structure for page alignment */ >>>> - char send_recv_buffer[sizeof(struct ib_mad_sa) * 2 + 40]; >>>> + char send_recv_buffer[MAD_BLOCK_SIZE * 2 + 40]; >>>> struct mca_btl_openib_sa_qp_cache *next; >>>> struct ibv_context *context; >>>> char *device_name; >>>> @@ -168,8 +80,9 @@ >>>> struct ibv_pd *pd; >>>> struct ibv_recv_wr rwr; >>>> struct ibv_sge rsge; >>>> - char sl_values[65536]; >>>> + uint8_t sl_values[65536]; /* 64K */ >>>> } *sa_qp_cache = 0; >>>> +#endif >>>> >>>> static int oob_priority = 50; >>>> static bool rml_recv_posted = false; >>>> @@ -198,27 +111,31 @@ >>>> static void rml_recv_cb(int status, orte_process_name_t* process_name, >>>> opal_buffer_t* buffer, orte_rml_tag_t tag, >>>> void* cbdata); >>>> + >>>> +#if (ENABLE_DYNAMIC_SL) >>>> static int init_ud_qp(struct ibv_context *context_arg, >>>> struct mca_btl_openib_sa_qp_cache *cache); >>>> static void init_sa_mad(struct mca_btl_openib_sa_qp_cache *cache, >>>> - struct ib_mad_sa *sag, >>>> - struct ibv_send_wr *swr, >>>> - struct ibv_sge *ssge, >>>> - uint16_t lid, >>>> - uint16_t rem_lid); >>>> + ib_sa_mad_t *sa_mad, >>>> + struct ibv_send_wr *swr, >>>> + struct ibv_sge *ssge, >>>> + uint16_t lid, >>>> + uint16_t rem_lid); >>>> static int get_pathrecord_info(struct mca_btl_openib_sa_qp_cache *cache, >>>> - struct ib_mad_sa *sag, >>>> - struct ib_mad_sa *sar, >>>> - struct ibv_send_wr *swr, >>>> - uint16_t lid, >>>> - uint16_t rem_lid); >>>> -static int init_device(struct ibv_context *context_arg, >>>> - struct mca_btl_openib_sa_qp_cache *cache, >>>> - uint32_t port_num); >>>> -static int get_pathrecord_sl(struct ibv_context *context_arg, >>>> - uint32_t port_num, >>>> + ib_sa_mad_t *sa_mad, >>>> + ib_sa_mad_t *sar, >>>> + struct ibv_send_wr *swr, >>>> uint16_t lid, >>>> uint16_t rem_lid); >>>> +static int init_device(struct ibv_context *context_arg, >>>> + struct mca_btl_openib_sa_qp_cache *cache, >>>> + uint32_t port_num); >>>> +static int get_pathrecord_sl(struct ibv_context *context_arg, >>>> + uint32_t port_num, >>>> + uint16_t lid, >>>> + uint16_t rem_lid); >>>> +static void free_sa_qp_cache(void); >>>> +#endif >>>> >>>> /* >>>> * The "component" struct -- the top-level function pointers for the >>>> @@ -351,6 +268,33 @@ >>>> return OMPI_SUCCESS; >>>> } >>>> >>>> +#if (ENABLE_DYNAMIC_SL) >>>> +static void free_sa_qp_cache(void) >>>> +{ >>>> + struct mca_btl_openib_sa_qp_cache *cache, *tmp; >>>> + >>>> + cache = sa_qp_cache; >>>> + while (NULL != cache) { >>>> + /* free cache data */ >>>> + if (cache->device_name) >>>> + free(cache->device_name); >>>> + if (NULL != cache->qp) >>>> + ibv_destroy_qp(cache->qp); >>>> + if (NULL != cache->ah) >>>> + ibv_destroy_ah(cache->ah); >>>> + if (NULL != cache->cq) >>>> + ibv_destroy_cq(cache->cq); >>>> + if (NULL != cache->mr) >>>> + ibv_dereg_mr(cache->mr); >>>> + if (NULL != cache->pd) >>>> + ibv_dealloc_pd(cache->pd); >>>> + tmp = cache->next; >>>> + free(cache); >>>> + cache = tmp; >>>> + } >>>> +} >>>> +#endif >>>> + >>>> /* >>>> * Component finalize function. Cleanup RML non-blocking receive. >>>> */ >>>> @@ -360,7 +304,9 @@ >>>> orte_rml.recv_cancel(ORTE_NAME_WILDCARD, OMPI_RML_TAG_OPENIB); >>>> rml_recv_posted = false; >>>> } >>>> - >>>> + #if (ENABLE_DYNAMIC_SL) >>>> + free_sa_qp_cache(); >>>> +#endif >>>> return OMPI_SUCCESS; >>>> } >>>> >>>> @@ -425,7 +371,7 @@ >>>> */ >>>> static int qp_connect_all(mca_btl_openib_endpoint_t *endpoint) >>>> { >>>> - int i, rc; >>>> + int i; >>>> mca_btl_openib_module_t* openib_btl = >>>> (mca_btl_openib_module_t*)endpoint->endpoint_btl; >>>> >>>> @@ -446,18 +392,24 @@ >>>> attr.ah_attr.dlid = endpoint->rem_info.rem_lid; >>>> attr.ah_attr.src_path_bits = openib_btl->src_path_bits; >>>> attr.ah_attr.port_num = openib_btl->port_num; >>>> - attr.ah_attr.sl = mca_btl_openib_component.ib_service_level; >>>> - /* if user enable ib_path_rec_service_level - dynamically get the >>>> sl from PathRecord */ >>>> - if (mca_btl_openib_component.ib_path_rec_service_level> 0) { >>>> - rc = get_pathrecord_sl(qp->context, >>>> + >>>> +#if (ENABLE_DYNAMIC_SL) >>>> + /* if user enabled dynamic SL, get it from PathRecord */ >>>> + if (0 != mca_btl_openib_component.ib_path_record_service_level) { >>>> + int rc = get_pathrecord_sl(qp->context, >>>> attr.ah_attr.port_num, >>>> openib_btl->lid, >>>> attr.ah_attr.dlid); >>>> if (OMPI_ERROR == rc) { >>>> + free_sa_qp_cache(); >>>> return OMPI_ERROR; >>>> } >>>> attr.ah_attr.sl = rc; >>>> } >>>> +#else >>>> + attr.ah_attr.sl = mca_btl_openib_component.ib_service_level; >>>> +#endif >>>> + >>>> /* JMS to be filled in later dynamically */ >>>> attr.ah_attr.static_rate = 0; >>>> >>>> @@ -1056,6 +1008,7 @@ >>>> OPAL_THREAD_UNLOCK(&mca_btl_openib_component.ib_lock); >>>> } >>>> >>>> +#if (ENABLE_DYNAMIC_SL) >>>> static int init_ud_qp(struct ibv_context *context_arg, >>>> struct mca_btl_openib_sa_qp_cache *cache) >>>> { >>>> @@ -1094,7 +1047,7 @@ >>>> memset(&mattr, 0, sizeof(mattr)); >>>> mattr.qp_state = IBV_QPS_INIT; >>>> mattr.port_num = cache->port_num; >>>> - mattr.qkey = IB_GLOBAL_QKEY; >>>> + mattr.qkey = ntohl(IB_QP1_WELL_KNOWN_Q_KEY); >>>> rc = ibv_modify_qp(cache->qp,&mattr, >>>> IBV_QP_STATE | >>>> IBV_QP_PKEY_INDEX | >>>> @@ -1128,61 +1081,75 @@ >>>> return OMPI_SUCCESS; >>>> } >>>> static void init_sa_mad(struct mca_btl_openib_sa_qp_cache *cache, >>>> - struct ib_mad_sa *sag, >>>> - struct ibv_send_wr *swr, >>>> - struct ibv_sge *ssge, >>>> - uint16_t lid, >>>> - uint16_t rem_lid) >>>> + ib_sa_mad_t *sa_mad, >>>> + struct ibv_send_wr *swr, >>>> + struct ibv_sge *ssge, >>>> + uint16_t lid, >>>> + uint16_t rem_lid) >>>> { >>>> - memset(sag, 0, sizeof(*sag)); >>>> + ib_path_rec_t *path_record = (ib_path_rec_t*)sa_mad->data; >>>> + >>>> memset(swr, 0, sizeof(*swr)); >>>> memset(ssge, 0, sizeof(*ssge)); >>>> >>>> - sag->mad_hdr.base_version = IB_MGMT_BASE_VERSION; >>>> - sag->mad_hdr.mgmt_class = IB_MGMT_CLASS_SUBN_ADM; >>>> - sag->mad_hdr.class_version = 2; >>>> - sag->mad_hdr.method = IB_MGMT_METHOD_GET; >>>> - sag->mad_hdr.attr_id = htons (IB_SA_ATTR_PATH_REC); >>>> - sag->mad_hdr.tid[0] = IB_SA_TID_GET_PATH_REC_0 + cache->qp->qp_num; >>>> - sag->mad_hdr.tid[1] = IB_SA_TID_GET_PATH_REC_1 + rem_lid; >>>> - sag->sa_hdr.comp_mask[1] = >>>> - htonl(IB_SA_PATH_REC_DLID | IB_SA_PATH_REC_SLID); >>>> - sag->sa_data.path_record.dlid = htons(rem_lid); >>>> - sag->sa_data.path_record.slid = htons(lid); >>>> + /* Initialize the standard MAD header. */ >>>> + memset(sa_mad, 0, MAD_BLOCK_SIZE); >>>> + ib_mad_init_new((ib_mad_t *)sa_mad, /* mad header pointer */ >>>> + IB_MCLASS_SUBN_ADM, /* management class */ >>>> + (uint8_t) 2, /* version */ >>>> + IB_MAD_METHOD_GET, /* method */ >>>> + hton64((uint64_t)lid<< 48 | /* transaction ID */ >>>> + (uint64_t)rem_lid<< 32 | >>>> + (uint64_t)cache->qp->qp_num<< 8), >>>> + IB_MAD_ATTR_PATH_RECORD, /* attribute ID */ >>>> + 0); /* attribute modifier */ >>>> + >>>> + sa_mad->comp_mask = IB_PR_COMPMASK_DLID | IB_PR_COMPMASK_SLID; >>>> + path_record->dlid = htons(rem_lid); >>>> + path_record->slid = htons(lid); >>>> >>>> swr->sg_list = ssge; >>>> swr->num_sge = 1; >>>> swr->opcode = IBV_WR_SEND; >>>> swr->wr.ud.ah = cache->ah; >>>> - swr->wr.ud.remote_qpn = IB_SA_QPN; >>>> - swr->wr.ud.remote_qkey = IB_GLOBAL_QKEY; >>>> + swr->wr.ud.remote_qpn = ntohl(IB_QP1); >>>> + swr->wr.ud.remote_qkey = ntohl(IB_QP1_WELL_KNOWN_Q_KEY); >>>> swr->send_flags = IBV_SEND_SIGNALED | IBV_SEND_SOLICITED; >>>> >>>> - ssge->addr = (uint64_t)(void *)sag; >>>> - ssge->length = sizeof(*sag); >>>> + ssge->addr = (uint64_t)(void *)sa_mad; >>>> + ssge->length = MAD_BLOCK_SIZE; >>>> ssge->lkey = cache->mr->lkey; >>>> } >>>> >>>> static int get_pathrecord_info(struct mca_btl_openib_sa_qp_cache *cache, >>>> - struct ib_mad_sa *sag, >>>> - struct ib_mad_sa *sar, >>>> - struct ibv_send_wr *swr, >>>> - uint16_t lid, >>>> - uint16_t rem_lid) >>>> + ib_sa_mad_t *req_mad, >>>> + ib_sa_mad_t *resp_mad, >>>> + struct ibv_send_wr *swr, >>>> + uint16_t lid, >>>> + uint16_t rem_lid) >>>> { >>>> struct ibv_send_wr *bswr; >>>> struct ibv_wc wc; >>>> struct timeval get_sl_rec_last_sent, get_sl_rec_last_poll; >>>> struct ibv_recv_wr *brwr; >>>> int got_sl_value, get_sl_rec_retries, rc, ne, i; >>>> + ib_path_rec_t *req_path_record = ib_sa_mad_get_payload_ptr(req_mad); >>>> + ib_path_rec_t *resp_path_record = ib_sa_mad_get_payload_ptr(resp_mad); >>>> >>>> got_sl_value = 0; >>>> get_sl_rec_retries = 0; >>>> >>>> + rc = ibv_post_recv(cache->qp,&(cache->rwr),&brwr); >>>> + if (0 != rc) { >>>> + BTL_ERROR(("error posting receive on QP [0x%x] errno says: %s >>>> [%d]", >>>> + cache->qp->qp_num, strerror(errno), errno)); >>>> + return OMPI_ERROR; >>>> + } >>>> + >>>> while (0 == got_sl_value) { >>>> rc = ibv_post_send(cache->qp, swr,&bswr); >>>> if (0 != rc) { >>>> - BTL_ERROR(("error posing send on QP[%x] errno says: %s [%d]", >>>> + BTL_ERROR(("error posting send on QP [0x%x] errno says: %s >>>> [%d]", >>>> cache->qp->qp_num, strerror(errno), errno)); >>>> return OMPI_ERROR; >>>> } >>>> @@ -1190,25 +1157,23 @@ >>>> >>>> while (0 == got_sl_value) { >>>> ne = ibv_poll_cq(cache->cq, 1,&wc); >>>> - if (ne> 0 >>>> -&& wc.status == IBV_WC_SUCCESS >>>> -&& wc.opcode == IBV_WC_RECV >>>> -&& wc.byte_len>= sizeof(*sar) >>>> -&& sar->mad_hdr.tid[0] == sag->mad_hdr.tid[0] >>>> -&& sar->mad_hdr.tid[1] == sag->mad_hdr.tid[1]) { >>>> - if (0 == sar->mad_hdr.status >>>> -&& sar->sa_data.path_record.slid == htons(lid) >>>> -&& sar->sa_data.path_record.dlid == htons(rem_lid)) { >>>> + if (ne> 0&& >>>> + IBV_WC_SUCCESS == wc.status&& >>>> + IBV_WC_RECV == wc.opcode&& >>>> + wc.byte_len>= MAD_BLOCK_SIZE&& >>>> + resp_mad->trans_id == req_mad->trans_id) { >>>> + if (0 == resp_mad->status&& >>>> + req_path_record->slid == htons(lid)&& >>>> + req_path_record->dlid == htons(rem_lid)) { >>>> /* Everything matches, so we have the desired SL */ >>>> - cache->sl_values[rem_lid] = >>>> - sar->sa_data.path_record.qos_class_sl& >>>> IB_PATH_REC_SL_MASK; >>>> + cache->sl_values[rem_lid] = >>>> ib_path_rec_sl(resp_path_record); >>>> got_sl_value = 1; /* still must repost recieve buf */ >>>> } else { >>>> /* Probably bad status, unlikely bad lid match. We >>>> will */ >>>> /* ignore response and let it time out so that we do >>>> a */ >>>> /* retry, but after a delay. We must make a new TID >>>> so */ >>>> /* the SM doesn't see it as the same request. >>>> */ >>>> - sag->mad_hdr.tid[1] += 0x10000; >>>> + req_mad->trans_id += hton64(1); >>>> } >>>> rc = ibv_post_recv(cache->qp,&(cache->rwr),&brwr); >>>> if (0 != rc) { >>>> @@ -1249,7 +1214,6 @@ >>>> { >>>> struct ibv_ah_attr aattr; >>>> struct ibv_port_attr pattr; >>>> - struct ibv_recv_wr *brwr; >>>> int rc; >>>> >>>> cache->context = ibv_open_device(context_arg->device); >>>> @@ -1315,16 +1279,10 @@ >>>> cache->rwr.sg_list =&(cache->rsge); >>>> memset(&(cache->rsge), 0, sizeof(cache->rsge)); >>>> cache->rsge.addr = (uint64_t)(void *) >>>> - (cache->send_recv_buffer + sizeof(struct ib_mad_sa)); >>>> - cache->rsge.length = sizeof(struct ib_mad_sa) + 40; >>>> + (cache->send_recv_buffer + MAD_BLOCK_SIZE); >>>> + cache->rsge.length = MAD_BLOCK_SIZE + 40; >>>> cache->rsge.lkey = cache->mr->lkey; >>>> >>>> - rc = ibv_post_recv(cache->qp,&(cache->rwr),&brwr); >>>> - if (0 != rc) { >>>> - BTL_ERROR(("error posing receive on QP[%x] errno says: %s [%d]", >>>> - cache->qp->qp_num, strerror(errno), errno)); >>>> - return OMPI_ERROR; >>>> - } >>>> return 0; >>>> } >>>> >>>> @@ -1334,7 +1292,7 @@ >>>> uint16_t rem_lid) >>>> { >>>> struct ibv_send_wr swr; >>>> - struct ib_mad_sa *sag, *sar; >>>> + ib_sa_mad_t *req_mad, *resp_mad; >>>> struct ibv_sge ssge; >>>> struct mca_btl_openib_sa_qp_cache *cache; >>>> long page_size = sysconf(_SC_PAGESIZE); >>>> @@ -1342,8 +1300,8 @@ >>>> >>>> /* search for a cached item */ >>>> for (cache = sa_qp_cache; cache; cache = cache->next) { >>>> - if (strcmp(cache->device_name, >>>> - ibv_get_device_name(context_arg->device)) == 0 >>>> + if (0 == strcmp(cache->device_name, >>>> + ibv_get_device_name(context_arg->device)) >>>> && cache->port_num == port_num) { >>>> break; >>>> } >>>> @@ -1365,15 +1323,15 @@ >>>> >>>> /* if the destination lid SL value is not in the cache, go get it */ >>>> if (SL_NOT_PRESENT == cache->sl_values[rem_lid]) { >>>> - /* sag is first buffer, where we build the SA Get request to send >>>> */ >>>> - sag = (struct ib_mad_sa *)(cache->send_recv_buffer); >>>> + /* sa_mad is first buffer, where we build the SA Get request to >>>> send */ >>>> + req_mad = (ib_sa_mad_t *)(cache->send_recv_buffer); >>>> >>>> - init_sa_mad(cache, sag,&swr,&ssge, lid, rem_lid); >>>> + init_sa_mad(cache, req_mad,&swr,&ssge, lid, rem_lid); >>>> >>>> - /* sar is the receive buffer (40 byte GRH) */ >>>> - sar = (struct ib_mad_sa *)(cache->send_recv_buffer + >>>> sizeof(struct ib_mad_sa) + 40); >>>> + /* resp_mad is the receive buffer (40 byte offset is for GRH) */ >>>> + resp_mad = (ib_sa_mad_t *)(cache->send_recv_buffer + >>>> MAD_BLOCK_SIZE + 40); >>>> >>>> - rc = get_pathrecord_info(cache, sag, sar,&swr, lid, rem_lid); >>>> + rc = get_pathrecord_info(cache, req_mad, resp_mad,&swr, lid, >>>> rem_lid); >>>> if (0 != rc) { >>>> return rc; >>>> } >>>> @@ -1382,3 +1340,4 @@ >>>> /* now all we do is send back the value laying around */ >>>> return cache->sl_values[rem_lid]; >>>> } >>>> +#endif >>>> _______________________________________________ >>>> svn-full mailing list >>>> svn-f...@open-mpi.org >>>> http://www.open-mpi.org/mailman/listinfo.cgi/svn-full >>> >>> _______________________________________________ >>> devel mailing list >>> de...@open-mpi.org >>> http://www.open-mpi.org/mailman/listinfo.cgi/devel >>> >> > >