[ofw] RE: NetworkDirect over WinVerbs
Sean Hefty
sean.hefty at intel.com
Wed Feb 11 13:06:28 PST 2009
>You know what, I'll put together a patch that will move the QP modification to
>a work item context and prove that it doesn't complicate locking, destruction
>handling, or device removal.
Yes - that patch maintains the same locking as the current code.
>In the CM callback you have a WDFREQUEST, so you can do these exact steps. The
>only issue is related to the CM callback being invoked at DISPATCH_LEVEL, and
>the QP Modify being a synchronous call. That problem would go away if the HCA
>driver model didn't suck. In the mean time you can allocate a work item and
>queue it for processing at passive level. You still have the IRP outstanding,
>so the app context won't go away.
As long as being at dispatch doesn't require changing the synchronization in
other areas to using spinlocks, this sounds fine.
>STDMETHOD(DisconnectAndFlush)(
> THIS_
> __in IVWConnectQueuePair* pQp,
> __in_opt OVERLAPPED* pOverlapped
> ) PURE;
>
>There's no more dependency between the two objects in the kernel code than
>exists today with Connect and Accept.
I don't have an objection to this if it can be implemented cleanly. The
difference between this call and Connect or Accept is that the QP object is
accessed from a different thread.
>You can control whether I/O requests complete to the IOCP or not by setting the
>lowest bit of the event handle in the OVERLAPPED structure that you specify in
>your overlapped operation. From the GetQueuedCompletionStatus docs:
That is not the obvious place to document this...
>"Even if you have passed the function a file handle associated with a
>completion port and a valid OVERLAPPED structure, an application can prevent
>completion port notification. This is done by specifying a valid event handle
>for the hEvent member of the OVERLAPPED structure, and setting its low-order
>bit. A valid event handle whose low-order bit is set keeps I/O completion from
>being queued to the completion port."
So, the winverbs ND provider could implement this with:
Disconnect()
NotifyDisconnect(internal overlap)
wait on internal overlap using internal thread
Modify(users overlap)
Which doesn't seem that much different than scheduling Modify to a work item.
Maybe slightly less efficient, but I think it's doable.
- Sean
More information about the ofw
mailing list