This source file includes following definitions.
- opal_btl_usnic_frag_send_complete
- opal_btl_usnic_chunk_send_complete
- opal_btl_usnic_finish_put_or_send
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include "opal_config.h"
25
26 #include "opal_stdint.h"
27
28 #include "opal/constants.h"
29
30 #include "opal/mca/btl/btl.h"
31 #include "opal/mca/btl/base/base.h"
32
33 #include "btl_usnic.h"
34 #include "btl_usnic_frag.h"
35 #include "btl_usnic_util.h"
36 #include "btl_usnic_send.h"
37 #include "btl_usnic_ack.h"
38
39
40
41
42
43
44
45 void
46 opal_btl_usnic_frag_send_complete(opal_btl_usnic_module_t *module,
47 opal_btl_usnic_send_segment_t *sseg)
48 {
49 opal_btl_usnic_send_frag_t *frag;
50
51 frag = sseg->ss_parent_frag;
52
53
54 --sseg->ss_send_posted;
55 --frag->sf_seg_post_cnt;
56
57
58 opal_btl_usnic_endpoint_t *ep = frag->sf_endpoint;
59 opal_btl_usnic_send_frag_return_cond(module, frag);
60
61
62
63
64
65
66 ++ep->endpoint_send_credits;
67
68
69 opal_btl_usnic_check_rts(ep);
70
71 ++module->mod_channels[sseg->ss_channel].credits;
72 }
73
74
75
76
77
78
79
80 void
81 opal_btl_usnic_chunk_send_complete(opal_btl_usnic_module_t *module,
82 opal_btl_usnic_send_segment_t *sseg)
83 {
84 opal_btl_usnic_send_frag_t *frag;
85
86 frag = sseg->ss_parent_frag;
87
88
89 --sseg->ss_send_posted;
90 --frag->sf_seg_post_cnt;
91
92 if (sseg->ss_send_posted == 0 && !sseg->ss_ack_pending) {
93 opal_btl_usnic_release_send_segment(module, frag, sseg);
94 }
95
96
97
98 opal_btl_usnic_send_frag_return_cond(module, frag);
99
100
101 ++frag->sf_endpoint->endpoint_send_credits;
102
103
104 opal_btl_usnic_check_rts(frag->sf_endpoint);
105
106 ++module->mod_channels[sseg->ss_channel].credits;
107 }
108
109
110
111
112
113
114
115
116
117
118 int
119 opal_btl_usnic_finish_put_or_send(
120 opal_btl_usnic_module_t *module,
121 opal_btl_usnic_endpoint_t *endpoint,
122 opal_btl_usnic_send_frag_t *frag,
123 mca_btl_base_tag_t tag)
124 {
125 int rc;
126 opal_btl_usnic_small_send_frag_t *sfrag;
127 opal_btl_usnic_send_segment_t *sseg;
128
129
130
131
132
133
134 if (frag->sf_base.uf_type == OPAL_BTL_USNIC_FRAG_SMALL_SEND) {
135
136 sfrag = (opal_btl_usnic_small_send_frag_t *)frag;
137 sseg = &sfrag->ssf_segment;
138
139
140
141
142
143 if (frag->sf_base.uf_base.USNIC_SEND_LOCAL_COUNT > 1) {
144
145 assert(NULL != frag->sf_base.uf_local_seg[1].seg_addr.pval);
146
147 memcpy(((char *)(intptr_t)frag->sf_base.uf_local_seg[0].seg_addr.lval +
148 frag->sf_base.uf_local_seg[0].seg_len),
149 frag->sf_base.uf_local_seg[1].seg_addr.pval,
150 frag->sf_base.uf_local_seg[1].seg_len);
151
152
153 frag->sf_base.uf_base.USNIC_SEND_LOCAL_COUNT = 1;
154 frag->sf_base.uf_local_seg[0].seg_len +=
155 frag->sf_base.uf_local_seg[1].seg_len;
156 }
157
158 sseg->ss_len = sizeof(opal_btl_usnic_btl_header_t) + frag->sf_size;
159
160
161 sseg->ss_channel = USNIC_DATA_CHANNEL;
162 sseg->ss_base.us_btl_header->tag = tag;
163 } else {
164 opal_btl_usnic_large_send_frag_t *lfrag;
165
166
167
168 lfrag = (opal_btl_usnic_large_send_frag_t *)frag;
169 lfrag->lsf_tag = tag;
170 lfrag->lsf_cur_offset = 0;
171 lfrag->lsf_cur_ptr = lfrag->lsf_des_src[0].seg_addr.pval;
172 lfrag->lsf_cur_sge = 0;
173 lfrag->lsf_bytes_left_in_sge = lfrag->lsf_des_src[0].seg_len;
174 lfrag->lsf_bytes_left = frag->sf_size;
175
176 if (lfrag->lsf_pack_on_the_fly) {
177 lfrag->lsf_pack_bytes_left = frag->sf_size;
178 } else {
179
180 lfrag->lsf_pack_bytes_left = 0;
181 }
182 }
183
184
185 rc = opal_btl_usnic_endpoint_enqueue_frag(endpoint, frag);
186 return rc;
187 }