This source file includes following definitions.
- mca_btl_ugni_prepare_src_send_nodata
- mca_btl_ugni_prepare_src_send_inplace
- mca_btl_ugni_prepare_src_send_buffered
- mca_btl_ugni_prepare_src_send
1
2
3
4
5
6
7
8
9
10
11
12
13 #if !defined(MCA_BTL_UGNI_PREPARE_H)
14 #define MCA_BTL_UGNI_PREPARE_H
15
16 #include "opal_config.h"
17
18 #include "btl_ugni.h"
19 #include "btl_ugni_frag.h"
20
21 static inline struct mca_btl_base_descriptor_t *
22 mca_btl_ugni_prepare_src_send_nodata (struct mca_btl_base_module_t *btl,
23 mca_btl_base_endpoint_t *endpoint,
24 uint8_t order, size_t reserve,
25 uint32_t flags)
26 {
27 mca_btl_ugni_base_frag_t *frag = NULL;
28
29 frag = mca_btl_ugni_frag_alloc_rdma (endpoint);
30 if (OPAL_UNLIKELY(NULL == frag)) {
31 return NULL;
32 }
33
34 BTL_VERBOSE(("preparing src for send fragment. size = %u", (unsigned int) reserve));
35
36 frag->hdr_size = reserve + sizeof (frag->hdr.send);
37
38 frag->segments[0].seg_addr.pval = frag->hdr.send_ex.pml_header;
39 frag->segments[0].seg_len = reserve;
40
41 frag->segments[1].seg_addr.pval = NULL;
42 frag->segments[1].seg_len = 0;
43
44 frag->base.des_segments = frag->segments;
45 frag->base.des_segment_count = 1;
46 frag->base.order = order;
47 frag->base.des_flags = flags;
48
49 return &frag->base;
50 }
51
52 static inline struct mca_btl_base_descriptor_t *
53 mca_btl_ugni_prepare_src_send_inplace (struct mca_btl_base_module_t *btl,
54 mca_btl_base_endpoint_t *endpoint,
55 struct opal_convertor_t *convertor,
56 uint8_t order, size_t reserve, size_t *size,
57 uint32_t flags)
58 {
59 bool use_eager_get = (*size + reserve) > mca_btl_ugni_component.smsg_max_data;
60 mca_btl_ugni_module_t *ugni_module = (mca_btl_ugni_module_t *) btl;
61 mca_btl_ugni_base_frag_t *frag = NULL;
62 mca_btl_ugni_reg_t *registration = NULL;
63 void *data_ptr;
64 int rc;
65
66 opal_convertor_get_current_pointer (convertor, &data_ptr);
67
68 frag = mca_btl_ugni_frag_alloc_rdma (endpoint);
69 if (OPAL_UNLIKELY(NULL == frag)) {
70 return NULL;
71 }
72
73 BTL_VERBOSE(("preparing src for send fragment. size = %u",
74 (unsigned int)(*size + reserve)));
75
76 if (OPAL_UNLIKELY(true == use_eager_get)) {
77 rc = ugni_module->rcache->rcache_register (ugni_module->rcache, data_ptr, *size, 0,
78 MCA_RCACHE_ACCESS_REMOTE_READ,
79 (mca_rcache_base_registration_t **)®istration);
80 if (OPAL_UNLIKELY(OPAL_SUCCESS != rc)) {
81 mca_btl_ugni_frag_return (frag);
82 return NULL;
83 }
84
85 frag->flags = MCA_BTL_UGNI_FRAG_EAGER | MCA_BTL_UGNI_FRAG_IGNORE;
86
87 frag->registration = registration;
88 frag->hdr.eager.memory_handle = registration->handle;;
89
90 frag->hdr_size = reserve + sizeof (frag->hdr.eager);
91 frag->segments[0].seg_addr.pval = frag->hdr.eager_ex.pml_header;
92 } else {
93 frag->hdr_size = reserve + sizeof (frag->hdr.send);
94 frag->segments[0].seg_addr.pval = frag->hdr.send_ex.pml_header;
95 }
96
97 frag->segments[0].seg_len = reserve;
98
99 frag->segments[1].seg_addr.pval = data_ptr;
100 frag->segments[1].seg_len = *size;
101
102 frag->base.des_segments = frag->segments;
103 frag->base.des_segment_count = 2;
104 frag->base.order = order;
105 frag->base.des_flags = flags;
106
107 return &frag->base;
108 }
109
110 static inline struct mca_btl_base_descriptor_t *
111 mca_btl_ugni_prepare_src_send_buffered (struct mca_btl_base_module_t *btl,
112 mca_btl_base_endpoint_t *endpoint,
113 struct opal_convertor_t *convertor,
114 uint8_t order, size_t reserve, size_t *size,
115 uint32_t flags)
116 {
117 bool use_eager_get = (*size + reserve) > mca_btl_ugni_component.smsg_max_data;
118 mca_btl_ugni_reg_t *registration = NULL;
119 mca_btl_ugni_base_frag_t *frag = NULL;
120 uint32_t iov_count = 1;
121 struct iovec iov;
122 int rc;
123
124 if (OPAL_UNLIKELY(true == use_eager_get)) {
125 frag = mca_btl_ugni_frag_alloc_eager_send (endpoint);
126 if (OPAL_UNLIKELY(NULL == frag)) {
127 return NULL;
128 }
129
130 frag->flags = MCA_BTL_UGNI_FRAG_EAGER | MCA_BTL_UGNI_FRAG_IGNORE;
131
132 registration = (mca_btl_ugni_reg_t *) frag->base.super.registration;
133
134 frag->hdr.eager.memory_handle = registration->handle;
135 frag->hdr_size = reserve + sizeof (frag->hdr.eager);
136 frag->segments[0].seg_addr.pval = frag->hdr.eager_ex.pml_header;
137 } else {
138 frag = mca_btl_ugni_frag_alloc_smsg (endpoint);
139 if (OPAL_UNLIKELY(NULL == frag)) {
140 return NULL;
141 }
142
143 frag->hdr_size = reserve + sizeof (frag->hdr.send);
144 frag->segments[0].seg_addr.pval = frag->hdr.send_ex.pml_header;
145 }
146
147 frag->flags |= MCA_BTL_UGNI_FRAG_BUFFERED;
148
149 iov.iov_len = *size;
150 iov.iov_base = (IOVBASE_TYPE *) frag->base.super.ptr;
151
152 rc = opal_convertor_pack (convertor, &iov, &iov_count, size);
153 if (OPAL_UNLIKELY(rc < 0)) {
154 mca_btl_ugni_frag_return (frag);
155 return NULL;
156 }
157
158 frag->segments[0].seg_len = reserve;
159
160 frag->segments[1].seg_addr.pval = frag->base.super.ptr;
161 frag->segments[1].seg_len = *size;
162
163 frag->base.des_segments = frag->segments;
164 frag->base.des_segment_count = 2;
165 frag->base.order = order;
166 frag->base.des_flags = flags;
167
168 return &frag->base;
169 }
170
171 static inline struct mca_btl_base_descriptor_t *
172 mca_btl_ugni_prepare_src_send (struct mca_btl_base_module_t *btl,
173 mca_btl_base_endpoint_t *endpoint,
174 struct opal_convertor_t *convertor,
175 uint8_t order, size_t reserve, size_t *size,
176 uint32_t flags)
177 {
178 bool use_eager_get = (*size + reserve) > mca_btl_ugni_component.smsg_max_data;
179 bool send_in_place;
180 void *data_ptr;
181
182 if (!(*size)) {
183 return mca_btl_ugni_prepare_src_send_nodata (btl, endpoint, order, reserve, flags);
184 }
185
186 opal_convertor_get_current_pointer (convertor, &data_ptr);
187
188 send_in_place = (btl->btl_flags & MCA_BTL_FLAGS_SEND_INPLACE) && !(opal_convertor_need_buffers(convertor) ||
189 (use_eager_get && ((uintptr_t)data_ptr & 3)));
190
191 if (send_in_place) {
192 return mca_btl_ugni_prepare_src_send_inplace (btl, endpoint, convertor, order,
193 reserve, size, flags);
194 } else {
195 return mca_btl_ugni_prepare_src_send_buffered (btl, endpoint, convertor, order,
196 reserve, size, flags);
197 }
198 }
199
200 #endif