[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 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 | 68 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/src/xencons/fdo.c b/src/xencons/fdo.c index 5992776..1e660ea 100644 --- a/src/xencons/fdo.c +++ b/src/xencons/fdo.c @@ -902,6 +902,11 @@ fail1: return status; } +static VOID +FdoDestroyAllHandles( + IN PXENCONS_FDO Fdo + ); + // This function must not touch pageable code or data static DECLSPEC_NOINLINE VOID FdoD0ToD3( @@ -920,6 +925,8 @@ FdoD0ToD3( #pragma prefast(suppress:28123) (VOID) IoSetDeviceInterfaceState(&Dx->Link, FALSE); + FdoDestroyAllHandles(Fdo); + PowerState.DeviceState = PowerDeviceD3; PoSetPowerState(Fdo->Dx->DeviceObject, DevicePowerState, @@ -2175,6 +2182,23 @@ fail1: return NULL; } +static FORCEINLINE VOID +__FdoDestroyHandle( + IN PXENCONS_FDO Fdo, + IN PFDO_HANDLE Handle + ) +{ + 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, @@ -2187,17 +2211,47 @@ FdoDestroyHandle( RemoveEntryList(&Handle->ListEntry); KeReleaseSpinLock(&Fdo->HandleLock, Irql); - RtlZeroMemory(&Handle->ListEntry, sizeof (LIST_ENTRY)); - Trace("%p\n", Handle->FileObject); - StreamDestroy(Handle->Stream); - Handle->Stream = NULL; + __FdoDestroyHandle(Fdo, Handle); +} - Handle->FileObject = NULL; +static VOID +FdoDestroyAllHandles( + IN PXENCONS_FDO Fdo + ) +{ + KIRQL Irql; + LIST_ENTRY ListHead; + PLIST_ENTRY ListEntry; + PFDO_HANDLE Handle; - ASSERT(IsZeroMemory(Handle, sizeof (FDO_HANDLE))); - __FdoFree(Handle); + InitializeListHead(&ListHead); + + KeAcquireSpinLock(&Fdo->HandleLock, &Irql); + + ListEntry = Fdo->HandleList.Flink; + if (!IsListEmpty(&Fdo->HandleList)) { + RemoveEntryList(&Fdo->HandleList); + InitializeListHead(&Fdo->HandleList); + AppendTailList(&ListHead, ListEntry); + } + + KeReleaseSpinLock(&Fdo->HandleLock, Irql); + + for (;;) { + ListEntry = RemoveHeadList(&ListHead); + if (ListEntry == &ListHead) + break; + + Handle = CONTAINING_RECORD(ListEntry, + FDO_HANDLE, + ListEntry); + + Trace("%p\n", Handle->FileObject); + + __FdoDestroyHandle(Fdo, Handle); + } } static DECLSPEC_NOINLINE NTSTATUS -- 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 |