[ofw] [Patch 15/62] Reference implementation of NDv2
Fab Tillier
ftillier at microsoft.com
Wed Feb 20 17:30:22 PST 2013
Implement proper cancel_listen functionality.
The current code will destroy the underlying CEP in cm_cancel_listen, and checks for double-free in kal_cep_destroy. This is a bit risky because the CEP could be reused and the double-free check not trap this case, freeing the CEP from under a different connection.
This patch adds a new function to the CEP manager to cancel a listen (putting the CEP back to the IDLE state). This ensures that the CEP is not freed (or reused) before the current client frees it.
Signed-off-by: Fab Tillier <ftillier at microsoft.com>
diff -dwup3 -x *svn* -r c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\al_cm_cep.h .\core\al\al_cm_cep.h
--- c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\al_cm_cep.h Thu May 31 11:22:16 2012
+++ .\core\al\al_cm_cep.h Wed Jul 25 19:46:03 2012
@@ -142,6 +142,11 @@ al_cep_listen(
#ifdef CL_KERNEL
ib_api_status_t
+kal_cep_cancel_listen(
+ IN ib_al_handle_t h_al,
+ IN net32_t cid );
+
+ib_api_status_t
kal_cep_pre_req(
IN ib_al_handle_t h_al,
IN net32_t cid,
diff -dwup3 -x *svn* -r c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\kernel\al_cm.c .\core\al\kernel\al_cm.c
--- c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\kernel\al_cm.c Thu Mar 29 00:15:20 2012
+++ .\core\al\kernel\al_cm.c Thu Jul 26 15:31:13 2012
@@ -193,13 +193,10 @@ cm_listen(iba_cm_id *p_id, net64_t servi
return ib_to_ntstatus(ib_status);
}
-static void
+static NTSTATUS
cm_cancel_listen(iba_cm_id *p_id)
{
- iba_cm_id_priv *id;
-
- id = CONTAINING_RECORD(p_id, iba_cm_id_priv, id);
- kal_cep_destroy(gh_al, p_id->cid, STATUS_SUCCESS);
+ return ib_to_ntstatus(kal_cep_cancel_listen(gh_al, p_id->cid));
}
static NTSTATUS
diff -dwup3 -x *svn* -r c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\kernel\al_cm_cep.c .\core\al\kernel\al_cm_cep.c
--- c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\kernel\al_cm_cep.c Thu May 31 11:22:15 2012
+++ .\core\al\kernel\al_cm_cep.c Mon Jul 30 22:23:51 2012
@@ -4195,11 +4195,7 @@ kal_cep_destroy(
KeAcquireInStackQueuedSpinLock( &gp_cep_mgr->lock, &hdl );
p_cep = __lookup_cep( h_al, cid );
- if(p_cep == NULL || p_cep->state == CEP_STATE_DESTROY)
- {// kal_cep_destroy was already called - do nothing
- KeReleaseInStackQueuedSpinLock( &hdl );
- return;
- }
+ CL_ASSERT( p_cep );
context = p_cep->context;
pfn_destroy_cb = p_cep->pfn_destroy_cb;
@@ -4221,6 +4217,36 @@ kal_cep_destroy(
ib_api_status_t
+kal_cep_cancel_listen(
+ IN ib_al_handle_t h_al,
+ IN net32_t cid )
+{
+ KLOCK_QUEUE_HANDLE hdl;
+ kcep_t *p_cep;
+
+ KeAcquireInStackQueuedSpinLock( &gp_cep_mgr->lock, &hdl );
+ p_cep = __lookup_cep( h_al, cid );
+ if( p_cep == NULL )
+ {
+ KeReleaseInStackQueuedSpinLock( &hdl );
+ return IB_INVALID_HANDLE;
+ }
+
+ cl_atomic_inc( &p_cep->ref_cnt );
+ /*
+ * Note that __cleanup_cep will decrement the ref_cnt.
+ */
+ __cleanup_cep( p_cep );
+ /*
+ * __cleanup_cep flipped the state to DESTROY, move it to IDLE.
+ */
+ p_cep->state = CEP_STATE_IDLE;
+ KeReleaseInStackQueuedSpinLock( &hdl );
+ return STATUS_SUCCESS;
+}
+
+
+ib_api_status_t
al_cep_listen(
IN ib_al_handle_t h_al,
IN net32_t cid,
diff -dwup3 -x *svn* -r c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\inc\kernel\iba\ib_cm_ifc.h .\inc\kernel\iba\ib_cm_ifc.h
--- c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\inc\kernel\iba\ib_cm_ifc.h Thu Aug 02 12:47:08 2012
+++ .\inc\kernel\iba\ib_cm_ifc.h Thu Jul 26 15:31:14 2012
@@ -285,7 +285,7 @@ typedef struct _iba_cm_interface
NTSTATUS (*migrate)(iba_cm_id *p_id);
NTSTATUS (*established)(iba_cm_id *p_id);
- void (*cancel_listen)(iba_cm_id *p_id);
+ NTSTATUS (*cancel_listen)(iba_cm_id *p_id);
} iba_cm_interface;
static inline USHORT IbaCmVersion(UINT8 Major, UINT8 Minor)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ndv2.15.patch
Type: application/octet-stream
Size: 3391 bytes
Desc: ndv2.15.patch
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20130221/87568c75/attachment.obj>
More information about the ofw
mailing list