]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
nd: update MR/MW APIs to match latest spec
authorSean Hefty <sean.hefty@intel.com>
Mon, 26 Jul 2010 23:51:57 +0000 (16:51 -0700)
committerSean Hefty <sean.hefty@intel.com>
Tue, 27 Jul 2010 06:41:07 +0000 (23:41 -0700)
This includes deriving MR from NDOverlapped and supporting
CancelOverlappedRequests().  We need to track overlapped
registration requests and cancel them independently from
the winverbs protection domain.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
trunk/ulp/netdirect2/user/nd_mw.cpp
trunk/ulp/netdirect2/user/nd_mw.h

index be5446d5b192e014a300d2f014fb410105045c30..f6a85bf789a009688cd9ad8ea220f710e6600d0e 100644 (file)
@@ -35,6 +35,7 @@ CNDMemoryRegion::CNDMemoryRegion(CNDAdapter *pAdapter)
        pAdapter->AddRef();\r
        m_pAdapter = pAdapter;\r
        RtlZeroMemory(&m_Keys, sizeof(m_Keys));\r
+       m_pOverlapped = NULL;\r
 }\r
 \r
 CNDMemoryRegion::~CNDMemoryRegion()\r
@@ -67,6 +68,31 @@ Release(void)
        return CNDBase::Release();\r
 }\r
 \r
+STDMETHODIMP CNDMemoryRegion::\r
+CancelOverlappedRequests(void)\r
+{\r
+       if (m_pOverlapped != NULL) {\r
+               CancelIoEx(m_pAdapter->GetFileHandle(), m_pOverlapped);\r
+       }\r
+\r
+       return ND_SUCCESS;\r
+}\r
+\r
+STDMETHODIMP CNDMemoryRegion::\r
+GetOverlappedResult(OVERLAPPED *pOverlapped, BOOL bWait)\r
+{\r
+       DWORD bytes;\r
+       HRESULT hr;\r
+\r
+       hr = NDConvertWVStatus(m_pAdapter->m_pWvPd->\r
+                                                  GetOverlappedResult(pOverlapped, &bytes, bWait));\r
+       if (hr != ND_PENDING) {\r
+               m_pOverlapped = NULL;\r
+       }\r
+\r
+       return hr;\r
+}\r
+\r
 DWORD ConvertAccessFlags(DWORD Flags)\r
 {\r
        DWORD opts = 0;\r
@@ -86,6 +112,7 @@ Register(const VOID* pBuffer, SIZE_T cbBuffer, DWORD flags, OVERLAPPED* pOverlap
 {\r
        HRESULT hr;\r
 \r
+       m_pOverlapped = pOverlapped;\r
        hr = m_pAdapter->m_pWvPd->RegisterMemory(pBuffer, cbBuffer, ConvertAccessFlags(flags),\r
                                                                                         pOverlapped, &m_Keys);\r
        return NDConvertWVStatus(hr);\r
@@ -96,7 +123,7 @@ Deregister(OVERLAPPED* pOverlapped)
 {\r
        HRESULT hr;\r
 \r
-       //??? if the lkey is not unique, we need to change this\r
+       m_pOverlapped = pOverlapped;\r
        hr = m_pAdapter->m_pWvPd->DeregisterMemory(m_Keys.Lkey, pOverlapped);\r
        return NDConvertWVStatus(hr);\r
 }\r
index 47c18b2d17fc8496cb7b23c1188bf0b56f71af07..eb0bbc91e3b8206ee7df4fa680a2335280d00819 100644 (file)
@@ -45,6 +45,10 @@ public:
        STDMETHODIMP_(ULONG) AddRef();\r
        STDMETHODIMP_(ULONG) Release();\r
 \r
+       // INDOverlapped methods\r
+       STDMETHODIMP CancelOverlappedRequests();\r
+       STDMETHODIMP GetOverlappedResult(OVERLAPPED *pOverlapped, BOOL bWait);\r
+\r
        // INDMemoryRegion methods\r
        STDMETHODIMP Register(const VOID* pBuffer, SIZE_T cbBuffer, DWORD flags,\r
                                                  OVERLAPPED* pOverlapped);\r
@@ -79,6 +83,7 @@ public:
 \r
 protected:\r
        CNDAdapter                      *m_pAdapter;\r
+       OVERLAPPED                      *m_pOverlapped;\r
 };\r
 \r
 \r