RDMA/ucma: Discard all events for new connections until accepted
authorSean Hefty <sean.hefty@intel.com>
Tue, 10 Jan 2012 23:53:41 +0000 (23:53 +0000)
committerRoland Dreier <roland@purestorage.com>
Fri, 27 Jan 2012 18:07:48 +0000 (10:07 -0800)
commit9ced69ca5296567033804950d8d2161f454c5012
tree6db2856c3ba7e3c018ac039c4c664be0179c1ff3
parentdcd6c92267155e70a94b3927bce681ce74b80d1f
RDMA/ucma: Discard all events for new connections until accepted

After reporting a new connection request to user space, the rdma_ucm
will discard subsequent events until the user has associated a user
space idenfier with the kernel cm_id.  This is needed to avoid
reporting a reject/disconnect event to the user for a request that
they may not have processed.

The user space identifier is set once the user tries to accept the
connection request.  However, the following race exists in ucma_accept():

ctx->uid = cmd.uid;
<events may be reported now>
ret = rdma_accept(ctx->cm_id, ...);

Once ctx->uid has been set, new events may be reported to the user.
While the above mentioned race is avoided, there is an issue that the
user _may_ receive a reject/disconnect event if rdma_accept() fails,
depending on when the event is processed.  To simplify the use of
rdma_accept(), discard all events unless rdma_accept() succeeds.

This problem was discovered based on questions from Roland Dreier
<roland@purestorage.com>.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/core/ucma.c