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