Re: [PATCH 2/9] IB: add a proper completion queue abstraction

Jason Gunthorpe
2015-11-24T00:00:26Z

On Mon, Nov 23, 2015 at 03:30:42PM -0800, Caitlin Bestler wrote:
> The receive completion can be safely assumed to indicate transmit
> completion over a reliable connection unless your peer has gone
> completely bonkers and is replying to a command that it did not
> receive.

Perhaps iWarp is different and does specify this ordering but IB does
not.

The issue with IB is how the ACK protocol is designed. There is not
strong ordering between ACKs and data transfers. A HCA can send
ACK,DATA and the network could drop the ACK. The recevier side does
not know the ACK was lost and goes ahead to process DATA.

Since only ACK advances the sendq and DATA advances the recvq it is
trivial to get a case where the recvq is advanced with a reply while
the sendq continues to wait for the ACK to be resent.

Further IB allows ACK coalescing and has no rules for how an ACK is
placed. It is entirely valid for a HCA to RECV,REPLY,ACK - for
instance.

> I actually had a bug in an early iWARP emulation where the simulated
> peer, because it was simulated, responded
> instantly. The result was a TCP segment that both acked the
> transmission *and* contained the reply. The bug was
> that the code processed the reception before the transmission ack,
> causing the receive completion to be placed
> on the completion queue before transmit completion.

I don't know if iWARP has the same lax ordering as IB, but certainly,
what you describe is legal for IB verbs to do, and our kernel ULPs
have to cope with it.

Jason