root/opal/mca/btl/vader/btl_vader_frag.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. mca_btl_vader_frag_alloc
  2. mca_btl_vader_frag_return
  3. mca_btl_vader_frag_complete
  4. mca_btl_vader_rdma_frag_alloc

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
   4  *                         University Research and Technology
   5  *                         Corporation.  All rights reserved.
   6  * Copyright (c) 2004-2009 The University of Tennessee and The University
   7  *                         of Tennessee Research Foundation.  All rights
   8  *                         reserved.
   9  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
  10  *                         University of Stuttgart.  All rights reserved.
  11  * Copyright (c) 2004-2005 The Regents of the University of California.
  12  *                         All rights reserved.
  13  * Copyright (c) 2008      Sun Microsystems, Inc.  All rights reserved.
  14  * Copyright (c) 2009      Cisco Systems, Inc.  All rights reserved.
  15  * Copyright (c) 2011-2015 Los Alamos National Security, LLC. All rights
  16  *                         reserved.
  17  * $COPYRIGHT$
  18  *
  19  * Additional copyrights may follow
  20  *
  21  * $HEADER$
  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  * FIFO fragment header
  58  */
  59 struct mca_btl_vader_hdr_t {
  60     /** next item in fifo. many peers may touch this */
  61     volatile intptr_t next;
  62     /** pointer back the the fragment */
  63     struct mca_btl_vader_frag_t *frag;
  64     /** tag associated with this fragment (used to lookup callback) */
  65     mca_btl_base_tag_t tag;
  66     /** vader send flags (inline, complete, setup fbox, etc) */
  67     uint8_t flags;
  68     /** length of data following this header */
  69     int32_t len;
  70     /** io vector containing pointer to single-copy data */
  71     struct iovec sc_iov;
  72     /** if the fragment indicates to setup a fast box the base is stored here */
  73     intptr_t fbox_base;
  74 };
  75 typedef struct mca_btl_vader_hdr_t mca_btl_vader_hdr_t;
  76 
  77 /**
  78  * shared memory send fragment derived type.
  79  */
  80 struct mca_btl_vader_frag_t {
  81     /** base object */
  82     mca_btl_base_descriptor_t base;
  83     /** storage for segment data (max 2) */
  84     mca_btl_base_segment_t segments[2];
  85     /** endpoint this fragment is active on */
  86     struct mca_btl_base_endpoint_t *endpoint;
  87     /** fragment header (in the shared memory region) */
  88     mca_btl_vader_hdr_t *hdr;
  89     /** free list this fragment was allocated within */
  90     opal_free_list_t *my_list;
  91     /** rdma callback data */
  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     /* save the descriptor flags since the callback is allowed to free the frag */
 140     int des_flags = frag->base.des_flags;
 141 
 142     if (OPAL_UNLIKELY(MCA_BTL_DES_SEND_ALWAYS_CALLBACK & des_flags)) {
 143         /* completion callback */
 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 /* MCA_BTL_VADER_SEND_FRAG_H */

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