[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH v2 1/2] Destroy all handles on FdoD0ToD3
> -----Original Message----- > From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On > Behalf Of owen.smith@xxxxxxxxxx > Sent: 11 September 2017 08:41 > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Owen Smith <owen.smith@xxxxxxxxxx> > Subject: [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> Acked-by: Paul Durrant <paul.durrant@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 _______________________________________________ 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 |