root/opal/mca/btl/usnic/btl_usnic_frag.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. common_send_seg_helper
  2. chunk_seg_constructor
  3. frag_seg_constructor
  4. ack_seg_constructor
  5. recv_seg_constructor
  6. send_frag_constructor
  7. send_frag_destructor
  8. small_send_frag_constructor
  9. small_send_frag_destructor
  10. large_send_frag_constructor
  11. put_dest_frag_constructor
  12. put_dest_frag_destructor

   1 /*
   2  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
   3  *                         University Research and Technology
   4  *                         Corporation.  All rights reserved.
   5  * Copyright (c) 2004-2005 The University of Tennessee and The University
   6  *                         of Tennessee Research Foundation.  All rights
   7  *                         reserved.
   8  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
   9  *                         University of Stuttgart.  All rights reserved.
  10  * Copyright (c) 2004-2005 The Regents of the University of California.
  11  *                         All rights reserved.
  12  * Copyright (c) 2006      Sandia National Laboratories. All rights
  13  *                         reserved.
  14  * Copyright (c) 2013-2017 Cisco Systems, Inc.  All rights reserved.
  15  * $COPYRIGHT$
  16  *
  17  * Additional copyrights may follow
  18  *
  19  * $HEADER$
  20  */
  21 
  22 #include "opal_config.h"
  23 
  24 #include <string.h>
  25 
  26 #include "btl_usnic.h"
  27 #include "btl_usnic_endpoint.h"
  28 #include "btl_usnic_module.h"
  29 #include "btl_usnic_frag.h"
  30 #include "btl_usnic_ack.h"
  31 
  32 static void
  33 common_send_seg_helper(opal_btl_usnic_send_segment_t *seg)
  34 {
  35     opal_btl_usnic_segment_t *bseg;
  36 
  37     /* send ptr for fi_send().  ss_len will be filled in right before
  38        the actual send. */
  39     seg->ss_ptr = (uint8_t *) seg->ss_base.us_list.ptr;
  40     seg->ss_send_posted = 0;
  41     seg->ss_ack_pending = false;
  42 
  43     /* Offset the BTL header by (prefix_send_offset) bytes into the
  44        raw buffer */
  45     bseg = &seg->ss_base;
  46     bseg->us_btl_header = (opal_btl_usnic_btl_header_t *)
  47         (seg->ss_ptr + mca_btl_usnic_component.prefix_send_offset);
  48     bseg->us_btl_header->sender = mca_btl_usnic_component.my_hashed_rte_name;
  49 }
  50 
  51 static void
  52 chunk_seg_constructor(
  53     opal_btl_usnic_chunk_segment_t *cseg)
  54 {
  55     opal_btl_usnic_segment_t *bseg;
  56 
  57     bseg = &cseg->ss_base;
  58     bseg->us_type = OPAL_BTL_USNIC_SEG_CHUNK;
  59 
  60     /* some more common initializaiton */
  61     common_send_seg_helper(cseg);
  62 
  63     /* payload starts next byte beyond BTL chunk header */
  64     bseg->us_payload.raw = (uint8_t *)(bseg->us_btl_chunk_header + 1);
  65 
  66     bseg->us_btl_header->payload_type = OPAL_BTL_USNIC_PAYLOAD_TYPE_CHUNK;
  67 }
  68 
  69 static void
  70 frag_seg_constructor(
  71     opal_btl_usnic_frag_segment_t *fseg)
  72 {
  73     opal_btl_usnic_segment_t *bseg;
  74 
  75     bseg = &fseg->ss_base;
  76     bseg->us_type = OPAL_BTL_USNIC_SEG_FRAG;
  77 
  78     /* some more common initializaiton */
  79     common_send_seg_helper(fseg);
  80 
  81     /* payload starts next byte beyond BTL header */
  82     bseg->us_payload.raw = (uint8_t *)(bseg->us_btl_header + 1);
  83 
  84     bseg->us_btl_header->payload_type = OPAL_BTL_USNIC_PAYLOAD_TYPE_FRAG;
  85 }
  86 
  87 static void
  88 ack_seg_constructor(
  89     opal_btl_usnic_ack_segment_t *ack)
  90 {
  91     opal_btl_usnic_segment_t *bseg;
  92 
  93     bseg = &ack->ss_base;
  94     bseg->us_type = OPAL_BTL_USNIC_SEG_ACK;
  95 
  96     /* some more common initializaiton */
  97     common_send_seg_helper(ack);
  98 
  99     /* ACK value embedded in BTL header */
 100     bseg->us_btl_header->payload_type = OPAL_BTL_USNIC_PAYLOAD_TYPE_ACK;
 101     bseg->us_btl_header->payload_len = 0;
 102     bseg->us_btl_header->ack_present = 1;
 103 
 104     ack->ss_len = sizeof(bseg->us_btl_header);
 105 }
 106 
 107 
 108 static void
 109 recv_seg_constructor(
 110     opal_btl_usnic_recv_segment_t *seg)
 111 {
 112     opal_btl_usnic_segment_t *bseg;
 113 
 114     bseg = &seg->rs_base;
 115     bseg->us_type = OPAL_BTL_USNIC_SEG_RECV;
 116 
 117     /* on receive, BTL header starts after protocol header */
 118     seg->rs_protocol_header = bseg->us_list.ptr;
 119     bseg->us_btl_header = (opal_btl_usnic_btl_header_t *)(
 120         ((char *) seg->rs_protocol_header) +
 121         mca_btl_usnic_component.transport_header_len);
 122 
 123     /* initialize descriptor */
 124     /* JMS Initializing RECV_REMOTE for receive frags is unnecessary
 125        with BTL 3.0.  The only reason to keep this here would be for
 126        compatibility with the BTL 2.0 usnic-v1.8 git branch (i.e.,
 127        it's harmless to do this assignment first, before the
 128        RECV_LOCAL assignments -- the compiler will likely compile out
 129        this dead code, anyway). */
 130     seg->rs_desc.USNIC_RECV_REMOTE = NULL;
 131     seg->rs_desc.USNIC_RECV_REMOTE_COUNT = 0;
 132 
 133     seg->rs_desc.USNIC_RECV_LOCAL = &seg->rs_segment;
 134     seg->rs_desc.USNIC_RECV_LOCAL_COUNT = 1;
 135 
 136     /*
 137      * This pointer is only correct for incoming segments of type
 138      * OPAL_BTL_USNIC_PAYLOAD_TYPE_FRAG, but that's the only time
 139      * we ever give segment directly to upper layer, so its OK
 140      */
 141     bseg->us_payload.ompi_header = (mca_btl_base_header_t *)
 142         (bseg->us_btl_header+1);
 143     seg->rs_segment.seg_addr.pval = bseg->us_payload.ompi_header;
 144 }
 145 
 146 static void
 147 send_frag_constructor(opal_btl_usnic_send_frag_t *frag)
 148 {
 149     mca_btl_base_descriptor_t *desc;
 150 
 151     /* Fill in source descriptor */
 152     desc = &frag->sf_base.uf_base;
 153 
 154     /* JMS Initializing SEND_REMOTE for receive frags is unnecessary
 155        with BTL 3.0.  The only reason to keep this here would be for
 156        compatibility with the BTL 2.0 usnic-v1.8 git branch (i.e.,
 157        it's harmless to do this assignment first, before the
 158        SEND_LOCAL assignments -- the compiler will likely compile out
 159        this dead code, anyway). */
 160     desc->USNIC_SEND_REMOTE = frag->sf_base.uf_remote_seg;
 161     desc->USNIC_SEND_REMOTE_COUNT = 0;
 162 
 163     desc->USNIC_SEND_LOCAL = frag->sf_base.uf_local_seg;
 164     frag->sf_base.uf_local_seg[0].seg_len = 0;
 165     frag->sf_base.uf_local_seg[1].seg_len = 0;
 166     desc->USNIC_SEND_LOCAL_COUNT = 2;
 167 
 168     desc->order = MCA_BTL_NO_ORDER;
 169     desc->des_flags = 0;
 170 
 171     OBJ_CONSTRUCT(&frag->sf_convertor, opal_convertor_t);
 172     frag->sf_seg_post_cnt = 0;
 173 }
 174 
 175 static void
 176 send_frag_destructor(opal_btl_usnic_send_frag_t *frag)
 177 {
 178 #if OPAL_ENABLE_DEBUG
 179     /* make sure nobody twiddled these values after the constructor */
 180     mca_btl_base_descriptor_t *desc;
 181     desc = &frag->sf_base.uf_base;
 182     assert(desc->USNIC_SEND_LOCAL == frag->sf_base.uf_local_seg);
 183     assert(0 == frag->sf_base.uf_local_seg[0].seg_len);
 184 #endif
 185 
 186     /* PML may change desc->des_remote to point elsewhere, cannot assert that it
 187      * still points to our embedded segment */
 188 
 189     OBJ_DESTRUCT(&frag->sf_convertor);
 190 }
 191 
 192 static void
 193 small_send_frag_constructor(opal_btl_usnic_small_send_frag_t *frag)
 194 {
 195     opal_btl_usnic_frag_segment_t *fseg;
 196 
 197     /* construct the embedded segment */
 198     fseg = &frag->ssf_segment;
 199     /* us_list.ptr is "input" to the constructor, must come before ctor */
 200     fseg->ss_base.us_list.ptr = frag->ssf_base.sf_base.uf_base.super.ptr;
 201     OBJ_CONSTRUCT(fseg, opal_btl_usnic_frag_segment_t);
 202 
 203     /* set us as parent in dedicated frag */
 204     fseg->ss_parent_frag = (struct opal_btl_usnic_send_frag_t *)frag;
 205 
 206     frag->ssf_base.sf_base.uf_type = OPAL_BTL_USNIC_FRAG_SMALL_SEND;
 207 
 208     /* save data pointer for PML */
 209     frag->ssf_base.sf_base.uf_local_seg[0].seg_addr.pval =
 210         fseg->ss_base.us_payload.raw;
 211 }
 212 
 213 static void
 214 small_send_frag_destructor(opal_btl_usnic_small_send_frag_t *frag)
 215 {
 216     opal_btl_usnic_frag_segment_t *fseg;
 217 
 218     fseg = &frag->ssf_segment;
 219     assert(fseg->ss_parent_frag == (struct opal_btl_usnic_send_frag_t *)frag);
 220     assert(frag->ssf_base.sf_base.uf_type == OPAL_BTL_USNIC_FRAG_SMALL_SEND);
 221     assert(frag->ssf_base.sf_base.uf_local_seg[0].seg_addr.pval ==
 222            fseg->ss_base.us_payload.raw);
 223     OBJ_DESTRUCT(fseg);
 224 }
 225 
 226 static void
 227 large_send_frag_constructor(opal_btl_usnic_large_send_frag_t *lfrag)
 228 {
 229     lfrag->lsf_base.sf_base.uf_type = OPAL_BTL_USNIC_FRAG_LARGE_SEND;
 230 
 231     /* save data pointer for upper layer */
 232     lfrag->lsf_base.sf_base.uf_local_seg[0].seg_addr.pval =
 233                     &lfrag->lsf_ompi_header;
 234 
 235     lfrag->lsf_buffer = NULL;
 236     OBJ_CONSTRUCT(&lfrag->lsf_seg_chain, opal_list_t);
 237     lfrag->lsf_pack_on_the_fly = false;
 238 }
 239 
 240 static void
 241 put_dest_frag_constructor(opal_btl_usnic_put_dest_frag_t *pfrag)
 242 {
 243     pfrag->uf_type = OPAL_BTL_USNIC_FRAG_PUT_DEST;
 244 
 245     /* point dest to our utility segment */
 246     pfrag->uf_base.USNIC_PUT_LOCAL = pfrag->uf_remote_seg;
 247     pfrag->uf_base.USNIC_PUT_LOCAL_COUNT = 1;
 248 }
 249 
 250 static void
 251 put_dest_frag_destructor(opal_btl_usnic_put_dest_frag_t *pfrag)
 252 {
 253     assert(pfrag->uf_base.USNIC_PUT_LOCAL == pfrag->uf_remote_seg);
 254     assert(1 == pfrag->uf_base.USNIC_PUT_LOCAL_COUNT);
 255 }
 256 
 257 OBJ_CLASS_INSTANCE(opal_btl_usnic_segment_t,
 258                    opal_free_list_item_t,
 259                    NULL,
 260                    NULL);
 261 
 262 OBJ_CLASS_INSTANCE(opal_btl_usnic_frag_segment_t,
 263                    opal_btl_usnic_segment_t,
 264                    frag_seg_constructor,
 265                    NULL);
 266 
 267 OBJ_CLASS_INSTANCE(opal_btl_usnic_chunk_segment_t,
 268                    opal_btl_usnic_segment_t,
 269                    chunk_seg_constructor,
 270                    NULL);
 271 
 272 OBJ_CLASS_INSTANCE(opal_btl_usnic_recv_segment_t,
 273                    opal_btl_usnic_segment_t,
 274                    recv_seg_constructor,
 275                    NULL);
 276 
 277 OBJ_CLASS_INSTANCE(opal_btl_usnic_ack_segment_t,
 278                    opal_btl_usnic_segment_t,
 279                    ack_seg_constructor,
 280                    NULL);
 281 
 282 /*
 283  * Fragments
 284  */
 285 OBJ_CLASS_INSTANCE(opal_btl_usnic_frag_t,
 286                    mca_btl_base_descriptor_t,
 287                    NULL,
 288                    NULL);
 289 
 290 OBJ_CLASS_INSTANCE(opal_btl_usnic_send_frag_t,
 291                    opal_btl_usnic_frag_t,
 292                    send_frag_constructor,
 293                    send_frag_destructor);
 294 
 295 OBJ_CLASS_INSTANCE(opal_btl_usnic_large_send_frag_t,
 296                    opal_btl_usnic_send_frag_t,
 297                    large_send_frag_constructor,
 298                    NULL);
 299 
 300 OBJ_CLASS_INSTANCE(opal_btl_usnic_small_send_frag_t,
 301                    opal_btl_usnic_send_frag_t,
 302                    small_send_frag_constructor,
 303                    small_send_frag_destructor);
 304 
 305 OBJ_CLASS_INSTANCE(opal_btl_usnic_put_dest_frag_t,
 306                    opal_btl_usnic_frag_t,
 307                    put_dest_frag_constructor,
 308                    put_dest_frag_destructor);
 309 
 310 OBJ_CLASS_INSTANCE(opal_btl_usnic_rx_buf_t,
 311                    opal_free_list_item_t,
 312                    NULL,
 313                    NULL);

/* [<][>][^][v][top][bottom][index][help] */