]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
winverbs: add mr interface
authorSean Hefty <sean.hefty@intel.com>
Tue, 13 Jul 2010 18:51:32 +0000 (11:51 -0700)
committerSean Hefty <sean.hefty@intel.com>
Wed, 14 Jul 2010 21:29:02 +0000 (14:29 -0700)
The lkey isn't guaranteed to be unique.  To ensure that we track
memory registrations properly, associate MRs with their own data
structure.  Deregistration will reference the data structure, rather
than just the lkey from the registration.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
trunk/core/winverbs/kernel/wv_pd.c
trunk/core/winverbs/kernel/wv_pd.h
trunk/core/winverbs/wv_ioctl.h

index af9a55096e1a0e8fac4c5e9a1e7442a299f8f5ed..de6e75d639cb8d2d42d9cbf00052d026665280ac 100644 (file)
@@ -85,7 +85,7 @@ static NTSTATUS WvPdAlloc(WV_DEVICE *pDevice, WV_PROTECTION_DOMAIN **ppPd,
        InitializeListHead(&pd->SrqList);\r
        InitializeListHead(&pd->MwList);\r
        InitializeListHead(&pd->AhList);\r
-       cl_qmap_init(&pd->MrMap);\r
+       InitializeListHead(&pd->MrList);\r
        KeInitializeGuardedMutex(&pd->Lock);\r
 \r
        ib_status = pDevice->pVerbs->allocate_pd(pDevice->hVerbsDevice, IB_PDT_NORMAL,\r
@@ -225,16 +225,16 @@ void WvPdFree(WV_PROTECTION_DOMAIN *pPd)
                KeWaitForSingleObject(&pPd->Event, Executive, KernelMode, FALSE, NULL);\r
        }\r
 \r
-       for (item = cl_qmap_head(&pPd->MrMap); item != cl_qmap_end(&pPd->MrMap);\r
-                item = cl_qmap_head(&pPd->MrMap)) {\r
-               mr = CONTAINING_RECORD(item, WV_MEMORY_REGION, Item);\r
-               if (mr->hVerbsMr != NULL) {\r
-                       pPd->pVerbs->deregister_mr(mr->hVerbsMr);\r
-               }\r
+       //for (item = cl_qmap_head(&pPd->MrMap); item != cl_qmap_end(&pPd->MrMap);\r
+       //       item = cl_qmap_head(&pPd->MrMap)) {\r
+       //      mr = CONTAINING_RECORD(item, WV_MEMORY_REGION, Item);\r
+       //      if (mr->hVerbsMr != NULL) {\r
+       //              pPd->pVerbs->deregister_mr(mr->hVerbsMr);\r
+       //      }\r
 \r
-               cl_qmap_remove_item(&pPd->MrMap, &mr->Item);\r
-               ExFreePoolWithTag(mr, 'rmvw');\r
-       }\r
+       //      cl_qmap_remove_item(&pPd->MrMap, &mr->Item);\r
+       //      ExFreePoolWithTag(mr, 'rmvw');\r
+       //}\r
 \r
        if (pPd->hVerbsPd != NULL) {\r
                pPd->pVerbs->deallocate_pd(pPd->hVerbsPd);\r
@@ -266,9 +266,8 @@ void WvPdRemoveHandler(WV_PROTECTION_DOMAIN *pPd)
                ah->hVerbsAh = NULL;\r
        }\r
 \r
-       for (item = cl_qmap_head(&pPd->MrMap); item != cl_qmap_end(&pPd->MrMap);\r
-                item = cl_qmap_next(item)) {\r
-               mr = CONTAINING_RECORD(item, WV_MEMORY_REGION, Item);\r
+       for (entry = pPd->MrList.Flink; entry != &pPd->MrList; entry = entry->Flink) {\r
+               mr = CONTAINING_RECORD(entry, WV_MEMORY_REGION, Entry);\r
                pPd->pVerbs->deregister_mr(mr->hVerbsMr);\r
                mr->hVerbsMr = NULL;\r
        }\r
@@ -323,6 +322,9 @@ void WvMrRegister(WV_PROVIDER *pProvider, WDFREQUEST Request)
                goto err2;\r
        }\r
 \r
+       WvPdGet(pd);\r
+       mr->pPd = pd;\r
+\r
        attr.access_ctrl = reg->AccessFlags;\r
        attr.length = reg->BufferLength;\r
        attr.vaddr = (void *) (ULONG_PTR) reg->Address;\r
@@ -333,16 +335,23 @@ void WvMrRegister(WV_PROVIDER *pProvider, WDFREQUEST Request)
                goto err3;\r
        }\r
 \r
