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);
add_assert.patch
Description: add_assert.patch
_______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
