I got a BS while disabling the IPoIB driver, the reason for that is trying to 
delete WDF device that is invalid. I guess that the object already deleted but 
I'm not sure.

Is WmPowerD0Exit  and WmPowerD0Entry functions are thread safe? In other words 
is only one instance of the function can be run in same time?

In order to catch the problem I added some ASSERT in the code and set the 
pointer to NULL after deleting  the object.

Attached is the patch

Index: winmad/kernel/wm_driver.c
===================================================================
--- winmad/kernel/wm_driver.c               (revision 6842)
+++ winmad/kernel/wm_driver.c            (working copy)
@@ -41,7 +41,7 @@
 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WM_IB_DEVICE, WmIbDeviceGetContext)
 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WM_PROVIDER, WmProviderGetContext)

-WDFDEVICE                                                      ControlDevice;
+WDFDEVICE                                                     ControlDevice = 
NULL;
 static LIST_ENTRY                            DevList;
 static LIST_ENTRY                            ProvList;
 static KGUARDED_MUTEX          Lock;
@@ -195,11 +195,14 @@
                WdfDeviceInitSetFileObjectConfig(pinit, &fileconfig, &attr);

                WDF_OBJECT_ATTRIBUTES_INIT(&attr);
+             ASSERT(ControlDevice == NULL);
                status = WdfDeviceCreate(&pinit, &attr, &ControlDevice);
                if (!NT_SUCCESS(status)) {
                                goto err1;
                }

+
+             ASSERT(ControlDevice != NULL);
                status = WdfDeviceCreateSymbolicLink(ControlDevice, &symlink);
                if (!NT_SUCCESS(status)) {
                                goto err2;
@@ -220,6 +223,7 @@

 err2:
                WdfObjectDelete(ControlDevice);
+             ControlDevice = NULL;
                return;
 err1:
                WdfDeviceInitFree(pinit);
@@ -340,14 +344,12 @@
                WM_REGISTRATION                      *reg;
                LIST_ENTRY                                        *entry;
                BOOLEAN                                                         
   destroy;
-              WDFDEVICE                                        ctrldev;

                pdev = WmIbDeviceGetContext(Device);

                KeAcquireGuardedMutex(&Lock);
                RemoveEntryList(&pdev->Entry);
                destroy = IsListEmpty(&DevList);
-              ctrldev = ControlDevice;

                for (entry = ProvList.Flink; entry != &ProvList; entry = 
entry->Flink) {
                                prov = CONTAINING_RECORD(entry, WM_PROVIDER, 
Entry);
@@ -365,7 +367,8 @@
                }

                if (destroy) {
-                              WdfObjectDelete(ctrldev);
+                             ASSERT(ControlDevice != NULL);
+                             WdfObjectDelete(ControlDevice);
                }

                return STATUS_SUCCESS;
Index: winmad/kernel/wm_provider.c
===================================================================
--- winmad/kernel/wm_provider.c          (revision 6842)
+++ winmad/kernel/wm_provider.c       (working copy)
@@ -64,6 +64,8 @@
                pProvider->Exclusive = 0;
                KeInitializeEvent(&pProvider->ExclusiveEvent, 
SynchronizationEvent, FALSE);

+             ASSERT(ControlDevice != NULL);
+
                WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual);
                status = WdfIoQueueCreate(ControlDevice, &config,
                                                                                
                                  WDF_NO_OBJECT_ATTRIBUTES, 
&pProvider->ReadQueue);
Index: winverbs/kernel/wv_cq.c
===================================================================
--- winverbs/kernel/wv_cq.c      (revision 6842)
+++ winverbs/kernel/wv_cq.c   (working copy)
@@ -97,6 +97,8 @@
                cq->Ref = 1;
                KeInitializeEvent(&cq->Event, NotificationEvent, FALSE);

+             ASSERT(ControlDevice != NULL);
+
                WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual);
                status = WdfIoQueueCreate(ControlDevice, &config,
                                                                                
                                  WDF_NO_OBJECT_ATTRIBUTES, &cq->Queue);
Index: winverbs/kernel/wv_device.c
===================================================================
--- winverbs/kernel/wv_device.c             (revision 6842)
+++ winverbs/kernel/wv_device.c          (working copy)
@@ -216,6 +216,8 @@
                                return STATUS_NO_MEMORY;
                }