-       KeAcquireGuardedMutex(&pd->Lock);\r
-       cl_qmap_insert(&pd->MrMap, keys->Lkey, &mr->Item);\r
-       KeReleaseGuardedMutex(&pd->Lock);\r
+       KeAcquireGuardedMutex(&pProvider->Lock);\r
+       keys->Id = IndexListInsertHead(&pProvider->MrIndex, mr);\r
+       if (keys->Id == 0) {\r
+               status = STATUS_NO_MEMORY;\r
+               goto err4;\r
+       }\r
+       InsertHeadList(&pd->MrList, &mr->Entry);\r
+       KeReleaseGuardedMutex(&pProvider->Lock);\r
 \r
        WvPdRelease(pd);\r
        WdfRequestCompleteWithInformation(Request, status, sizeof(WV_IO_MEMORY_KEYS));\r
        return;\r
 \r
+err4:\r
+       KeReleaseGuardedMutex(&pProvider->Lock);\r
 err3:\r
-       ExFreePoolWithTag(mr, 'rmvw');\r
+       WvMrFree(mr);\r
 err2:\r
        WvPdRelease(pd);\r
 err1:\r
@@ -351,49 +360,43 @@ err1:
 \r
 void WvMrDeregister(WV_PROVIDER *pProvider, WDFREQUEST Request)\r
 {\r
-       WV_IO_ID                                *id;\r
-       WV_PROTECTION_DOMAIN    *pd;\r
-       WV_MEMORY_REGION                *mr;\r
-       cl_map_item_t                   *item;\r
-       NTSTATUS                                status;\r
-       ib_api_status_t                 ib_status;\r
+       WV_MEMORY_REGION        *mr;\r
+       UINT64                          *id;\r
+       NTSTATUS                        status;\r
 \r
-       status = WdfRequestRetrieveInputBuffer(Request, sizeof(WV_IO_ID), &id, NULL);\r
+       status = WdfRequestRetrieveInputBuffer(Request, sizeof(UINT64), &id, NULL);\r
        if (!NT_SUCCESS(status)) {\r
                goto complete;\r
        }\r
 \r
-       pd = WvPdAcquire(pProvider, id->Id);\r
-       if (pd == NULL) {\r
+       KeAcquireGuardedMutex(&pProvider->Lock);\r
+       WvProviderDisableRemove(pProvider);\r
+       mr = IndexListAt(&pProvider->MrIndex, (SIZE_T) *id);\r
+       if (mr == NULL) {\r
                status = STATUS_NOT_FOUND;\r
-               goto complete;\r
+       } else {\r
+               IndexListRemove(&pProvider->MrIndex, (SIZE_T) *id);\r
+               RemoveEntryList(&mr->Entry);\r
+               status = STATUS_SUCCESS;\r
        }\r
+       KeReleaseGuardedMutex(&pProvider->Lock);\r
 \r
-       KeAcquireGuardedMutex(&pd->Lock);\r
-       item = cl_qmap_remove(&pd->MrMap, id->Data);\r
-       KeReleaseGuardedMutex(&pd->Lock);\r
-\r
-       if (item == cl_qmap_end(&pd->MrMap)) {\r
-               status = STATUS_NOT_FOUND;\r
-               goto release;\r
+       if (NT_SUCCESS(status)) {\r
+               WvMrFree(mr);\r
        }\r
+       WvProviderEnableRemove(pProvider);\r
+out:\r
+       WdfRequestComplete(Request, status);\r
+}\r
 \r
-       mr = CONTAINING_RECORD(item, WV_MEMORY_REGION, Item);\r
-\r
-       ib_status = pd->pVerbs->deregister_mr(mr->hVerbsMr);\r
-       if (ib_status != IB_SUCCESS) {\r
-               status = STATUS_UNSUCCESSFUL;\r
-               KeAcquireGuardedMutex(&pd->Lock);\r
-               cl_qmap_insert(&pd->MrMap, id->Data, &mr->Item);\r
-               KeReleaseGuardedMutex(&pd->Lock);\r
-               goto release;\r
+void WvMrFree(WV_MEMORY_REGION *pMr)\r
+{\r
+       if (pMr->hVerbsMr != NULL) {\r
+               pMr->pPd->pVerbs->deregister_mr(pMr->hVerbsMr);\r
        }\r
 \r
-       ExFreePoolWithTag(mr, 'rmvw');\r
-release:\r
-       WvPdRelease(pd);\r
-complete:\r
-       WdfRequestComplete(Request, status);\r
+       WvPdPut(pMr->pPd);\r
+       ExFreePoolWithTag(pMr, 'rmvw');\r
 }\r
 \r
 void WvMwAllocate(WV_PROVIDER *pProvider, WDFREQUEST Request)\r
index f30cf4e537de37b6600421c33c8b9fc096a25483..10abd495c96a29a17dd2533ef9115e5d6210c898 100644 (file)
@@ -49,10 +49,10 @@ typedef struct _WV_PROTECTION_DOMAIN
 \r
        LIST_ENTRY                      QpList;\r
        LIST_ENTRY                      SrqList;\r
+       LIST_ENTRY                      MrList;\r
        LIST_ENTRY                      MwList;\r
        LIST_ENTRY                      AhList;\r
        KGUARDED_MUTEX          Lock;\r
-       cl_qmap_t                       MrMap;\r
 \r
        KEVENT                          Event;\r
        LONG                            Ref;\r
@@ -73,13 +73,15 @@ void WvPdRemoveHandler(WV_PROTECTION_DOMAIN *pPd);
 \r
 typedef struct _WV_MEMORY_REGION\r
 {\r
+       WV_PROTECTION_DOMAIN    *pPd;\r
        ib_mr_handle_t                  hVerbsMr;\r
-       cl_map_item_t                   Item;\r
+       LIST_ENTRY                              Entry;\r
 \r
 }      WV_MEMORY_REGION;\r
 \r
 void WvMrRegister(WV_PROVIDER *pProvider, WDFREQUEST Request);\r
 void WvMrDeregister(WV_PROVIDER *pProvider, WDFREQUEST Request);\r
+void WvMrFree(WV_MEMORY_REGION *pMr);\r
 \r
 \r
 typedef struct _WV_MEMORY_WINDOW\r
index ce091d10a226b437d15e17d0b255d3cf30610e9d..7717ad517df119bf3481aeea59298c99f458b1c0 100644 (file)
@@ -162,7 +162,7 @@ enum {
 #define WV_IOCTL_MEMORY_REGISTER               WV_IOCTL(WV_IO_FUNCTION_BASE + \\r
                                                                                                 WV_IO_FUNCTION_MEMORY_REGISTER)\r
 \r
-// WV_IO_ID / none\r
+// UINT64 Id / none\r
 #define WV_IOCTL_MEMORY_DEREGISTER             WV_IOCTL(WV_IO_FUNCTION_BASE + \\r
                                                                                                 WV_IO_FUNCTION_MEMORY_DEREGISTER)\r
 \r
@@ -478,6 +478,7 @@ typedef struct _WV_IO_MEMORY_REGISTER
 \r
 typedef struct _WV_IO_MEMORY_KEYS\r
 {\r
+       UINT64                  Id;\r
        UINT32                  Lkey;\r
        NET32                   Rkey;\r
 \r