[prev in list] [next in list] [prev in thread] [next in thread]
List: win-pv-devel
Subject: [win-pv-devel] [PATCH v2 1/2] Make sure AdapterInitialize is called at PASSIVE_LEVEL
From: Paul Durrant <paul.durrant () citrix ! com>
Date: 2017-06-28 16:10:37
Message-ID: 1498666238-4704-1-git-send-email-paul.durrant () citrix ! com
[Download RAW message or body]
AdapterHwFindAdapter() can be called at DISPATCH_LEVEL and therefore it
is not safe to call AdapterInitialize() directly from there.
This patch, instead, calls StorPortEnablePassiveInitialization() from
AdapterHwInitialize() to request a PASSIVE_LEVEL initialization routine
is called immediately after AdapterHwFindAdapter() so that
AdapterInitialize() can be called from there.
Suggested-by: Owen Smith <owen.smith@citrix.com>
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
src/xenvbd/adapter.c | 57 ++++++++++++++++++++++++++++++++++------------------
src/xenvbd/driver.c | 1 +
src/xenvbd/driver.h | 1 +
3 files changed, 40 insertions(+), 19 deletions(-)
diff --git a/src/xenvbd/adapter.c b/src/xenvbd/adapter.c
index 577bfdf..a4220d1 100644
--- a/src/xenvbd/adapter.c
+++ b/src/xenvbd/adapter.c
@@ -1095,6 +1095,7 @@ AdapterDevicePowerThread(
return STATUS_SUCCESS;
}
+__drv_requiresIRQL(PASSIVE_LEVEL)
static NTSTATUS
__AdapterQueryInterface(
IN PXENVBD_ADAPTER Adapter,
@@ -1174,6 +1175,8 @@ fail1:
(PINTERFACE)(_itf), \
sizeof( ## _name ## _INTERFACE), \
(_opt))
+
+__drv_requiresIRQL(PASSIVE_LEVEL)
static NTSTATUS
AdapterInitialize(
IN PXENVBD_ADAPTER Adapter,
@@ -1916,12 +1919,7 @@ AdapterHwFindAdapter(
OUT PBOOLEAN Again
)
{
- PXENVBD_ADAPTER Adapter = DevExt;
- PDEVICE_OBJECT DeviceObject;
- PDEVICE_OBJECT PhysicalDeviceObject;
- PDEVICE_OBJECT LowerDeviceObject;
- NTSTATUS status;
-
+ UNREFERENCED_PARAMETER(DevExt);
UNREFERENCED_PARAMETER(Context);
UNREFERENCED_PARAMETER(BusInformation);
UNREFERENCED_PARAMETER(ArgumentString);
@@ -1948,36 +1946,57 @@ AdapterHwFindAdapter(
// We need to do this to avoid an assertion in a checked kernel
(VOID) StorPortGetUncachedExtension(DevExt, ConfigInfo, PAGE_SIZE);
- (VOID) StorPortGetDeviceObjects(DevExt,
- &DeviceObject,
- &PhysicalDeviceObject,
- &LowerDeviceObject);
- if (Adapter->DeviceObject == DeviceObject)
- return SP_RETURN_FOUND;
+ return SP_RETURN_FOUND;
+}
+
+HW_PASSIVE_INITIALIZE_ROUTINE AdapterHwPassiveInitialize;
+
+BOOLEAN
+AdapterHwPassiveInitialize(
+ IN PVOID DevExt
+ )
+{
+ PXENVBD_ADAPTER Adapter = DevExt;
+ PDEVICE_OBJECT DeviceObject;
+ PDEVICE_OBJECT PhysicalDeviceObject;
+ PDEVICE_OBJECT LowerDeviceObject;
+ NTSTATUS status;
+
+ if (StorPortGetDeviceObjects(DevExt,
+ &DeviceObject,
+ &PhysicalDeviceObject,
+ &LowerDeviceObject) != STOR_STATUS_SUCCESS)
+ goto fail1;
status = AdapterInitialize(Adapter,
DeviceObject,
PhysicalDeviceObject,
LowerDeviceObject);
if (!NT_SUCCESS(status))
- goto fail1;
+ goto fail2;
AdapterUnplugRequest(Adapter, TRUE);
status = AdapterD3ToD0(Adapter);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail3;
DriverSetAdapter(Adapter);
- return SP_RETURN_FOUND;
+ return TRUE;
-fail2:
+fail3:
Error("fail2\n");
+
AdapterUnplugRequest(Adapter, FALSE);
AdapterTeardown(Adapter);
+
+fail2:
+ Error("fail2\n");
+
fail1:
Error("fail1\n");
- return SP_RETURN_ERROR;
+
+ return FALSE;
}
HW_INITIALIZE AdapterHwInitialize;
@@ -1987,8 +2006,8 @@ AdapterHwInitialize(
IN PVOID DevExt
)
{
- UNREFERENCED_PARAMETER(DevExt);
- return TRUE;
+ return StorPortEnablePassiveInitialization(DevExt,
+ AdapterHwPassiveInitialize);
}
HW_INTERRUPT AdapterHwInterrupt;
diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
index 6ed865e..62c3cbb 100644
--- a/src/xenvbd/driver.c
+++ b/src/xenvbd/driver.c
@@ -105,6 +105,7 @@ DriverDispatchPower(
#define MAXNAMELEN 256
+__drv_requiresIRQL(PASSIVE_LEVEL)
VOID
DriverRequestReboot(
VOID
diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h
index 343a7fe..386cd84 100644
--- a/src/xenvbd/driver.h
+++ b/src/xenvbd/driver.h
@@ -61,6 +61,7 @@ DriverDispatchPower(
IN PIRP Irp
);
+__drv_requiresIRQL(PASSIVE_LEVEL)
extern VOID
DriverRequestReboot(
VOID
--
2.5.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic