Index: src/InfRcTransport.cc |
diff --git a/src/InfRcTransport.cc b/src/InfRcTransport.cc |
index 8c26edcaf86d545eb117a631d554caffe37687e7..828a10df67f5709aa9efa07e1ded9c4d422934a7 100644 |
--- a/src/InfRcTransport.cc |
+++ b/src/InfRcTransport.cc |
@@ -404,6 +404,13 @@ InfRcTransport::InfRcSession::cancelRequest( |
} |
foreach (ClientRpc& rpc, transport->outstandingRpcs) { |
if (rpc.notifier == notifier) { |
+ |
+ // Wait until NIC completes all ongoing transmits. This will |
+ // guarantee that we don't send garbaged rpc if NIC has already |
+ // started DMA transmit of data from the rpc that we want to cancel. |
+ while (transport->freeTxBuffers.size() != MAX_TX_QUEUE_DEPTH) { |
+ transport->reapTxBuffers(); |
+ } |
erase(transport->outstandingRpcs, rpc); |
transport->clientRpcPool.destroy(&rpc); |
--transport->numUsedClientSrqBuffers; |