Skip to content

Commit 879d25e

Browse files
committed
usnic: ensure to check send credits for ACKs
Don't just blindly send ACKs; ensure that we have send credits before doing so. If we don't have any send credits, just don't send the ACK (it'll come again soon enough; it's not a tragedy if we don't send it now). Signed-off-by: Jeff Squyres <[email protected]>
1 parent 7787dad commit 879d25e

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

opal/mca/btl/usnic/btl_usnic_ack.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013-2016 Cisco Systems, Inc. All rights reserved.
2+
* Copyright (c) 2013-2017 Cisco Systems, Inc. All rights reserved.
33
* $COPYRIGHT$
44
*
55
* Additional copyrights may follow
@@ -198,19 +198,27 @@ opal_btl_usnic_handle_ack(
198198
/*
199199
* Send an ACK
200200
*/
201-
void
201+
int
202202
opal_btl_usnic_ack_send(
203203
opal_btl_usnic_module_t *module,
204204
opal_btl_usnic_endpoint_t *endpoint)
205205
{
206206
opal_btl_usnic_ack_segment_t *ack;
207207

208+
/* If we don't have any send credits in the priority channel,
209+
don't send it */
210+
if (module->mod_channels[USNIC_PRIORITY_CHANNEL].credits < 1) {
211+
return OPAL_ERR_OUT_OF_RESOURCE;
212+
}
213+
208214
/* Get an ACK frag. If we don't get one, just discard this ACK. */
209215
ack = opal_btl_usnic_ack_segment_alloc(module);
210216
if (OPAL_UNLIKELY(NULL == ack)) {
211-
return;
217+
return OPAL_ERR_OUT_OF_RESOURCE;
212218
}
213219

220+
--module->mod_channels[USNIC_PRIORITY_CHANNEL].credits;
221+
214222
/* send the seq of the lowest item in the window that
215223
we've received */
216224
ack->ss_base.us_btl_header->ack_seq =
@@ -246,7 +254,7 @@ opal_btl_usnic_ack_send(
246254
/* Stats */
247255
++module->stats.num_ack_sends;
248256

249-
return;
257+
return OPAL_SUCCESS;
250258
}
251259

252260
/*
@@ -256,6 +264,7 @@ void
256264
opal_btl_usnic_ack_complete(opal_btl_usnic_module_t *module,
257265
opal_btl_usnic_ack_segment_t *ack)
258266
{
267+
++module->mod_channels[USNIC_PRIORITY_CHANNEL].credits;
259268
opal_btl_usnic_ack_segment_return(module, ack);
260269
++module->mod_channels[ack->ss_channel].credits;
261270
}

opal/mca/btl/usnic/btl_usnic_ack.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013-2016 Cisco Systems, Inc. All rights reserved.
2+
* Copyright (c) 2013-2017 Cisco Systems, Inc. All rights reserved.
33
* $COPYRIGHT$
44
*
55
* Additional copyrights may follow
@@ -67,7 +67,7 @@ void opal_btl_usnic_ack_complete(opal_btl_usnic_module_t *module,
6767
/*
6868
* Send an ACK
6969
*/
70-
void opal_btl_usnic_ack_send(opal_btl_usnic_module_t *module,
70+
int opal_btl_usnic_ack_send(opal_btl_usnic_module_t *module,
7171
opal_btl_usnic_endpoint_t *endpoint);
7272

7373
/*

opal/mca/btl/usnic/btl_usnic_module.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,8 +1237,13 @@ opal_btl_usnic_module_progress_sends(
12371237
/* Is it time to send ACK? */
12381238
if (endpoint->endpoint_acktime == 0 ||
12391239
endpoint->endpoint_acktime <= get_nsec()) {
1240-
opal_btl_usnic_ack_send(module, endpoint);
1241-
opal_btl_usnic_remove_from_endpoints_needing_ack(endpoint);
1240+
if (OPAL_LIKELY(opal_btl_usnic_ack_send(module, endpoint) == OPAL_SUCCESS)) {
1241+
opal_btl_usnic_remove_from_endpoints_needing_ack(endpoint);
1242+
} else {
1243+
// If we fail, it means we're out of send credits on
1244+
// the ACK channel
1245+
break;
1246+
}
12421247
}
12431248

12441249
endpoint = next_endpoint;

0 commit comments

Comments
 (0)