diff --git a/prov/tcp/src/xnet.h b/prov/tcp/src/xnet.h index 486af642d47..1594601983a 100644 --- a/prov/tcp/src/xnet.h +++ b/prov/tcp/src/xnet.h @@ -228,6 +228,8 @@ struct xnet_srx { xnet_profile_t *profile; }; +bool +xnet_srx_cancel_rx(struct xnet_srx *srx, struct slist *queue, void *context); int xnet_srx_context(struct fid_domain *domain, struct fi_rx_attr *attr, struct fid_ep **rx_ep, void *context); diff --git a/prov/tcp/src/xnet_progress.c b/prov/tcp/src/xnet_progress.c index aa76968e175..ef61672612e 100644 --- a/prov/tcp/src/xnet_progress.c +++ b/prov/tcp/src/xnet_progress.c @@ -1114,6 +1114,8 @@ static void xnet_complete_rx(struct xnet_ep *ep, ssize_t ret) cq_error: FI_WARN(&xnet_prov, FI_LOG_EP_DATA, "msg recv failed ret = %zd (%s)\n", ret, fi_strerror((int)-ret)); + if (rx_entry->ctrl_flags & XNET_MULTI_RECV) + xnet_srx_cancel_rx(ep->srx, &ep->srx->rx_queue, rx_entry->context); xnet_cntr_incerr(rx_entry); xnet_report_error(rx_entry, (int) -ret); xnet_free_xfer(xnet_ep2_progress(ep), rx_entry); diff --git a/prov/tcp/src/xnet_srx.c b/prov/tcp/src/xnet_srx.c index 153504fe955..d391c3883d3 100644 --- a/prov/tcp/src/xnet_srx.c +++ b/prov/tcp/src/xnet_srx.c @@ -712,7 +712,7 @@ xnet_match_tag_addr(struct xnet_srx *srx, struct xnet_ep *ep, uint64_t tag) return rx_entry; } -static bool +bool xnet_srx_cancel_rx(struct xnet_srx *srx, struct slist *queue, void *context) { struct slist_entry *cur, *prev;