[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH v2 1/2] Destroy all handles on FdoD0ToD3
From: Owen Smith <owen.smith@xxxxxxxxxx> Since the StreamWorker holds a reference to the XENBUS_CONS interface, xenbus will BUG_ON if the handles are not cleaned up before power down. The service should close all handles in response to a DBT_DEVICEQUERYREMOVE notification, but this may not be issued on system power down. Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xencons/fdo.c | 96 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 71 insertions(+), 25 deletions(-) diff --git a/src/xencons/fdo.c b/src/xencons/fdo.c index 5992776..df20faa 100644 --- a/src/xencons/fdo.c +++ b/src/xencons/fdo.c @@ -902,6 +902,75 @@ fail1: return status; } +static FORCEINLINE VOID +__FdoDestroyHandle( + IN PXENCONS_FDO Fdo, + IN PFDO_HANDLE Handle + ) +{ + Trace("%p\n", Handle->FileObject); + + RtlZeroMemory(&Handle->ListEntry, sizeof (LIST_ENTRY)); + + StreamDestroy(Handle->Stream); + Handle->Stream = NULL; + + Handle->FileObject = NULL; + + ASSERT(IsZeroMemory(Handle, sizeof (FDO_HANDLE))); + __FdoFree(Handle); +} + +static VOID +FdoDestroyHandle( + IN PXENCONS_FDO Fdo, + IN PFDO_HANDLE Handle + ) +{ + KIRQL Irql; + + KeAcquireSpinLock(&Fdo->HandleLock, &Irql); + RemoveEntryList(&Handle->ListEntry); + KeReleaseSpinLock(&Fdo->HandleLock, Irql); + + __FdoDestroyHandle(Fdo, Handle); +} + +static VOID +FdoDestroyAllHandles( + IN PXENCONS_FDO Fdo + ) +{ + KIRQL Irql; + LIST_ENTRY List; + PLIST_ENTRY ListEntry; + PFDO_HANDLE Handle; + + InitializeListHead(&List); + + KeAcquireSpinLock(&Fdo->HandleLock, &Irql); + + ListEntry = Fdo->HandleList.Flink; + if (!IsListEmpty(&Fdo->HandleList)) { + RemoveEntryList(&Fdo->HandleList); + InitializeListHead(&Fdo->HandleList); + AppendTailList(&List, ListEntry); + } + + KeReleaseSpinLock(&Fdo->HandleLock, Irql); + + while (!IsListEmpty(&List)) { + ListEntry = RemoveHeadList(&List); + ASSERT3P(ListEntry, !=, &List); + + Handle = CONTAINING_RECORD(ListEntry, + FDO_HANDLE, + ListEntry); + + __FdoDestroyHandle(Fdo, Handle); + } +} + // This function must not touch pageable code or data static DECLSPEC_NOINLINE VOID FdoD0ToD3( @@ -920,6 +989,8 @@ FdoD0ToD3( #pragma prefast(suppress:28123) (VOID) IoSetDeviceInterfaceState(&Dx->Link, FALSE); + FdoDestroyAllHandles(Fdo); + PowerState.DeviceState = PowerDeviceD3; PoSetPowerState(Fdo->Dx->DeviceObject, DevicePowerState, @@ -2175,31 +2246,6 @@ fail1: return NULL; } -static VOID -FdoDestroyHandle( - IN PXENCONS_FDO Fdo, - IN PFDO_HANDLE Handle - ) -{ - KIRQL Irql; - - KeAcquireSpinLock(&Fdo->HandleLock, &Irql); - RemoveEntryList(&Handle->ListEntry); - KeReleaseSpinLock(&Fdo->HandleLock, Irql); - - RtlZeroMemory(&Handle->ListEntry, sizeof (LIST_ENTRY)); - - Trace("%p\n", Handle->FileObject); - - StreamDestroy(Handle->Stream); - Handle->Stream = NULL; - - Handle->FileObject = NULL; - - ASSERT(IsZeroMemory(Handle, sizeof (FDO_HANDLE))); - __FdoFree(Handle); -} - static DECLSPEC_NOINLINE NTSTATUS FdoDispatchCreate( IN PXENCONS_FDO Fdo, -- 2.8.3 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |