This source file includes following definitions.
- usnic_frag_type
- usnic_seg_type_str
- opal_btl_usnic_small_send_frag_alloc
- opal_btl_usnic_large_send_frag_alloc
- opal_btl_usnic_put_dest_frag_alloc
- opal_btl_usnic_send_frag_ok_to_return
- opal_btl_usnic_frag_return
- opal_btl_usnic_send_frag_return_cond
- opal_btl_usnic_frag_return_cond
- opal_btl_usnic_chunk_segment_alloc
- opal_btl_usnic_chunk_segment_return
- opal_btl_usnic_ack_segment_alloc
- opal_btl_usnic_ack_segment_return
- opal_btl_usnic_compute_sf_size
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 #ifndef OPAL_BTL_USNIC_FRAG_H
  23 #define OPAL_BTL_USNIC_FRAG_H
  24 
  25 #define OPAL_BTL_USNIC_FRAG_ALIGN (8)
  26 
  27 #include "btl_usnic.h"
  28 #include "btl_usnic_module.h"
  29 
  30 BEGIN_C_DECLS
  31 
  32 
  33 
  34 
  35 struct opal_btl_usnic_module_t;
  36 
  37 
  38 
  39 
  40 
  41 
  42 
  43 
  44 
  45 
  46 
  47 
  48 
  49 
  50 
  51 typedef enum {
  52     OPAL_BTL_USNIC_FRAG_LARGE_SEND,
  53     OPAL_BTL_USNIC_FRAG_SMALL_SEND,
  54     OPAL_BTL_USNIC_FRAG_PUT_DEST
  55 } opal_btl_usnic_frag_type_t;
  56 
  57 static inline const char *
  58 usnic_frag_type(opal_btl_usnic_frag_type_t t)
  59 {
  60     switch (t) {
  61     case OPAL_BTL_USNIC_FRAG_LARGE_SEND: return "large";
  62     case OPAL_BTL_USNIC_FRAG_SMALL_SEND: return "small";
  63     case OPAL_BTL_USNIC_FRAG_PUT_DEST: return "put dest";
  64     default: return "unknown";
  65     }
  66 }
  67 
  68 typedef enum {
  69     OPAL_BTL_USNIC_SEG_ACK,
  70     OPAL_BTL_USNIC_SEG_FRAG,
  71     OPAL_BTL_USNIC_SEG_CHUNK,
  72     OPAL_BTL_USNIC_SEG_RECV
  73 } opal_btl_usnic_seg_type_t;
  74 
  75 static inline const char *
  76 usnic_seg_type_str(opal_btl_usnic_seg_type_t t)
  77 {
  78     switch (t) {
  79     case OPAL_BTL_USNIC_SEG_ACK:   return "ACK";
  80     case OPAL_BTL_USNIC_SEG_FRAG:  return "FRAG";
  81     case OPAL_BTL_USNIC_SEG_CHUNK: return "CHUNK";
  82     case OPAL_BTL_USNIC_SEG_RECV:  return "RECV";
  83     default:                       return "unknown";
  84     }
  85 }
  86 
  87 
  88 
  89 
  90 
  91 
  92 
  93 
  94 
  95 
  96 
  97 
  98 struct mca_btl_base_registration_handle_t {
  99     
 100     uint32_t lkey;
 101     uint32_t rkey;
 102 };
 103 
 104 
 105 
 106 
 107 typedef struct opal_btl_usnic_reg_t {
 108     mca_rcache_base_registration_t base;
 109     struct fid_mr *ur_mr;
 110 } opal_btl_usnic_reg_t;
 111 
 112 
 113 
 114 
 115 
 116 typedef enum {
 117     OPAL_BTL_USNIC_PAYLOAD_TYPE_ACK = 1,
 118     OPAL_BTL_USNIC_PAYLOAD_TYPE_FRAG = 2,       
 119     OPAL_BTL_USNIC_PAYLOAD_TYPE_CHUNK = 3       
 120 } opal_btl_usnic_payload_type_t;
 121 
 122 
 123 
 124 
 125 
 126 
 127 typedef struct {
 128 
 129     
 130     uint64_t sender;
 131 
 132     
 133     opal_btl_usnic_seq_t pkt_seq;
 134     opal_btl_usnic_seq_t ack_seq;       
 135 
 136     
 137 
 138 
 139     uint16_t payload_len;
 140 
 141     
 142     char *put_addr;
 143 
 144     
 145     uint8_t payload_type;
 146 
 147     
 148     uint8_t ack_present;
 149 
 150     
 151     mca_btl_base_tag_t tag;
 152 } opal_btl_usnic_btl_header_t;
 153 
 154 
 155 
 156 
 157 typedef struct {
 158     opal_btl_usnic_btl_header_t ch_hdr;
 159 
 160     uint32_t ch_frag_id;        
 161     uint32_t ch_frag_size;      
 162     uint32_t ch_frag_offset;    
 163 } opal_btl_usnic_btl_chunk_header_t;
 164 
 165 
 166 
 167 
 168 
 169 typedef struct opal_btl_usnic_segment_t {
 170     opal_free_list_item_t us_list;
 171 
 172     opal_btl_usnic_seg_type_t us_type;
 173 
 174     
 175     union {
 176         opal_btl_usnic_btl_header_t *uus_btl_header;
 177         opal_btl_usnic_btl_chunk_header_t *uus_btl_chunk_header;
 178     } us_hdr;
 179 #define us_btl_header us_hdr.uus_btl_header
 180 #define us_btl_chunk_header us_hdr.uus_btl_chunk_header
 181 
 182     union {
 183         uint8_t *raw;
 184         void *ompi_header;
 185     } us_payload;
 186 } opal_btl_usnic_segment_t;
 187 
 188 struct opal_btl_usnic_endpoint_t;
 189 
 190 
 191 
 192 
 193 
 194 typedef struct opal_btl_usnic_recv_segment_t {
 195     opal_btl_usnic_segment_t rs_base;
 196     mca_btl_base_descriptor_t rs_desc;
 197     mca_btl_base_segment_t rs_segment;
 198 
 199     
 200     uint8_t *rs_protocol_header;
 201     size_t rs_len;
 202 
 203     struct opal_btl_usnic_recv_segment_t *rs_next;
 204 
 205     opal_btl_usnic_endpoint_t *rs_endpoint;
 206 
 207 } opal_btl_usnic_recv_segment_t;
 208 
 209 
 210 
 211 
 212 
 213 typedef struct opal_btl_usnic_send_segment_t {
 214     opal_btl_usnic_segment_t ss_base;
 215 
 216     uint8_t *ss_ptr;
 217     size_t ss_len;
 218 
 219     
 220     opal_btl_usnic_channel_id_t ss_channel;
 221 
 222     struct opal_btl_usnic_send_frag_t *ss_parent_frag;
 223     int ss_hotel_room;          
 224 
 225     
 226     uint32_t ss_send_posted;
 227     bool ss_ack_pending;        
 228 
 229 } opal_btl_usnic_send_segment_t;
 230 
 231 typedef opal_btl_usnic_send_segment_t opal_btl_usnic_frag_segment_t;
 232 typedef opal_btl_usnic_send_segment_t opal_btl_usnic_chunk_segment_t;
 233 
 234 
 235 
 236 
 237 typedef struct opal_btl_usnic_frag_t {
 238     mca_btl_base_descriptor_t uf_base;
 239 
 240     
 241     opal_btl_usnic_frag_type_t uf_type;
 242 
 243     
 244     mca_btl_base_segment_t uf_local_seg[2];
 245     mca_btl_base_segment_t uf_remote_seg[1];
 246 
 247     
 248     opal_free_list_t *uf_freelist;
 249 } opal_btl_usnic_frag_t;
 250 
 251 
 252 
 253 
 254 typedef struct opal_btl_usnic_send_frag_t {
 255     opal_btl_usnic_frag_t sf_base;
 256 
 257     struct mca_btl_base_endpoint_t *sf_endpoint;
 258 
 259     size_t sf_size;             
 260 
 261     struct opal_convertor_t sf_convertor; 
 262 
 263 
 264     uint32_t sf_seg_post_cnt;   
 265     size_t sf_ack_bytes_left;   
 266 
 267     struct opal_btl_usnic_send_frag_t *sf_next;
 268 } opal_btl_usnic_send_frag_t;
 269 
 270 
 271 
 272 
 273 
 274 
 275 typedef struct opal_btl_usnic_large_send_frag_t {
 276     opal_btl_usnic_send_frag_t lsf_base;
 277 
 278     char lsf_ompi_header[64];   
 279     mca_btl_base_tag_t lsf_tag; 
 280 
 281     uint32_t lsf_frag_id;       
 282 
 283     size_t lsf_cur_offset;      
 284 
 285     size_t lsf_bytes_left;      
 286 
 287     size_t lsf_pack_bytes_left; 
 288 
 289     uint8_t *lsf_cur_ptr;       
 290     int lsf_cur_sge;
 291     size_t lsf_bytes_left_in_sge;
 292 
 293     uint8_t *lsf_buffer;        
 294 
 295     opal_list_t lsf_seg_chain;  
 296 
 297     bool lsf_pack_on_the_fly;   
 298 } opal_btl_usnic_large_send_frag_t;
 299 
 300 
 301 
 302 #define lsf_des_src       lsf_base.sf_base.uf_local_seg
 303 
 304 
 305 
 306 
 307 
 308 
 309 
 310 
 311 
 312 
 313 
 314 
 315 typedef struct opal_btl_usnic_small_send_frag_t {
 316     opal_btl_usnic_send_frag_t ssf_base;
 317 
 318     
 319     opal_btl_usnic_send_segment_t ssf_segment;
 320 
 321 } opal_btl_usnic_small_send_frag_t;
 322 
 323 
 324 
 325 
 326 typedef opal_btl_usnic_frag_t opal_btl_usnic_put_dest_frag_t;
 327 
 328 
 329 
 330 
 331 
 332 
 333 
 334 
 335 typedef struct opal_btl_usnic_rx_buf_t {
 336     opal_free_list_item_t rb_super;
 337     char buf[1]; 
 338 } opal_btl_usnic_rx_buf_t;
 339 
 340 OBJ_CLASS_DECLARATION(opal_btl_usnic_send_frag_t);
 341 OBJ_CLASS_DECLARATION(opal_btl_usnic_small_send_frag_t);
 342 OBJ_CLASS_DECLARATION(opal_btl_usnic_large_send_frag_t);
 343 OBJ_CLASS_DECLARATION(opal_btl_usnic_put_dest_frag_t);
 344 
 345 OBJ_CLASS_DECLARATION(opal_btl_usnic_segment_t);
 346 OBJ_CLASS_DECLARATION(opal_btl_usnic_frag_segment_t);
 347 OBJ_CLASS_DECLARATION(opal_btl_usnic_chunk_segment_t);
 348 OBJ_CLASS_DECLARATION(opal_btl_usnic_recv_segment_t);
 349 
 350 OBJ_CLASS_DECLARATION(opal_btl_usnic_rx_buf_t);
 351 
 352 typedef opal_btl_usnic_send_segment_t opal_btl_usnic_ack_segment_t;
 353 OBJ_CLASS_DECLARATION(opal_btl_usnic_ack_segment_t);
 354 
 355 
 356 
 357 
 358 static inline opal_btl_usnic_small_send_frag_t *
 359 opal_btl_usnic_small_send_frag_alloc(opal_btl_usnic_module_t *module)
 360 {
 361     opal_free_list_item_t *item;
 362     opal_btl_usnic_small_send_frag_t *frag;
 363 
 364     USNIC_COMPAT_FREE_LIST_GET(&(module->small_send_frags), item);
 365     if (OPAL_UNLIKELY(NULL == item)) {
 366         return NULL;
 367     }
 368 
 369     frag = (opal_btl_usnic_small_send_frag_t*) item;
 370 
 371     
 372     frag->ssf_base.sf_base.uf_freelist = &(module->small_send_frags);
 373     frag->ssf_segment.ss_send_posted = 0;
 374 
 375     assert(frag);
 376     assert(OPAL_BTL_USNIC_FRAG_SMALL_SEND == frag->ssf_base.sf_base.uf_type);
 377 
 378     return frag;
 379 }
 380 
 381 static inline opal_btl_usnic_large_send_frag_t *
 382 opal_btl_usnic_large_send_frag_alloc(opal_btl_usnic_module_t *module)
 383 {
 384     opal_free_list_item_t *item;
 385     opal_btl_usnic_large_send_frag_t *frag;
 386 
 387     USNIC_COMPAT_FREE_LIST_GET(&(module->large_send_frags), item);
 388     if (OPAL_UNLIKELY(NULL == item)) {
 389         return NULL;
 390     }
 391 
 392     frag = (opal_btl_usnic_large_send_frag_t*) item;
 393 
 394     
 395     frag->lsf_base.sf_base.uf_freelist = &(module->large_send_frags);
 396 
 397     assert(frag);
 398     assert(OPAL_BTL_USNIC_FRAG_LARGE_SEND == frag->lsf_base.sf_base.uf_type);
 399 
 400     return frag;
 401 }
 402 
 403 static inline opal_btl_usnic_put_dest_frag_t *
 404 opal_btl_usnic_put_dest_frag_alloc(
 405     struct opal_btl_usnic_module_t *module)
 406 {
 407     opal_free_list_item_t *item;
 408     opal_btl_usnic_put_dest_frag_t *frag;
 409 
 410     USNIC_COMPAT_FREE_LIST_GET(&(module->put_dest_frags), item);
 411     if (OPAL_UNLIKELY(NULL == item)) {
 412         return NULL;
 413     }
 414 
 415     frag = (opal_btl_usnic_put_dest_frag_t*) item;
 416 
 417     
 418     frag->uf_freelist = &(module->put_dest_frags);
 419 
 420     assert(frag);
 421     assert(OPAL_BTL_USNIC_FRAG_PUT_DEST == frag->uf_type);
 422 
 423     return frag;
 424 }
 425 
 426 
 427 
 428 
 429 
 430 
 431 
 432 
 433 
 434 
 435 
 436 static inline bool
 437 opal_btl_usnic_send_frag_ok_to_return(
 438     opal_btl_usnic_module_t *module,
 439     opal_btl_usnic_send_frag_t *frag)
 440 {
 441     assert(frag);
 442 
 443     if (OPAL_LIKELY(frag->sf_base.uf_base.des_flags &
 444                 MCA_BTL_DES_FLAGS_BTL_OWNERSHIP) &&
 445         0 == frag->sf_ack_bytes_left &&
 446         0 == frag->sf_seg_post_cnt) {
 447         return true;
 448     }
 449 
 450     return false;
 451 }
 452 
 453 static inline void
 454 opal_btl_usnic_frag_return(
 455     struct opal_btl_usnic_module_t *module,
 456     opal_btl_usnic_frag_t *frag)
 457 {
 458 #if MSGDEBUG1
 459     opal_output(0, "freeing frag %p, type %s\n", (void *)frag,
 460             usnic_frag_type(frag->uf_type));
 461 #endif
 462     frag->uf_local_seg[0].seg_len = 0;
 463     frag->uf_local_seg[1].seg_len = 0;
 464 
 465     
 466 
 467 
 468     if (frag->uf_type == OPAL_BTL_USNIC_FRAG_LARGE_SEND) {
 469         opal_btl_usnic_large_send_frag_t *lfrag;
 470         lfrag = (opal_btl_usnic_large_send_frag_t *)frag;
 471         if (lfrag->lsf_buffer != NULL) {
 472             free(lfrag->lsf_buffer);
 473             lfrag->lsf_buffer = NULL;
 474         }
 475         lfrag->lsf_pack_on_the_fly = false;
 476 
 477         
 478         if (2 == lfrag->lsf_base.sf_base.uf_base.USNIC_SEND_LOCAL_COUNT &&
 479             NULL == lfrag->lsf_des_src[1].seg_addr.pval) {
 480             opal_convertor_cleanup(&lfrag->lsf_base.sf_convertor);
 481         }
 482     }
 483 
 484     
 485 
 486     else if (frag->uf_type == OPAL_BTL_USNIC_FRAG_SMALL_SEND) {
 487         opal_btl_usnic_small_send_frag_t *sfrag;
 488         sfrag = (opal_btl_usnic_small_send_frag_t *) frag;
 489         sfrag->ssf_segment.ss_send_posted = 0;
 490     }
 491 
 492     USNIC_COMPAT_FREE_LIST_RETURN(frag->uf_freelist, &(frag->uf_base.super));
 493 }
 494 
 495 
 496 
 497 
 498 static inline void
 499 opal_btl_usnic_send_frag_return_cond(
 500     struct opal_btl_usnic_module_t *module,
 501     opal_btl_usnic_send_frag_t *frag)
 502 {
 503     if (opal_btl_usnic_send_frag_ok_to_return(module, frag)) {
 504         opal_btl_usnic_frag_return(module, &frag->sf_base);
 505     }
 506 }
 507 
 508 
 509 
 510 
 511 
 512 
 513 
 514 static inline void
 515 opal_btl_usnic_frag_return_cond(
 516     struct opal_btl_usnic_module_t *module,
 517     opal_btl_usnic_frag_t *frag)
 518 {
 519     if (OPAL_BTL_USNIC_FRAG_PUT_DEST == frag->uf_type) {
 520         if (OPAL_LIKELY(frag->uf_base.des_flags &
 521                                     MCA_BTL_DES_FLAGS_BTL_OWNERSHIP)) {
 522             opal_btl_usnic_frag_return(module, frag);
 523         }
 524     } else {
 525         opal_btl_usnic_send_frag_return_cond(module,
 526                 (opal_btl_usnic_send_frag_t *)frag);
 527     }
 528 }
 529 
 530 static inline opal_btl_usnic_chunk_segment_t *
 531 opal_btl_usnic_chunk_segment_alloc(
 532     opal_btl_usnic_module_t *module)
 533 {
 534     opal_free_list_item_t *item;
 535     opal_btl_usnic_send_segment_t *seg;
 536 
 537     USNIC_COMPAT_FREE_LIST_GET(&(module->chunk_segs), item);
 538     if (OPAL_UNLIKELY(NULL == item)) {
 539         return NULL;
 540     }
 541 
 542     seg = (opal_btl_usnic_send_segment_t*) item;
 543     seg->ss_channel = USNIC_DATA_CHANNEL;
 544 
 545     assert(seg);
 546     assert(OPAL_BTL_USNIC_SEG_CHUNK == seg->ss_base.us_type);
 547 
 548     return seg;
 549 }
 550 
 551 static inline void
 552 opal_btl_usnic_chunk_segment_return(
 553     opal_btl_usnic_module_t *module,
 554     opal_btl_usnic_chunk_segment_t *seg)
 555 {
 556     assert(seg);
 557     assert(OPAL_BTL_USNIC_SEG_CHUNK == seg->ss_base.us_type);
 558 
 559     USNIC_COMPAT_FREE_LIST_RETURN(&(module->chunk_segs), &(seg->ss_base.us_list));
 560 }
 561 
 562 
 563 
 564 
 565 static inline opal_btl_usnic_ack_segment_t *
 566 opal_btl_usnic_ack_segment_alloc(opal_btl_usnic_module_t *module)
 567 {
 568     opal_free_list_item_t *item;
 569     opal_btl_usnic_send_segment_t *ack;
 570 
 571     USNIC_COMPAT_FREE_LIST_GET(&(module->ack_segs), item);
 572     if (OPAL_UNLIKELY(NULL == item)) {
 573         return NULL;
 574     }
 575 
 576     ack = (opal_btl_usnic_ack_segment_t*) item;
 577     ack->ss_channel = USNIC_PRIORITY_CHANNEL;
 578 
 579     assert(ack);
 580     assert(OPAL_BTL_USNIC_SEG_ACK == ack->ss_base.us_type);
 581 
 582     return ack;
 583 }
 584 
 585 
 586 
 587 
 588 static inline void
 589 opal_btl_usnic_ack_segment_return(
 590     opal_btl_usnic_module_t *module,
 591     opal_btl_usnic_ack_segment_t *ack)
 592 {
 593     assert(ack);
 594     assert(OPAL_BTL_USNIC_SEG_ACK == ack->ss_base.us_type);
 595 
 596     USNIC_COMPAT_FREE_LIST_RETURN(&(module->ack_segs), &(ack->ss_base.us_list));
 597 }
 598 
 599 
 600 
 601 
 602 static inline void
 603 opal_btl_usnic_compute_sf_size(opal_btl_usnic_send_frag_t *sfrag)
 604 {
 605     opal_btl_usnic_frag_t *frag;
 606 
 607     frag = &sfrag->sf_base;
 608 
 609     
 610 #if 0
 611     assert(frag->uf_base.USNIC_SEND_LOCAL_COUNT > 0);
 612     assert(frag->uf_base.USNIC_SEND_LOCAL_COUNT <= 2);
 613 
 614     
 615     assert(2 == frag->uf_base.USNIC_SEND_LOCAL_COUNT ||
 616         0 == frag->uf_local_seg[1].seg_len);
 617 #endif
 618 
 619     sfrag->sf_size = 0;
 620     sfrag->sf_size += frag->uf_local_seg[0].seg_len;
 621     sfrag->sf_size += frag->uf_local_seg[1].seg_len;
 622 }
 623 
 624 END_C_DECLS
 625 
 626 #endif