[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Remove PDO set/is-missing logic from XENFILT
It's all completely unnecessary for a filter driver Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenfilt/fdo.c | 74 ++++++++++++++----------------------------------------- src/xenfilt/pdo.c | 67 ++++++++----------------------------------------- src/xenfilt/pdo.h | 16 ------------ 3 files changed, 29 insertions(+), 128 deletions(-) diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c index cff179b..25b3dc2 100644 --- a/src/xenfilt/fdo.c +++ b/src/xenfilt/fdo.c @@ -536,43 +536,22 @@ FdoEnumerate( PLIST_ENTRY Next = ListEntry->Flink; PXENFILT_DX Dx = CONTAINING_RECORD(ListEntry, XENFILT_DX, ListEntry); PXENFILT_PDO Pdo = Dx->Pdo; - BOOLEAN Missing; - Missing = TRUE; for (Index = 0; Index < Count; Index++) { if (PdoGetPhysicalDeviceObject(Pdo) == PhysicalDeviceObject[Index]) { - Missing = FALSE; -#pragma prefast(suppress:6387) // PhysicalDeviceObject[Index] could be NULL - ObDereferenceObject(PhysicalDeviceObject[Index]); PhysicalDeviceObject[Index] = NULL; // avoid duplication break; } } - if (Missing && - !PdoIsMissing(Pdo) && - PdoGetDevicePnpState(Pdo) != Deleted) { - PdoSetMissing(Pdo, "device disappeared"); - - // If the PDO has not yet been enumerated then we can go ahead - // and mark it as deleted, otherwise we need to notify PnP manager and - // wait for the REMOVE_DEVICE IRP. - if (PdoGetDevicePnpState(Pdo) == Present) { - PdoSetDevicePnpState(Pdo, Deleted); - PdoDestroy(Pdo); - } - } - ListEntry = Next; } // Walk the list and create PDO filters for any new devices for (Index = 0; Index < Count; Index++) { #pragma warning(suppress:6385) // Reading invalid data from 'PhysicalDeviceObject' - if (PhysicalDeviceObject[Index] != NULL) { + if (PhysicalDeviceObject[Index] != NULL) (VOID) FdoAddDevice(Fdo, PhysicalDeviceObject[Index]); - ObDereferenceObject(PhysicalDeviceObject[Index]); - } } __FdoReleaseMutex(Fdo); @@ -1101,8 +1080,8 @@ FdoQueryDeviceRelations( KEVENT Event; PIO_STACK_LOCATION StackLocation; ULONG Size; + PDEVICE_RELATIONS LowerRelations; PDEVICE_RELATIONS Relations; - PLIST_ENTRY ListEntry; XENFILT_FILTER_STATE State; ULONG Count; NTSTATUS status; @@ -1140,24 +1119,14 @@ FdoQueryDeviceRelations( if (StackLocation->Parameters.QueryDeviceRelations.Type != BusRelations) goto done; - Relations = (PDEVICE_RELATIONS)Irp->IoStatus.Information; - - if (Relations->Count != 0) - FdoEnumerate(Fdo, Relations); + LowerRelations = (PDEVICE_RELATIONS)Irp->IoStatus.Information; - ExFreePool(Relations); - - __FdoAcquireMutex(Fdo); + if (LowerRelations->Count != 0) + FdoEnumerate(Fdo, LowerRelations); State = DriverGetFilterState(); - Count = 0; - if (State == XENFILT_FILTER_DISABLED) { - for (ListEntry = Fdo->List.Flink; - ListEntry != &Fdo->List; - ListEntry = ListEntry->Flink) - Count++; - } + Count = (State == XENFILT_FILTER_DISABLED) ? LowerRelations->Count : 0; Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + (sizeof (PDEVICE_OBJECT) * __max(Count, 1)); @@ -1169,35 +1138,26 @@ FdoQueryDeviceRelations( goto fail3; if (State == XENFILT_FILTER_DISABLED) { - for (ListEntry = Fdo->List.Flink; - ListEntry != &Fdo->List; - ListEntry = ListEntry->Flink) { - PXENFILT_DX Dx = CONTAINING_RECORD(ListEntry, XENFILT_DX, ListEntry); - PXENFILT_PDO Pdo = Dx->Pdo; - - ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT); - - if (PdoGetDevicePnpState(Pdo) == Present) - PdoSetDevicePnpState(Pdo, Enumerated); - - ObReferenceObject(PdoGetPhysicalDeviceObject(Pdo)); - Relations->Objects[Relations->Count++] = PdoGetPhysicalDeviceObject(Pdo); - } - - ASSERT3U(Relations->Count, <=, Count); + ASSERT3U(Count, ==, LowerRelations->Count); + RtlCopyMemory(Relations, LowerRelations, Size); Trace("%s: %d PDO(s)\n", __FdoGetName(Fdo), Relations->Count); } else { + ULONG Index; + Trace("%s: FILTERED\n", __FdoGetName(Fdo)); + for (Index = 0; Index < LowerRelations->Count; Index++) + ObDereferenceObject(LowerRelations->Objects[Index]); + IoInvalidateDeviceRelations(__FdoGetPhysicalDeviceObject(Fdo), BusRelations); } - __FdoReleaseMutex(Fdo); + ExFreePool(LowerRelations); Irp->IoStatus.Information = (ULONG_PTR)Relations; status = STATUS_SUCCESS; @@ -1211,12 +1171,16 @@ done: return status; fail3: - __FdoReleaseMutex(Fdo); + Error("fail3\n"); fail2: + Error("fail2\n"); + IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp); fail1: + Error("fail1 (%08x)\n", status); + Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT); diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c index 893c76d..230fdf0 100644 --- a/src/xenfilt/pdo.c +++ b/src/xenfilt/pdo.c @@ -62,8 +62,6 @@ struct _XENFILT_PDO { PIRP DevicePowerIrp; PXENFILT_FDO Fdo; - BOOLEAN Missing; - const CHAR *Reason; XENFILT_EMULATED_OBJECT_TYPE Type; PXENFILT_EMULATED_OBJECT EmulatedObject; @@ -189,41 +187,6 @@ PdoGetPhysicalDeviceObject( return Pdo->PhysicalDeviceObject; } -static FORCEINLINE VOID -__PdoSetMissing( - IN PXENFILT_PDO Pdo, - IN const CHAR *Reason - ) -{ - Pdo->Reason = Reason; - Pdo->Missing = TRUE; -} - -VOID -PdoSetMissing( - IN PXENFILT_PDO Pdo, - IN const CHAR *Reason - ) -{ - __PdoSetMissing(Pdo, Reason); -} - -static FORCEINLINE BOOLEAN -__PdoIsMissing( - IN PXENFILT_PDO Pdo - ) -{ - return Pdo->Missing; -} - -BOOLEAN -PdoIsMissing( - IN PXENFILT_PDO Pdo - ) -{ - return __PdoIsMissing(Pdo); -} - static FORCEINLINE PDEVICE_OBJECT __PdoGetDeviceObject( IN PXENFILT_PDO Pdo @@ -817,22 +780,18 @@ PdoRemoveDevice( __PdoSetDevicePowerState(Pdo, PowerDeviceD3); done: - if (__PdoIsMissing(Pdo)) { - __PdoSetDevicePnpState(Pdo, Deleted); - IoReleaseRemoveLockAndWait(&Pdo->Dx->RemoveLock, Irp); - } else { - __PdoSetDevicePnpState(Pdo, Enumerated); - IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp); - } + FdoAcquireMutex(Fdo); + __PdoSetDevicePnpState(Pdo, Deleted); + FdoReleaseMutex(Fdo); + + IoReleaseRemoveLockAndWait(&Pdo->Dx->RemoveLock, Irp); status = PdoForwardIrpSynchronously(Pdo, Irp); IoCompleteRequest(Irp, IO_NO_INCREMENT); - if (__PdoIsMissing(Pdo)) { - FdoAcquireMutex(Fdo); - PdoDestroy(Pdo); - FdoReleaseMutex(Fdo); - } + FdoAcquireMutex(Fdo); + PdoDestroy(Pdo); + FdoReleaseMutex(Fdo); return status; @@ -1086,7 +1045,6 @@ PdoEject( PXENFILT_FDO Fdo = __PdoGetFdo(Pdo); NTSTATUS status; - __PdoSetMissing(Pdo, "Ejected"); __PdoSetDevicePnpState(Pdo, Deleted); status = PdoForwardIrpSynchronously(Pdo, Irp); @@ -2072,18 +2030,13 @@ PdoDestroy( ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted); - ASSERT(__PdoIsMissing(Pdo)); - Pdo->Missing = FALSE; - FdoRemovePhysicalDeviceObject(Fdo, Pdo); Dx->Pdo = NULL; - Info("%p (%s) (%s)\n", + Info("%p (%s)\n", FilterDeviceObject, - __PdoGetName(Pdo), - Pdo->Reason); - Pdo->Reason = NULL; + __PdoGetName(Pdo)); RtlZeroMemory(Pdo->Name, sizeof (Pdo->Name)); diff --git a/src/xenfilt/pdo.h b/src/xenfilt/pdo.h index f44278e..05ca049 100644 --- a/src/xenfilt/pdo.h +++ b/src/xenfilt/pdo.h @@ -56,22 +56,6 @@ PdoGetPhysicalDeviceObject( IN PXENFILT_PDO Pdo ); -extern BOOLEAN -PdoIsMissing( - IN PXENFILT_PDO Pdo - ); - -extern VOID -PdoSetMissing( - IN PXENFILT_PDO Pdo, - IN const CHAR *Reason - ); - -extern BOOLEAN -PdoIsMasked( - IN PXENFILT_PDO Pdo - ); - extern PDEVICE_OBJECT PdoGetDeviceObject( IN PXENFILT_PDO Pdo -- 2.1.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 |