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

Reply via email to