Memory registration is asynchronous and part of the PD interface. Make the PD derive from overlapped, rather than unknown base class, and add support for canceling asynchronous operations (i.e. register memory) on the PD.
This is an oversight of the initial API caught by implementing the ND provider. Signed-off-by: Sean Hefty <[email protected]> --- diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\core\winverbs/kernel/wv_driver.c branches\winverbs\core\winverbs/kernel/wv_driver.c --- trunk\core\winverbs/kernel/wv_driver.c 2009-05-27 12:11:06.088250000 -0700 +++ branches\winverbs\core\winverbs/kernel/wv_driver.c 2009-06-09 14:20:43.228703600 -0700 @@ -245,6 +245,9 @@ static VOID WvIoDeviceControl(WDFQUEUE Q case WV_IOCTL_PD_ALLOCATE: WvPdAllocate(prov, Request); break; + case WV_IOCTL_PD_CANCEL: + WvPdCancel(prov, Request); + break; case WV_IOCTL_PD_DEALLOCATE: WvPdDeallocate(prov, Request); break; diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\core\winverbs/kernel/wv_pd.c branches\winverbs\core\winverbs/kernel/wv_pd.c --- trunk\core\winverbs/kernel/wv_pd.c 2008-07-17 14:10:04.268936000 -0700 +++ branches\winverbs\core\winverbs/kernel/wv_pd.c 2009-06-09 14:24:31.940134600 -0700 @@ -191,6 +191,30 @@ out: WdfRequestComplete(Request, status); } +void WvPdCancel(WV_PROVIDER *pProvider, WDFREQUEST Request) +{ + WV_PROTECTION_DOMAIN *pd; + UINT64 *id; + NTSTATUS status; + + status = WdfRequestRetrieveInputBuffer(Request, sizeof(UINT64), &id, NULL); + if (!NT_SUCCESS(status)) { + goto complete; + } + + pd = WvPdAcquire(pProvider, *id); + if (pd == NULL) { + status = STATUS_NOT_FOUND; + goto complete; + } + + // Registration is currently synchronous - nothing to do. + WvPdRelease(pd); + +complete: + WdfRequestComplete(Request, status); +} + void WvPdFree(WV_PROTECTION_DOMAIN *pPd) { WV_MEMORY_REGION *mr; diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\core\winverbs/kernel/wv_pd.h branches\winverbs\core\winverbs/kernel/wv_pd.h --- trunk\core\winverbs/kernel/wv_pd.h 2009-01-24 11:41:22.234375000 -0800 +++ branches\winverbs\core\winverbs/kernel/wv_pd.h 2009-06-09 14:21:00.884388600 -0700 @@ -66,6 +66,7 @@ void WvPdPut(WV_PROTECTION_DOMAIN *pPd); void WvPdAllocate(WV_PROVIDER *pProvider, WDFREQUEST Request); void WvPdDeallocate(WV_PROVIDER *pProvider, WDFREQUEST Request); +void WvPdCancel(WV_PROVIDER *pProvider, WDFREQUEST Request); void WvPdFree(WV_PROTECTION_DOMAIN *pPd); void WvPdRemoveHandler(WV_PROTECTION_DOMAIN *pPd); diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\core\winverbs/user/wv_pd.cpp branches\winverbs\core\winverbs/user/wv_pd.cpp --- trunk\core\winverbs/user/wv_pd.cpp 2008-12-01 23:16:23.475375000 -0800 +++ branches\winverbs\core\winverbs/user/wv_pd.cpp 2009-06-09 14:14:33.928021600 -0700 @@ -133,6 +133,24 @@ Release(void) } STDMETHODIMP CWVProtectionDomain:: +CancelOverlappedRequests(void) +{ + DWORD bytes; + + return WvDeviceIoControl(m_hFile, WV_IOCTL_PD_CANCEL, &m_Id, sizeof m_Id, + NULL, 0, &bytes, NULL) ? + WV_SUCCESS : HRESULT_FROM_WIN32(GetLastError()); +} + +STDMETHODIMP CWVProtectionDomain:: +GetOverlappedResult(OVERLAPPED *pOverlapped, + DWORD *pNumberOfBytesTransferred, BOOL bWait) +{ + ::GetOverlappedResult(m_hFile, pOverlapped, pNumberOfBytesTransferred, bWait); + return (HRESULT) pOverlapped->Internal; +} + +STDMETHODIMP CWVProtectionDomain:: CreateSharedReceiveQueue(SIZE_T MaxWr, SIZE_T MaxSge, SIZE_T SrqLimit, IWVSharedReceiveQueue** ppSrq) { diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\core\winverbs/user/wv_pd.h branches\winverbs\core\winverbs/user/wv_pd.h --- trunk\core\winverbs/user/wv_pd.h 2008-07-18 12:45:25.617473800 -0700 +++ branches\winverbs\core\winverbs/user/wv_pd.h 2009-06-09 14:12:36.150540600 -0700 @@ -45,6 +45,11 @@ public: STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); + // IWVOverlapped methods + STDMETHODIMP CancelOverlappedRequests(); + STDMETHODIMP GetOverlappedResult(OVERLAPPED *pOverlapped, + DWORD *pNumberOfBytesTransferred, BOOL bWait); + // IWVProtectionDomain methods STDMETHODIMP CreateSharedReceiveQueue(SIZE_T MaxWr, SIZE_T MaxSge, SIZE_T SrqLimit, IWVSharedReceiveQueue** ppSrq); diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\core\winverbs/wv_ioctl.h branches\winverbs\core\winverbs/wv_ioctl.h --- trunk\core\winverbs/wv_ioctl.h 2009-05-27 12:11:07.010125000 -0700 +++ branches\winverbs\core\winverbs/wv_ioctl.h 2009-06-09 14:19:00.810106100 -0700 @@ -97,6 +97,7 @@ enum { WV_IO_FUNCTION_EP_CANCEL, WV_IO_FUNCTION_EP_LISTEN, WV_IO_FUNCTION_EP_GET_REQUEST, + WV_IO_FUNCTION_PD_CANCEL, WV_IO_FUNCTION_MAX }; @@ -148,6 +149,10 @@ enum { #define WV_IOCTL_PD_DEALLOCATE WV_IOCTL(WV_IO_FUNCTION_BASE + \ WV_IO_FUNCTION_PD_DEALLOCATE) +// UINT64 Id / none +#define WV_IOCTL_PD_CANCEL WV_IOCTL(WV_IO_FUNCTION_BASE + \ + WV_IO_FUNCTION_PD_CANCEL) + // WV_IO_MEMORY_REGISTER / WV_IO_MEMORY_KEYS #define WV_IOCTL_MEMORY_REGISTER WV_IOCTL(WV_IO_FUNCTION_BASE + \ WV_IO_FUNCTION_MEMORY_REGISTER) diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\inc\user\rdma/winverbs.h branches\winverbs\inc\user\rdma/winverbs.h --- trunk\inc\user\rdma/winverbs.h 2009-06-02 13:23:44.246541100 -0700 +++ branches\winverbs\inc\user\rdma/winverbs.h 2009-06-09 14:12:36.322410100 -0700 @@ -1022,11 +1022,11 @@ DECLARE_INTERFACE_(IWVDatagramQueuePair, #undef INTERFACE #define INTERFACE IWVProtectionDomain -// {a5633a12-dffc-4060-927d-9a600d7efb63} -DEFINE_GUID(IID_IWVProtectionDomain, 0xa5633a12, 0xdffc, 0x4060, - 0x92, 0x7d, 0x9a, 0x60, 0x0d, 0x7e, 0xfb, 0x63); +// {E3657ABE-8C4E-4994-BE32-45B49BAE95E4} +DEFINE_GUID(IID_IWVProtectionDomain, 0xe3657abe, 0x8c4e, 0x4994, + 0xbe, 0x32, 0x45, 0xb4, 0x9b, 0xae, 0x95, 0xe4); -DECLARE_INTERFACE_(IWVProtectionDomain, IUnknown) +DECLARE_INTERFACE_(IWVProtectionDomain, IWVOverlapped) { // IUnknown methods __override STDMETHOD(QueryInterface)( @@ -1043,6 +1043,18 @@ DECLARE_INTERFACE_(IWVProtectionDomain, THIS ) PURE; + // IWVOverlapped methods + STDMETHOD(CancelOverlappedRequests)( + THIS + ) PURE; + + STDMETHOD(GetOverlappedResult)( + THIS_ + __inout_opt OVERLAPPED *pOverlapped, + __out DWORD *pNumberOfBytesTransferred, + __in BOOL bWait + ) PURE; + // IWVProtectionDomain methods STDMETHOD(CreateSharedReceiveQueue)( THIS_ @@ -1449,9 +1461,9 @@ DECLARE_INTERFACE_(IWVDevice, IWVOverlap #undef INTERFACE #define INTERFACE IWVProvider -// {060E95D6-EC54-43b2-83FC-B578FD037259} -DEFINE_GUID(IID_IWVProvider, 0x60e95d6, 0xec54, 0x43b2, - 0x83, 0xfc, 0xb5, 0x78, 0xfd, 0x3, 0x72, 0x59); +// {75AD0EDA-23C9-4687-8FFF-D1B34E1EF5BE} +DEFINE_GUID(IID_IWVProvider, 0x75ad0eda, 0x23c9, 0x4687, + 0x8f, 0xff, 0xd1, 0xb3, 0x4e, 0x1e, 0xf5, 0xbe); DECLARE_INTERFACE_(IWVProvider, IUnknown) { _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