+             ASSERT(ControlDevice != NULL);
+
                WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual);
                for (i = 0; i < pDevice->PortCount; i++) {
                                pDevice->pPorts[i].Flags = 0;
Index: winverbs/kernel/wv_driver.c
===================================================================
--- winverbs/kernel/wv_driver.c              (revision 6842)
+++ winverbs/kernel/wv_driver.c           (working copy)
@@ -48,7 +48,7 @@

 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WV_RDMA_DEVICE, WvRdmaDeviceGetContext)

-WDFDEVICE                                                      ControlDevice;
+WDFDEVICE                                                     ControlDevice = 
NULL;
 static LIST_ENTRY                            DevList;
 static LIST_ENTRY                            ProvList;
 static KGUARDED_MUTEX          Lock;
@@ -565,6 +565,8 @@
                ifc.InterfaceHeader.InterfaceReference = 
WdfDeviceInterfaceReferenceNoOp;
                ifc.InterfaceHeader.InterfaceDereference = 
WdfDeviceInterfaceReferenceNoOp;

+             ASSERT(ControlDevice != NULL);
+
                ifc.WdfDevice = (ULONG_PTR)ControlDevice;
                ifc.WdmDevice = WdfDeviceWdmGetDeviceObject(ControlDevice);

@@ -608,12 +610,16 @@
                WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attr, WV_PROVIDER);
                WdfDeviceInitSetFileObjectConfig(pinit, &fileconfig, &attr);

+             ASSERT(ControlDevice == NULL);
+
                WDF_OBJECT_ATTRIBUTES_INIT(&attr);
                status = WdfDeviceCreate(&pinit, &attr, &ControlDevice);
                if (!NT_SUCCESS(status)) {
                                goto err1;
                }

+             ASSERT(ControlDevice != NULL);
+
                status = WdfDeviceCreateSymbolicLink(ControlDevice, &symlink);
                if (!NT_SUCCESS(status)) {
                                goto err2;
@@ -633,6 +639,7 @@

 err2:
                WdfObjectDelete(ControlDevice);
+             ControlDevice = NULL;
                return;
 err1:
                WdfDeviceInitFree(pinit);
@@ -723,7 +730,6 @@
                KeAcquireGuardedMutex(&Lock);
                RemoveEntryList(&pdev->Entry);
                destroy = IsListEmpty(&DevList);
-              ctrldev = ControlDevice;

                for (entry = ProvList.Flink; entry != &ProvList; entry = 
entry->Flink) {
                                prov = CONTAINING_RECORD(entry, WV_PROVIDER, 
Entry);
@@ -744,7 +750,10 @@
                                                
IbCmInterface.InterfaceHeader.InterfaceDereference(IbCmInterface.
                                                                                
                                                                                
                                                                                
   InterfaceHeader.Context);
                                }
-                              WdfObjectDelete(ctrldev);
+
+                             ASSERT(ControlDevice !+ NULL);
+                             WdfObjectDelete(ControlDevice);
+                             ControlDevice = NULL;
                }
 }

Index: winverbs/kernel/wv_ep.c
===================================================================
--- winverbs/kernel/wv_ep.c     (revision 6842)
+++ winverbs/kernel/wv_ep.c  (working copy)
@@ -101,6 +101,8 @@
                KeInitializeEvent(&ep->Event, NotificationEvent, FALSE);
                InitializeListHead(&ep->Entry);

+             ASSERT(ControlDevice != NULL);
+
                WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual);
                status = WdfIoQueueCreate(ControlDevice, &config,
                                                                                
                                  WDF_NO_OBJECT_ATTRIBUTES, &ep->Queue);
Index: winverbs/kernel/wv_srq.c
===================================================================
--- winverbs/kernel/wv_srq.c    (revision 6842)
+++ winverbs/kernel/wv_srq.c (working copy)
@@ -109,6 +109,8 @@
                srq->Ref = 1;
                KeInitializeEvent(&srq->Event, NotificationEvent, FALSE);

+             ASSERT(ControlDevice != NULL);
+
                WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual);
                status = WdfIoQueueCreate(ControlDevice, &config,
                                                                                
                                  WDF_NO_OBJECT_ATTRIBUTES, &srq->Queue);

Attachment: add_assert.patch
Description: add_assert.patch

_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to