This source file includes following definitions.
- mca_btl_vader_sendi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #include "opal_config.h"
27
28 #include "btl_vader.h"
29 #include "btl_vader_frag.h"
30 #include "btl_vader_fifo.h"
31
32 #include "btl_vader_fbox.h"
33
34
35
36
37
38
39
40 int mca_btl_vader_sendi (struct mca_btl_base_module_t *btl,
41 struct mca_btl_base_endpoint_t *endpoint,
42 struct opal_convertor_t *convertor,
43 void *header, size_t header_size,
44 size_t payload_size, uint8_t order,
45 uint32_t flags, mca_btl_base_tag_t tag,
46 mca_btl_base_descriptor_t **descriptor)
47 {
48 mca_btl_vader_frag_t *frag;
49 void *data_ptr = NULL;
50 size_t length;
51
52
53 if (OPAL_UNLIKELY(opal_list_get_size (&endpoint->pending_frags))) {
54 if (descriptor) {
55 *descriptor = NULL;
56 }
57
58 return OPAL_ERR_OUT_OF_RESOURCE;
59 }
60
61 if (payload_size) {
62 opal_convertor_get_current_pointer (convertor, &data_ptr);
63 }
64
65 if (!(payload_size && opal_convertor_need_buffers (convertor)) &&
66 mca_btl_vader_fbox_sendi (endpoint, tag, header, header_size, data_ptr, payload_size)) {
67 return OPAL_SUCCESS;
68 }
69
70 length = header_size + payload_size;
71
72
73 frag = (mca_btl_vader_frag_t *) mca_btl_vader_alloc (btl, endpoint, order, length,
74 flags | MCA_BTL_DES_FLAGS_BTL_OWNERSHIP);
75 if (OPAL_UNLIKELY(NULL == frag)) {
76 if (descriptor) {
77 *descriptor = NULL;
78 }
79
80 return OPAL_ERR_OUT_OF_RESOURCE;
81 }
82
83
84 frag->hdr->len = length;
85 frag->hdr->tag = tag;
86
87
88 memcpy (frag->segments[0].seg_addr.pval, header, header_size);
89
90
91
92
93 if (payload_size) {
94 uint32_t iov_count = 1;
95 struct iovec iov;
96
97
98 iov.iov_base = (IOVBASE_TYPE *)((uintptr_t)frag->segments[0].seg_addr.pval + header_size);
99 iov.iov_len = length = payload_size;
100
101 (void) opal_convertor_pack (convertor, &iov, &iov_count, &length);
102
103 assert (length == payload_size);
104 }
105
106
107 if (!vader_fifo_write_ep (frag->hdr, endpoint)) {
108 if (descriptor) {
109 *descriptor = &frag->base;
110 } else {
111 mca_btl_vader_free (btl, &frag->base);
112 }
113 return OPAL_ERR_OUT_OF_RESOURCE;
114 }
115
116 return OPAL_SUCCESS;
117 }