[ofw] [PATCH] winverbs: convert connect/accept to sync calls
Fab Tillier
ftillier at microsoft.com
Wed Aug 26 23:22:35 PDT 2009
Oh, that's too bad. Any idea what that does to connection rate?
-Fab
> -----Original Message-----
> From: ofw-bounces at lists.openfabrics.org [mailto:ofw-
> bounces at lists.openfabrics.org] On Behalf Of Sean Hefty
> Sent: Wednesday, August 26, 2009 4:59 PM
> To: ofw at lists.openfabrics.org
> Subject: [ofw] [PATCH] winverbs: convert connect/accept to sync calls
>
> If an application calls Connect or Accept, their IRP is queued to a
> work queue for asynchronous processing. However, if the application
> crashes or exits before the work queue can process the IRP, the cleanup
> code will call WvEpFree(). This destroys the IbCmId.
>
> When the work queue finally runs, it can access a freed IbCmId.
> This is bad. To be safe, the IRP needs to be completed before
> WvEpFree() returns to ensure that all outstanding IRPs are completed
> and avoid accessing freed memory.
>
> One fix for this is to call 'WorkQueueFlush()' from WvEpFree() to
> ensure that the EP's work entry is not in use and all previous
> IRPs have completed before the pIbCmId is destroyed.
> However, since WorkQueueFlush() does not exist, and any implementation
> of it carries a higher risk, revert Connect/Accept to synchronous
> operation for the WinOF 2.1 release.
>
> Signed-off-by: Sean Hefty <sean.hefty at intel.com>
> ---
> This is a quick fix for winof 2.1. Any fix that tries to support
> asynchronous connect/accept calls will have a much higher risk, so
> is deferred to after the 2.1 release.
>
> Index: core/winverbs/kernel/wv_ep.c
> ===================================================================
> --- core/winverbs/kernel/wv_ep.c (revision 2373)
> +++ core/winverbs/kernel/wv_ep.c (working copy)
> @@ -181,6 +181,9 @@
>
> void WvEpFree(WV_ENDPOINT *pEndpoint)
> {
> + // see comment in WvEpProcessAsync()
> + // WorkQueueFlush(&pEndpoint->pProvider->WorkQueue);
> +
> if (pEndpoint->pIbCmId != NULL) {
> IbCmInterface.CM.destroy_id(pEndpoint->pIbCmId);
> }
> @@ -644,7 +647,18 @@
>
> work = WorkEntryFromIrp(WdfRequestWdmGetIrp(Request));
> WorkEntryInit(work, AsyncHandler, Request);
> - WorkQueueInsert(&pProvider->WorkQueue, work);
> + // TODO: If app exits or crashes immediately after making a CM
> call,
> + // then WvEpFree() will be called, which destroys
> + // the pIbCmId. Since the IRP is not on a queue, the system
> cannot
> + // cancel the operation. If the work queue thread is running,
> this can
> + // result in it accessing the pIbCmId after it is destroyed.
> + // The fix for this is to call 'WorkQueueFlush()' from
> WvEpFree() to
> + // ensure that the EP's work entry is not in use and all
> previous
> + // IRPs have completed before the pIbCmId is destroyed.
> + // Until WorkQueueFlush is available, continue to process
> Connect
> + // and Accept calls synchronously.
> + //WorkQueueInsert(&pProvider->WorkQueue, work);
> + AsyncHandler(work);
> }
>
> void WvEpConnect(WV_PROVIDER *pProvider, WDFREQUEST Request)
More information about the ofw
mailing list