[ofa-general] Re: [PATCH] iw cm conn sent destroy

Pete Wyckoff pw at osc.edu
Fri Jul 4 15:07:43 PDT 2008


swise at opengridcomputing.com wrote on Thu, 03 Jul 2008 15:44 -0500:
> Pete Wyckoff wrote:
>> sean.hefty at intel.com wrote on Thu, 03 Jul 2008 13:03 -0700:
>>   
>>>> That makes sense.  I couldn't find anyway to get that bit
>>>> IWCM_F_CONNECT_WAIT cleared (without massive layering violations).
>>>> Is there anything like rdma_give_up_on_the_connect() that works
>>>> on the client side?  Am I expected just to wait for the transport
>>>> layer to time out the connect?  I could imagine a Ctrl-C situation
>>>> where immediate client-side cancellation is desired.
>>>>       
>>> From the perspective of the rdma_cm interface, rdma_destroy_id() is
>>> intended to provide this functionality.
>>>     
>>
>> That is a sensible approach.  The implementation in iwcm.c just
>> passively waits for a connection to time out before allowing
>> rdma_destroy_id() to complete.  Maybe I should look at adding a case
>> in cma_cancel_operation() for CMA_CONNECT that calls into a
>> device-specific function that can actively quit the connection.
>>
>> Or should this be a special case in iwcm's destroy_cm_id()?  Where
>> a CONN_SENT state will bypass the check on IWCM_F_CONNECT_WAIT, and
>> call into a device function that tries to cancel the connection
>> attepmt first?
>
> If we define a method that every iwarp provider supports to cancel a  
> connect attempt, then we can do away with the IWCM_F_CONNECT_WAIT bit  
> altogether and always cancel the operation instead.  For cxgb3, the  
> connect request to the HW really cannot be canceled.  So the driver  
> would have to keep its endpoint struct around until the HW finally posts  
> the connect attempt results, but mark the endpoint as "no cm_id  
> attached".  The if the connection succeeds, the driver will immediately  
> reset it I guess...

This defines an optional iwcm method that cancels the connect
operation if the device supports that.  Otherwise it will wait
on the CONNECT_WAIT bit as usual.  Doing it like this does not require
changes in existing devices.  It would not be pretty to implement
a mandatory connect_cancel() as you describe for cxgb3.

(I dropped the first-attempt patch in this thread.)

		-- Pete


iwcm: connect cancel

Add an interface to cancel a connection attempt.  Used on the client side
of rdmacm to cancel a connection, for devices that support such an
operation.  This can avoid waiting for the device to timeout the operation
itself.

Signed-off-by: Pete Wyckoff <pw at osc.edu>
---
 drivers/infiniband/core/iwcm.c |   14 ++++++++++++++
 include/rdma/iw_cm.h           |    2 ++
 2 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c
index 81c9195..56aa0d6 100644
--- a/drivers/infiniband/core/iwcm.c
+++ b/drivers/infiniband/core/iwcm.c
@@ -327,6 +327,20 @@ static void destroy_cm_id(struct iw_cm_id *cm_id)
 	int ret;
 
 	cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
+
+	/*
+	 * Give the device a chance to cancel the connect, if possible.
+	 * Else we wait until it times out.
+	 */
+	if (cm_id_priv->state == IW_CM_STATE_CONN_SENT &&
+	    cm_id->device->iwcm->connect_cancel) {
+		ret = cm_id->device->iwcm->connect_cancel(cm_id);
+		if (ret == 0) {
+			clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
+			cm_id_priv->state = IW_CM_STATE_IDLE;
+		}
+	}
+
 	/*
 	 * Wait if we're currently in a connect or accept downcall. A
 	 * listening endpoint should never block here.
diff --git a/include/rdma/iw_cm.h b/include/rdma/iw_cm.h
index aeefa9b..046690c 100644
--- a/include/rdma/iw_cm.h
+++ b/include/rdma/iw_cm.h
@@ -119,6 +119,8 @@ struct iw_cm_verbs {
 	int		(*connect)(struct iw_cm_id *cm_id,
 				   struct iw_cm_conn_param *conn_param);
 
+	int		(*connect_cancel)(struct iw_cm_id *cm_id);
+
 	int		(*accept)(struct iw_cm_id *cm_id,
 				  struct iw_cm_conn_param *conn_param);
 
-- 
1.5.5.1




More information about the general mailing list