This source file includes following definitions.
- mca_pml_yalla_request_release
- mca_pml_yalla_check_request_state
- mca_pml_yalla_send_request_free
- mca_pml_yalla_send_request_cancel
- mca_pml_yalla_recv_request_free
- mca_pml_yalla_recv_request_cancel
- init_mxm_base_req
- init_mxm_send_req
- init_mxm_recv_req
- init_base_req
- mca_pml_yalla_send_completion_cb
- mca_pml_yalla_bsend_completion_cb
- mca_pml_yalla_recv_completion_cb
- mca_pml_yalla_send_request_construct
- mca_pml_yalla_send_request_destruct
- mca_pml_yalla_bsend_request_construct
- mca_pml_yalla_recv_request_construct
- mca_pml_yalla_recv_request_destruct
- mca_pml_yalla_init_reqs
1
2
3
4
5
6
7
8
9
10
11
12
13 #include "pml_yalla_request.h"
14
15 #include "ompi/mca/pml/base/pml_base_bsend.h"
16 #include "ompi/message/message.h"
17
18
19 static inline void mca_pml_yalla_request_release(mca_pml_yalla_base_request_t *req,
20 mca_pml_yalla_freelist_t *fl)
21 {
22 if (req->convertor != NULL) {
23 mca_pml_yalla_convertor_free(req->convertor);
24 req->convertor = NULL;
25 }
26 OBJ_RELEASE(req->ompi.req_mpi_object.comm);
27
28 #if PML_YALLA_ENABLE_DEBUG
29 req->ompi.req_state = OMPI_REQUEST_INVALID;
30 #endif
31 PML_YALLA_FREELIST_RETURN(fl, &req->ompi.super);
32 }
33
34 static inline int
35 mca_pml_yalla_check_request_state(mca_pml_yalla_base_request_t *req, mxm_req_base_t *mxm_base)
36 {
37 if (mxm_base->state != MXM_REQ_COMPLETED) {
38 PML_YALLA_VERBOSE(8, "request %p free called before completed", (void*)req);
39 req->flags |= MCA_PML_YALLA_REQUEST_FLAG_FREE_CALLED;
40 return 0;
41 }
42
43 return 1;
44 }
45
46 static int mca_pml_yalla_send_request_free(ompi_request_t **request)
47 {
48 mca_pml_yalla_send_request_t *sreq = (mca_pml_yalla_send_request_t*)(*request);
49
50 PML_YALLA_VERBOSE(9, "free send request *%p=%p", (void *)request, (void *)*request);
51
52 if (mca_pml_yalla_check_request_state(&sreq->super, PML_YALLA_MXM_REQBASE(sreq))) {
53 mca_pml_yalla_request_release(&sreq->super, &ompi_pml_yalla.send_reqs);
54 }
55
56 *request = MPI_REQUEST_NULL;
57 return OMPI_SUCCESS;
58 }
59
60 static int mca_pml_yalla_send_request_cancel(ompi_request_t *request, int flag)
61 {
62 mca_pml_yalla_send_request_t *sreq = (mca_pml_yalla_send_request_t*)request;
63 mxm_error_t error;
64
65 if (REQUEST_COMPLETE(request)) {
66
67
68
69
70 PML_YALLA_VERBOSE(7, "not canceling a completed send request %p", (void *)request);
71 return OMPI_SUCCESS;
72 }
73
74 error = mxm_req_cancel_send(&sreq->mxm);
75 if ((error != MXM_OK) && (error != MXM_ERR_NO_PROGRESS)) {
76 PML_YALLA_ERROR("failed to cancel send request %p: %s", (void *)request,
77 mxm_error_string(error));
78 return OMPI_ERROR;
79 }
80
81 PML_YALLA_VERBOSE(9, "canceled send request %p", (void *)request);
82 return OMPI_SUCCESS;
83 }
84
85 static int mca_pml_yalla_recv_request_free(ompi_request_t **request)
86 {
87 mca_pml_yalla_recv_request_t *rreq = (mca_pml_yalla_recv_request_t*)(*request);
88
89 PML_YALLA_VERBOSE(9, "free receive request *%p=%p", (void *)request, (void *)*request);
90
91 if (mca_pml_yalla_check_request_state(&rreq->super, PML_YALLA_MXM_REQBASE(rreq))) {
92 mca_pml_yalla_request_release(&rreq->super, &ompi_pml_yalla.recv_reqs);
93 }
94
95 *request = MPI_REQUEST_NULL;
96 return OMPI_SUCCESS;
97 }
98
99 static int mca_pml_yalla_recv_request_cancel(ompi_request_t *request, int flag)
100 {
101 mca_pml_yalla_recv_request_t *rreq = (mca_pml_yalla_recv_request_t*)request;
102 mxm_error_t error;
103
104 error = mxm_req_cancel_recv(&rreq->mxm);
105 if ((error != MXM_OK) && (error != MXM_ERR_NO_PROGRESS)) {
106 PML_YALLA_ERROR("failed to cancel receive request %p: %s", (void *)request,
107 mxm_error_string(error));
108 return OMPI_ERROR;
109 }
110
111 PML_YALLA_VERBOSE(9, "canceled receive request %p", (void *)request);
112 return OMPI_SUCCESS;
113 }
114
115 static void init_mxm_base_req(mxm_req_base_t *mxm_req_base)
116 {
117 mxm_req_base->state = MXM_REQ_NEW;
118 mxm_req_base->mq = NULL;
119 mxm_req_base->conn = NULL;
120 mxm_req_base->data_type = MXM_REQ_DATA_BUFFER;
121 mxm_req_base->data.buffer.ptr = NULL;
122 mxm_req_base->data.buffer.length = 0;
123 mxm_req_base->data.buffer.memh = 0;
124 mxm_req_base->context = NULL;
125 mxm_req_base->completed_cb = NULL;
126 }
127
128 static void init_mxm_send_req(mxm_send_req_t *mxm_sreq)
129 {
130 init_mxm_base_req(&mxm_sreq->base);
131 mxm_sreq->opcode = MXM_REQ_OP_SEND;
132 mxm_sreq->op.send.imm_data = 0;
133 mxm_sreq->op.send.tag = 0;
134 #if defined(MXM_REQ_SEND_FLAG_REENTRANT)
135 mxm_sreq->flags = MXM_REQ_SEND_FLAG_REENTRANT;
136 #else
137 mxm_sreq->flags = 0;
138 #endif
139 }
140
141 static void init_mxm_recv_req(mxm_recv_req_t *mxm_rreq)
142 {
143 init_mxm_base_req(&mxm_rreq->base);
144 mxm_rreq->tag = 0;
145 mxm_rreq->tag_mask = 0x7fffffff;
146 }
147
148 static void init_base_req(mca_pml_yalla_base_request_t *req)
149 {
150 OMPI_REQUEST_INIT(&req->ompi, false);
151 req->ompi.req_type = OMPI_REQUEST_PML;
152 req->ompi.req_start = mca_pml_yalla_start;
153 req->ompi.req_cancel = NULL;
154 req->ompi.req_complete_cb = NULL;
155 req->ompi.req_complete_cb_data = NULL;
156 req->convertor = NULL;
157 }
158
159 static void mca_pml_yalla_send_completion_cb(void *context)
160 {
161 mca_pml_yalla_send_request_t* sreq = context;
162
163 switch (sreq->mxm.base.error) {
164 case MXM_OK:
165 sreq->super.ompi.req_status.MPI_ERROR = OMPI_SUCCESS;
166 break;
167 case MXM_ERR_CANCELED:
168 sreq->super.ompi.req_status._cancelled = true;
169 break;
170 default:
171 sreq->super.ompi.req_status.MPI_ERROR = MPI_ERR_INTERN;
172 break;
173 }
174
175 PML_YALLA_VERBOSE(8, "send request %p completed with status %s", (void *)sreq,
176 mxm_error_string(sreq->mxm.base.error));
177
178 ompi_request_complete(&sreq->super.ompi, true);
179 if (sreq->super.flags & MCA_PML_YALLA_REQUEST_FLAG_FREE_CALLED) {
180 PML_YALLA_VERBOSE(7, "release request %p because free was already called", (void *)sreq);
181 mca_pml_yalla_request_release(&sreq->super, &ompi_pml_yalla.send_reqs);
182 }
183 }
184
185 static void mca_pml_yalla_bsend_completion_cb(void *context)
186 {
187 mca_pml_yalla_bsend_request_t *bsreq = context;
188
189 PML_YALLA_VERBOSE(8, "bsend request %p completed with status %s", (void *)bsreq,
190 mxm_error_string(bsreq->mxm.base.error));
191
192 mca_pml_base_bsend_request_free(bsreq->mxm.base.data.buffer.ptr);
193 PML_YALLA_FREELIST_RETURN(&ompi_pml_yalla.bsend_reqs, &bsreq->super);
194 }
195
196 static void mca_pml_yalla_recv_completion_cb(void *context)
197 {
198 mca_pml_yalla_recv_request_t* rreq = context;
199
200 PML_YALLA_SET_RECV_STATUS(&rreq->mxm, rreq->mxm.completion.actual_len,
201 &rreq->super.ompi.req_status);
202
203 PML_YALLA_VERBOSE(8, "receive request %p completed with status %s source %d rtag %d(%d/0x%x) len %zu",
204 (void *)rreq, mxm_error_string(rreq->mxm.base.error),
205 rreq->mxm.completion.sender_imm, rreq->mxm.completion.sender_tag,
206 rreq->mxm.tag, rreq->mxm.tag_mask,
207 rreq->mxm.completion.actual_len);
208
209 ompi_request_complete(&rreq->super.ompi, true);
210 if (rreq->super.flags & MCA_PML_YALLA_REQUEST_FLAG_FREE_CALLED) {
211 PML_YALLA_VERBOSE(7, "release request %p because free was already called", (void *)rreq);
212 mca_pml_yalla_request_release(&rreq->super, &ompi_pml_yalla.recv_reqs);
213 }
214 }
215
216 static void mca_pml_yalla_send_request_construct(mca_pml_yalla_send_request_t* sreq)
217 {
218 init_base_req(&sreq->super);
219 init_mxm_send_req(&sreq->mxm);
220 sreq->super.ompi.req_free = mca_pml_yalla_send_request_free;
221 sreq->super.ompi.req_cancel = mca_pml_yalla_send_request_cancel;
222 sreq->mxm.base.context = sreq;
223 sreq->mxm.base.completed_cb = mca_pml_yalla_send_completion_cb;
224 }
225
226 static void mca_pml_yalla_send_request_destruct(mca_pml_yalla_send_request_t *sreq)
227 {
228 OMPI_REQUEST_FINI(&sreq->super.ompi);
229 }
230
231 static void mca_pml_yalla_bsend_request_construct(mca_pml_yalla_bsend_request_t* bsreq)
232 {
233 init_mxm_send_req(&bsreq->mxm);
234 bsreq->mxm.base.context = bsreq;
235 bsreq->mxm.base.completed_cb = mca_pml_yalla_bsend_completion_cb;
236 }
237
238 static void mca_pml_yalla_recv_request_construct(mca_pml_yalla_recv_request_t* rreq)
239 {
240 init_base_req(&rreq->super);
241 init_mxm_recv_req(&rreq->mxm);
242 rreq->super.ompi.req_free = mca_pml_yalla_recv_request_free;
243 rreq->super.ompi.req_cancel = mca_pml_yalla_recv_request_cancel;
244 rreq->mxm.base.context = rreq;
245 rreq->mxm.base.completed_cb = mca_pml_yalla_recv_completion_cb;
246 }
247
248 static void mca_pml_yalla_recv_request_destruct(mca_pml_yalla_recv_request_t *rreq)
249 {
250 OMPI_REQUEST_FINI(&rreq->super.ompi);
251 }
252
253 void mca_pml_yalla_init_reqs(void)
254 {
255 PML_YALLA_FREELIST_INIT(&ompi_pml_yalla.send_reqs, mca_pml_yalla_send_request_t,
256 128, -1, 128);
257
258 PML_YALLA_FREELIST_INIT(&ompi_pml_yalla.bsend_reqs, mca_pml_yalla_bsend_request_t,
259 128, -1, 128);
260
261 PML_YALLA_FREELIST_INIT(&ompi_pml_yalla.recv_reqs, mca_pml_yalla_recv_request_t,
262 128, -1, 128);
263 }
264
265 OBJ_CLASS_INSTANCE(mca_pml_yalla_send_request_t,
266 ompi_request_t,
267 mca_pml_yalla_send_request_construct,
268 mca_pml_yalla_send_request_destruct);
269
270 OBJ_CLASS_INSTANCE(mca_pml_yalla_bsend_request_t,
271 opal_free_list_item_t,
272 mca_pml_yalla_bsend_request_construct,
273 NULL);
274
275 OBJ_CLASS_INSTANCE(mca_pml_yalla_recv_request_t,
276 ompi_request_t,
277 mca_pml_yalla_recv_request_construct,
278 mca_pml_yalla_recv_request_destruct);
279