|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 3/9] Refactor Pnp/Power handlers
Moves the mapping of DeviceObject to Pdo into the Fdo code
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenvbd/driver.c | 127 +++++----------------------
src/xenvbd/fdo.c | 248 ++++++++++++++++++++++++----------------------------
src/xenvbd/fdo.h | 20 ++---
3 files changed, 138 insertions(+), 257 deletions(-)
diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
index cff6034..c5352d0 100644
--- a/src/xenvbd/driver.c
+++ b/src/xenvbd/driver.c
@@ -42,10 +42,6 @@
#include <xencrsh_interface.h>
#include <xenvbd-ntstrsafe.h>
-#define IS_NULL ((ULONG)'llun')
-#define IS_FDO ((ULONG)'odf')
-#define IS_PDO ((ULONG)'odp')
-//=============================================================================
XENVBD_PARAMETERS DriverParameters;
HANDLE DriverStatusKey;
@@ -261,65 +257,26 @@ DriverUnlinkFdo(
KeReleaseSpinLock(&__XenvbdLock, Irql);
}
-__checkReturn
-static FORCEINLINE ULONG
-DriverGetFdoOrPdo(
- __in PDEVICE_OBJECT DeviceObject,
- __out PXENVBD_FDO* _Fdo,
- __out PXENVBD_PDO* _Pdo
- )
-{
- KIRQL Irql;
- ULONG Result = IS_NULL;
-
- *_Fdo = NULL;
- *_Pdo = NULL;
-
- KeAcquireSpinLock(&__XenvbdLock, &Irql);
- if (__XenvbdFdo) {
- PXENVBD_FDO Fdo = __XenvbdFdo;
- if (FdoReference(Fdo) > 0) {
- if (FdoGetDeviceObject(Fdo) == DeviceObject) {
- *_Fdo = Fdo;
- Result = IS_FDO;
- } else {
- KeReleaseSpinLock(&__XenvbdLock, Irql);
-
- *_Pdo = FdoGetPdoFromDeviceObject(Fdo, DeviceObject);
- FdoDereference(Fdo);
- return IS_PDO;
- }
- }
- }
- KeReleaseSpinLock(&__XenvbdLock, Irql);
-
- return Result;
-}
-__checkReturn
-static FORCEINLINE NTSTATUS
-DriverMapPdo(
- __in PDEVICE_OBJECT DeviceObject,
- __in PIRP Irp
+static FORCEINLINE BOOLEAN
+__DriverGetFdo(
+ IN PDEVICE_OBJECT DeviceObject,
+ OUT PXENVBD_FDO *Fdo
)
{
KIRQL Irql;
- NTSTATUS Status;
+ BOOLEAN IsFdo = FALSE;
KeAcquireSpinLock(&__XenvbdLock, &Irql);
- if (__XenvbdFdo && FdoGetDeviceObject(__XenvbdFdo) != DeviceObject) {
- PXENVBD_FDO Fdo = __XenvbdFdo;
- if (FdoReference(Fdo) > 0) {
- KeReleaseSpinLock(&__XenvbdLock, Irql);
- Status = FdoMapDeviceObjectToPdo(Fdo, DeviceObject, Irp);
- FdoDereference(Fdo);
- goto done;
+ *Fdo = __XenvbdFdo;
+ if (*Fdo) {
+ FdoReference(*Fdo);
+ if (FdoGetDeviceObject(*Fdo) == DeviceObject) {
+ IsFdo = TRUE;
}
}
KeReleaseSpinLock(&__XenvbdLock, Irql);
- Status = DriverDispatchPnp(DeviceObject, Irp);
-done:
- return Status;
+ return IsFdo;
}
VOID
@@ -563,9 +520,6 @@ HwStartIo(
return FdoStartIo((PXENVBD_FDO)HwDeviceExtension, Srb);
}
-//=============================================================================
-// Driver Redirections
-
__drv_dispatchType(IRP_MJ_PNP)
DRIVER_DISPATCH DispatchPnp;
@@ -575,34 +529,15 @@ DispatchPnp(
IN PIRP Irp
)
{
- NTSTATUS Status;
- ULONG IsFdo;
PXENVBD_FDO Fdo;
- PXENVBD_PDO Pdo;
-
- IsFdo = DriverGetFdoOrPdo(DeviceObject, &Fdo, &Pdo);
- switch (IsFdo) {
- case IS_FDO:
- Status = FdoDispatchPnp(Fdo, DeviceObject, Irp); // drops Fdo reference
- break;
+ if (__DriverGetFdo(DeviceObject, &Fdo))
+ return FdoDispatchPnp(Fdo, DeviceObject, Irp);
- case IS_PDO:
- if (Pdo) {
- Status = PdoDispatchPnp(Pdo, DeviceObject, Irp); // drops Pdo
reference
- } else {
- Status = DriverMapPdo(DeviceObject, Irp);
- }
- break;
+ if (Fdo != NULL)
+ return FdoForwardPnp(Fdo, DeviceObject, Irp);
- case IS_NULL:
- default:
- Warning("DeviceObject 0x%p is not FDO (0x%p) or a PDO\n",
DeviceObject, __XenvbdFdo);
- Status = DriverDispatchPnp(DeviceObject, Irp);
- break;
- }
-
- return Status;
+ return DriverDispatchPnp(DeviceObject, Irp);
}
__drv_dispatchType(IRP_MJ_POWER)
@@ -614,35 +549,15 @@ DispatchPower(
IN PIRP Irp
)
{
- NTSTATUS Status;
- ULONG IsFdo;
PXENVBD_FDO Fdo;
- PXENVBD_PDO Pdo;
-
- IsFdo = DriverGetFdoOrPdo(DeviceObject, &Fdo, &Pdo);
- switch (IsFdo) {
- case IS_FDO:
- ASSERT3P(Fdo, !=, NULL);
- ASSERT3P(Pdo, ==, NULL);
- Status = FdoDispatchPower(Fdo, DeviceObject, Irp); // drops Fdo
reference
- break;
-
- case IS_PDO:
- if (Pdo) {
- PdoDereference(Pdo); // drops Pdo reference
- }
- Status = DriverDispatchPower(DeviceObject, Irp);
- break;
+ if (__DriverGetFdo(DeviceObject, &Fdo))
+ return FdoDispatchPower(Fdo, DeviceObject, Irp);
- case IS_NULL:
- default:
- Warning("DeviceObject 0x%p is not FDO (0x%p) or a PDO\n",
DeviceObject, __XenvbdFdo);
- Status = DriverDispatchPower(DeviceObject, Irp);
- break;
- }
+ if (Fdo != NULL)
+ FdoDereference(Fdo);
- return Status;
+ return DriverDispatchPower(DeviceObject, Irp);
}
DRIVER_UNLOAD DriverUnload;
diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 247ef51..939fb47 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1879,70 +1879,7 @@ FdoStartIo(
return TRUE;
}
-//=============================================================================
-// PnP Handler
-__checkReturn
-NTSTATUS
-FdoDispatchPnp(
- __in PXENVBD_FDO Fdo,
- __in PDEVICE_OBJECT DeviceObject,
- __in PIRP Irp
- )
-{
- PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
- UCHAR Minor = Stack->MinorFunction;
- NTSTATUS Status;
-
- switch (Stack->MinorFunction) {
- case IRP_MN_REMOVE_DEVICE:
- Verbose("FDO:IRP_MN_REMOVE_DEVICE\n");
- FdoD0ToD3(Fdo);
- FdoUnplugRequest(Fdo, FALSE);
- // drop ref-count acquired in DriverGetFdo *before* destroying Fdo
- FdoDereference(Fdo);
- __FdoTerminate(Fdo);
- break;
-
- case IRP_MN_QUERY_DEVICE_RELATIONS:
- if (Stack->Parameters.QueryDeviceRelations.Type == BusRelations) {
- KIRQL Irql;
- BOOLEAN NeedInvalidate;
- BOOLEAN NeedReboot;
-
- KeAcquireSpinLock(&Fdo->Lock, &Irql);
-
- if (Fdo->DevicePower == PowerDeviceD0) {
- FdoScanTargets(Fdo, &NeedInvalidate, &NeedReboot);
- } else {
- NeedInvalidate = FALSE;
- NeedReboot = FALSE;
- }
-
- KeReleaseSpinLock(&Fdo->Lock, Irql);
-
- if (NeedInvalidate)
- FdoLogTargets("QUERY_RELATIONS", Fdo);
-
- if (NeedReboot)
- DriverNotifyInstaller();
- }
- FdoDereference(Fdo);
- break;
-
- default:
- FdoDereference(Fdo);
- break;
- }
-
- Status = DriverDispatchPnp(DeviceObject, Irp);
- if (!NT_SUCCESS(Status)) {
- Verbose("%02x:%s -> %08x\n", Minor, PnpMinorFunctionName(Minor),
Status);
- }
- return Status;
-}
-
-__checkReturn
-PXENVBD_PDO
+static PXENVBD_PDO
FdoGetPdoFromDeviceObject(
__in PXENVBD_FDO Fdo,
__in PDEVICE_OBJECT DeviceObject
@@ -1964,24 +1901,27 @@ FdoGetPdoFromDeviceObject(
return NULL;
}
-__checkReturn
-static FORCEINLINE NTSTATUS
-__FdoSendQueryId(
- __in PDEVICE_OBJECT DeviceObject,
- __out PWCHAR* _String
+static PXENVBD_PDO
+FdoMapDeviceObjectToPdo(
+ __in PXENVBD_FDO Fdo,
+ __in PDEVICE_OBJECT DeviceObject
)
{
- KEVENT Complete;
- PIRP Irp;
- IO_STATUS_BLOCK StatusBlock;
- PIO_STACK_LOCATION Stack;
- NTSTATUS Status;
+ PXENVBD_PDO Pdo;
+ KEVENT Complete;
+ PIRP Irp;
+ IO_STATUS_BLOCK StatusBlock;
+ PIO_STACK_LOCATION Stack;
+ NTSTATUS Status;
+ PWCHAR String;
+ ULONG TargetId;
+ DECLARE_UNICODE_STRING_SIZE(UniStr, 4);
KeInitializeEvent(&Complete, NotificationEvent, FALSE);
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP, DeviceObject, NULL, 0,
NULL, &Complete, &StatusBlock);
- if (!Irp)
- return STATUS_INSUFFICIENT_RESOURCES;
+ if (Irp == NULL)
+ goto fail1;
Stack = IoGetNextIrpStackLocation(Irp);
Stack->MinorFunction = IRP_MN_QUERY_ID;
@@ -1994,21 +1934,10 @@ __FdoSendQueryId(
(VOID) KeWaitForSingleObject(&Complete, Executive, KernelMode, FALSE,
NULL);
Status = StatusBlock.Status;
}
- if (NT_SUCCESS(Status)) {
- *_String = (PWCHAR)StatusBlock.Information;
- }
- return Status;
-}
-
-__checkReturn
-static FORCEINLINE NTSTATUS
-__FdoExtractTargetId(
- __in PWCHAR String,
- __out PULONG TargetId
- )
-{
- DECLARE_UNICODE_STRING_SIZE(UniStr, 4);
-
+ if (!NT_SUCCESS(Status))
+ goto fail2;
+
+ String = (PWCHAR)StatusBlock.Information;
switch (wcslen(String)) {
case 3:
UniStr.Length = 1 * sizeof(WCHAR);
@@ -2022,75 +1951,122 @@ __FdoExtractTargetId(
UniStr_buffer[2] = UNICODE_NULL;
break;
default:
- return STATUS_INVALID_PARAMETER;
+ goto fail3;
}
- return RtlUnicodeStringToInteger(&UniStr, 16, TargetId);
+ Status = RtlUnicodeStringToInteger(&UniStr, 16, &TargetId);
+ if (!NT_SUCCESS(Status))
+ goto fail4;
+
+ Pdo = __FdoGetPdo(Fdo, TargetId);
+ if (Pdo == NULL)
+ goto fail5;
+
+ PdoSetDeviceObject(Pdo, DeviceObject);
+ ExFreePool(String);
+
+ return Pdo;
+
+fail5:
+fail4:
+fail3:
+ ExFreePool(String);
+fail2:
+fail1:
+ return NULL;
}
-static FORCEINLINE VOID
-__FdoSetDeviceObject(
- __in PXENVBD_FDO Fdo,
- __in ULONG TargetId,
- __in PDEVICE_OBJECT DeviceObject
+__checkReturn
+NTSTATUS
+FdoForwardPnp(
+ __in PXENVBD_FDO Fdo,
+ __in PDEVICE_OBJECT DeviceObject,
+ __in PIRP Irp
)
{
- PXENVBD_PDO Pdo;
+ PIO_STACK_LOCATION Stack;
+ PXENVBD_PDO Pdo;
- Pdo = __FdoGetPdo(Fdo, TargetId);
- if (Pdo) {
- PdoSetDeviceObject(Pdo, DeviceObject);
- PdoDereference(Pdo);
+ ASSERT3P(DeviceObject, !=, Fdo->DeviceObject);
+
+ Pdo = FdoGetPdoFromDeviceObject(Fdo, DeviceObject);
+ if (Pdo != NULL) {
+ FdoDereference(Fdo);
+ return PdoDispatchPnp(Pdo, DeviceObject, Irp);
}
+
+ Stack = IoGetCurrentIrpStackLocation(Irp);
+ if (Stack->MinorFunction == IRP_MN_QUERY_ID &&
+ Stack->Parameters.QueryId.IdType == BusQueryDeviceID) {
+ Pdo = FdoMapDeviceObjectToPdo(Fdo, DeviceObject);
+ if (Pdo != NULL) {
+ FdoDereference(Fdo);
+ return PdoDispatchPnp(Pdo, DeviceObject, Irp);
+ }
+ }
+
+ FdoDereference(Fdo);
+ return DriverDispatchPnp(DeviceObject, Irp);
}
__checkReturn
NTSTATUS
-FdoMapDeviceObjectToPdo(
+FdoDispatchPnp(
__in PXENVBD_FDO Fdo,
__in PDEVICE_OBJECT DeviceObject,
__in PIRP Irp
)
{
- PWCHAR String;
- NTSTATUS Status;
- ULONG TargetId;
- PIO_STACK_LOCATION StackLocation;
- UCHAR Minor;
+ PIO_STACK_LOCATION Stack;
- StackLocation = IoGetCurrentIrpStackLocation(Irp);
- Minor = StackLocation->MinorFunction;
+ ASSERT3P(DeviceObject, ==, Fdo->DeviceObject);
- if (!(StackLocation->MinorFunction == IRP_MN_QUERY_ID &&
- StackLocation->Parameters.QueryId.IdType == BusQueryDeviceID)) {
- goto done;
- }
+ Stack = IoGetCurrentIrpStackLocation(Irp);
- Status = __FdoSendQueryId(DeviceObject, &String);
- if (!NT_SUCCESS(Status)) {
- goto done;
- }
+ switch (Stack->MinorFunction) {
+ case IRP_MN_REMOVE_DEVICE:
+ Verbose("FDO:IRP_MN_REMOVE_DEVICE\n");
+ FdoD0ToD3(Fdo);
+ FdoUnplugRequest(Fdo, FALSE);
+ // drop ref-count acquired in DriverGetFdo *before* destroying Fdo
+ FdoDereference(Fdo);
+ __FdoTerminate(Fdo);
+ break;
- Status = __FdoExtractTargetId(String, &TargetId);
- if (NT_SUCCESS(Status)) {
- __FdoSetDeviceObject(Fdo, TargetId, DeviceObject);
- Verbose("0x%p --> Target %d (%ws)\n", DeviceObject, TargetId, String);
- }
+ case IRP_MN_QUERY_DEVICE_RELATIONS:
+ if (Stack->Parameters.QueryDeviceRelations.Type == BusRelations) {
+ KIRQL Irql;
+ BOOLEAN NeedInvalidate;
+ BOOLEAN NeedReboot;
- // String is PagedPool, allocated by lower driver
- ASSERT3U(KeGetCurrentIrql(), <=, APC_LEVEL);
- ExFreePool(String);
+ KeAcquireSpinLock(&Fdo->Lock, &Irql);
-done:
- Status = DriverDispatchPnp(DeviceObject, Irp);;
- if (!NT_SUCCESS(Status)) {
- Verbose("%02x:%s -> %08x\n", Minor, PnpMinorFunctionName(Minor),
Status);
+ if (Fdo->DevicePower == PowerDeviceD0) {
+ FdoScanTargets(Fdo, &NeedInvalidate, &NeedReboot);
+ } else {
+ NeedInvalidate = FALSE;
+ NeedReboot = FALSE;
+ }
+
+ KeReleaseSpinLock(&Fdo->Lock, Irql);
+
+ if (NeedInvalidate)
+ FdoLogTargets("QUERY_RELATIONS", Fdo);
+
+ if (NeedReboot)
+ DriverNotifyInstaller();
+ }
+ FdoDereference(Fdo);
+ break;
+
+ default:
+ FdoDereference(Fdo);
+ break;
}
- return Status;
+
+ return DriverDispatchPnp(DeviceObject, Irp);
}
-//=============================================================================
-// Power Handler
__checkReturn
NTSTATUS
FdoDispatchPower(
@@ -2103,6 +2079,8 @@ FdoDispatchPower(
POWER_STATE_TYPE PowerType;
NTSTATUS status;
+ ASSERT3P(DeviceObject, ==, Fdo->DeviceObject);
+
Stack = IoGetCurrentIrpStackLocation(Irp);
PowerType = Stack->Parameters.Power.Type;
@@ -2136,8 +2114,6 @@ FdoDispatchPower(
return status;
}
-//=============================================================================
-// Interfaces
PXENBUS_STORE_INTERFACE
FdoAcquireStore(
__in PXENVBD_FDO Fdo
diff --git a/src/xenvbd/fdo.h b/src/xenvbd/fdo.h
index a9e36c2..96c66a5 100644
--- a/src/xenvbd/fdo.h
+++ b/src/xenvbd/fdo.h
@@ -127,31 +127,22 @@ FdoStartIo(
__in PSCSI_REQUEST_BLOCK Srb
);
-// PnP Handler
__checkReturn
extern NTSTATUS
-FdoDispatchPnp(
- __in PXENVBD_FDO Fdo,
- __in PDEVICE_OBJECT DeviceObject,
- __in PIRP Irp
- );
-
-__checkReturn
-extern PXENVBD_PDO
-FdoGetPdoFromDeviceObject(
- __in PXENVBD_FDO Fdo,
- __in PDEVICE_OBJECT DeviceObject
+FdoForwardPnp(
+ __in PXENVBD_FDO Fdo,
+ __in PDEVICE_OBJECT DeviceObject,
+ __in PIRP Irp
);
__checkReturn
extern NTSTATUS
-FdoMapDeviceObjectToPdo(
+FdoDispatchPnp(
__in PXENVBD_FDO Fdo,
__in PDEVICE_OBJECT DeviceObject,
__in PIRP Irp
);
-// Power Handler
__checkReturn
extern NTSTATUS
FdoDispatchPower(
@@ -160,7 +151,6 @@ FdoDispatchPower(
__in PIRP Irp
);
-// Interfaces
extern PXENBUS_STORE_INTERFACE
FdoAcquireStore(
__in PXENVBD_FDO Fdo
--
1.9.4.msysgit.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |