This source file includes following definitions.
- mca_btl_vader_frag_alloc
- mca_btl_vader_frag_return
- mca_btl_vader_frag_complete
- mca_btl_vader_rdma_frag_alloc
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 #ifndef MCA_BTL_VADER_SEND_FRAG_H
  25 #define MCA_BTL_VADER_SEND_FRAG_H
  26 
  27 #include "opal_config.h"
  28 
  29 enum {
  30     MCA_BTL_VADER_FLAG_INLINE      = 0,
  31     MCA_BTL_VADER_FLAG_SINGLE_COPY = 1,
  32     MCA_BTL_VADER_FLAG_COMPLETE    = 2,
  33     MCA_BTL_VADER_FLAG_SETUP_FBOX  = 4,
  34 };
  35 
  36 struct mca_btl_vader_frag_t;
  37 struct mca_btl_vader_fbox_t;
  38 
  39 enum mca_btl_vader_sc_emu_type_t {
  40     MCA_BTL_VADER_OP_PUT,
  41     MCA_BTL_VADER_OP_GET,
  42     MCA_BTL_VADER_OP_ATOMIC,
  43     MCA_BTL_VADER_OP_CSWAP,
  44 };
  45 typedef enum mca_btl_vader_sc_emu_type_t mca_btl_vader_sc_emu_type_t;
  46 
  47 struct mca_btl_vader_sc_emu_hdr_t {
  48     mca_btl_vader_sc_emu_type_t type;
  49     uint64_t addr;
  50     mca_btl_base_atomic_op_t op;
  51     int flags;
  52     int64_t operand[2];
  53 };
  54 typedef struct mca_btl_vader_sc_emu_hdr_t mca_btl_vader_sc_emu_hdr_t;
  55 
  56 
  57 
  58 
  59 struct mca_btl_vader_hdr_t {
  60     
  61     volatile intptr_t next;
  62     
  63     struct mca_btl_vader_frag_t *frag;
  64     
  65     mca_btl_base_tag_t tag;
  66     
  67     uint8_t flags;
  68     
  69     int32_t len;
  70     
  71     struct iovec sc_iov;
  72     
  73     intptr_t fbox_base;
  74 };
  75 typedef struct mca_btl_vader_hdr_t mca_btl_vader_hdr_t;
  76 
  77 
  78 
  79 
  80 struct mca_btl_vader_frag_t {
  81     
  82     mca_btl_base_descriptor_t base;
  83     
  84     mca_btl_base_segment_t segments[2];
  85     
  86     struct mca_btl_base_endpoint_t *endpoint;
  87     
  88     mca_btl_vader_hdr_t *hdr;
  89     
  90     opal_free_list_t *my_list;
  91     
  92     struct mca_btl_vader_rdma_cbdata_t {
  93         void *local_address;
  94         mca_btl_base_rdma_completion_fn_t cbfunc;
  95         void *context;
  96         void *cbdata;
  97     } rdma;
  98 };
  99 
 100 typedef struct mca_btl_vader_frag_t mca_btl_vader_frag_t;
 101 
 102 static inline int mca_btl_vader_frag_alloc (mca_btl_vader_frag_t **frag, opal_free_list_t *list,
 103                                             struct mca_btl_base_endpoint_t *endpoint) {
 104     *frag = (mca_btl_vader_frag_t *) opal_free_list_get (list);
 105     if (OPAL_LIKELY(NULL != *frag)) {
 106         (*frag)->endpoint = endpoint;
 107     }
 108 
 109     return OPAL_SUCCESS;
 110 }
 111 
 112 static inline void mca_btl_vader_frag_return (mca_btl_vader_frag_t *frag)
 113 {
 114     if (frag->hdr) {
 115         frag->hdr->flags = 0;
 116     }
 117 
 118     frag->segments[0].seg_addr.pval = (char *)(frag->hdr + 1);
 119     frag->base.des_segment_count = 1;
 120 
 121     opal_free_list_return (frag->my_list, (opal_free_list_item_t *)frag);
 122 }
 123 
 124 OBJ_CLASS_DECLARATION(mca_btl_vader_frag_t);
 125 
 126 #define MCA_BTL_VADER_FRAG_ALLOC_EAGER(frag, endpoint)                  \
 127     mca_btl_vader_frag_alloc (&(frag), &mca_btl_vader_component.vader_frags_eager, endpoint)
 128 
 129 #define MCA_BTL_VADER_FRAG_ALLOC_MAX(frag, endpoint)                    \
 130     mca_btl_vader_frag_alloc (&(frag), &mca_btl_vader_component.vader_frags_max_send, endpoint)
 131 
 132 #define MCA_BTL_VADER_FRAG_ALLOC_USER(frag, endpoint)                   \
 133     mca_btl_vader_frag_alloc (&(frag), &mca_btl_vader_component.vader_frags_user, endpoint)
 134 
 135 #define MCA_BTL_VADER_FRAG_RETURN(frag) mca_btl_vader_frag_return(frag)
 136 
 137 
 138 static inline void mca_btl_vader_frag_complete (mca_btl_vader_frag_t *frag) {
 139     
 140     int des_flags = frag->base.des_flags;
 141 
 142     if (OPAL_UNLIKELY(MCA_BTL_DES_SEND_ALWAYS_CALLBACK & des_flags)) {
 143         
 144         frag->base.des_cbfunc (&mca_btl_vader.super, frag->endpoint, &frag->base, OPAL_SUCCESS);
 145     }
 146 
 147     if (OPAL_LIKELY(des_flags & MCA_BTL_DES_FLAGS_BTL_OWNERSHIP)) {
 148         MCA_BTL_VADER_FRAG_RETURN(frag);
 149     }
 150 }
 151 
 152 int mca_btl_vader_frag_init (opal_free_list_item_t *item, void *ctx);
 153 
 154 static inline mca_btl_vader_frag_t *
 155 mca_btl_vader_rdma_frag_alloc (mca_btl_base_module_t *btl, mca_btl_base_endpoint_t *endpoint, int type,
 156                                uint64_t operand1, uint64_t operand2, mca_btl_base_atomic_op_t op, int order,
 157                                int flags, size_t size, void *local_address, int64_t remote_address,
 158                                mca_btl_base_rdma_completion_fn_t cbfunc, void *cbcontext,
 159                                void *cbdata, mca_btl_base_completion_fn_t des_cbfunc)
 160 {
 161     mca_btl_vader_sc_emu_hdr_t *hdr;
 162     size_t total_size = size + sizeof (*hdr);
 163     mca_btl_vader_frag_t *frag;
 164 
 165     frag = (mca_btl_vader_frag_t *) mca_btl_vader_alloc (btl, endpoint, order, total_size,
 166                                                          MCA_BTL_DES_SEND_ALWAYS_CALLBACK);
 167     if (OPAL_UNLIKELY(NULL == frag)) {
 168         return NULL;
 169     }
 170 
 171     frag->base.des_cbfunc = des_cbfunc;
 172     frag->rdma.local_address = local_address;
 173     frag->rdma.cbfunc = cbfunc;
 174     frag->rdma.context = cbcontext;
 175     frag->rdma.cbdata = cbdata;
 176 
 177     hdr = (mca_btl_vader_sc_emu_hdr_t *) frag->segments[0].seg_addr.pval;
 178 
 179     hdr->type = type;
 180     hdr->addr = remote_address;
 181     hdr->op = op;
 182     hdr->flags = flags;
 183     hdr->operand[0] = operand1;
 184     hdr->operand[1] = operand2;
 185 
 186     return frag;
 187 }
 188 
 189 #endif