[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH 6/9] Create a thread per VBD to handle backend change watches
> -----Original Message----- > From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On > Behalf Of Owen Smith > Sent: 22 April 2016 15:16 > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Owen Smith > Subject: [win-pv-devel] [PATCH 6/9] Create a thread per VBD to handle > backend change watches > > Using a single thread for all backend watch events pust unneccesary > strain on xenstore when multiple vbds are in use, as each change > causes XenVbd to check several values in all backend areas. > > Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> Acked-by: Paul Durrant <paul.durrant@xxxxxxxxxx> > --- > src/xenvbd/fdo.c | 55 > +-------------------------------------------------- > src/xenvbd/frontend.c | 54 +++++++++++++++++++++++++++++++++++--- > ------------ > src/xenvbd/frontend.h | 7 ------- > src/xenvbd/pdo.c | 31 ++++++++++------------------- > src/xenvbd/pdo.h | 7 ------- > 5 files changed, 49 insertions(+), 105 deletions(-) > > diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c > index dab7ae1..29ec966 100644 > --- a/src/xenvbd/fdo.c > +++ b/src/xenvbd/fdo.c > @@ -93,7 +93,6 @@ struct _XENVBD_FDO { > PXENVBD_THREAD ScanThread; > KEVENT ScanEvent; > PXENBUS_STORE_WATCH ScanWatch; > - PXENVBD_THREAD FrontendThread; > > // Statistics > LONG CurrentSrbs; > @@ -648,7 +647,6 @@ __FdoEnumerate( > if (PdoCreate(Fdo, > Device, > TargetId, > - ThreadGetEvent(Fdo->FrontendThread), > DeviceType)) { > *NeedInvalidate = TRUE; > } > @@ -712,43 +710,6 @@ FdoScan( > return STATUS_SUCCESS; > } > > -__checkReturn > -static DECLSPEC_NOINLINE NTSTATUS > -FdoFrontend( > - __in PXENVBD_THREAD Thread, > - __in PVOID Context > - ) > -{ > - PXENVBD_FDO Fdo = Context; > - > - for (;;) { > - ULONG TargetId; > - KIRQL Irql; > - > - if (!ThreadWait(Thread)) > - break; > - > - KeAcquireSpinLock(&Fdo->Lock, &Irql); > - > - if (Fdo->DevicePower != PowerDeviceD0) { > - KeReleaseSpinLock(&Fdo->Lock, Irql); > - continue; > - } > - > - for (TargetId = 0; TargetId < XENVBD_MAX_TARGETS; ++TargetId) { > - PXENVBD_PDO Pdo = __FdoGetPdo(Fdo, TargetId); > - if (Pdo) { > - PdoBackendPathChanged(Pdo); > - PdoDereference(Pdo); > - } > - } > - > - KeReleaseSpinLock(&Fdo->Lock, Irql); > - } > - > - return STATUS_SUCCESS; > -} > - > > //========================================================= > ==================== > // Initialize, Start, Stop > > @@ -1556,13 +1517,9 @@ __FdoInitialize( > if (!NT_SUCCESS(Status)) > goto fail3; > > - Status = ThreadCreate(FdoFrontend, Fdo, &Fdo->FrontendThread); > - if (!NT_SUCCESS(Status)) > - goto fail4; > - > Status = ThreadCreate(FdoDevicePower, Fdo, &Fdo- > >DevicePowerThread); > if (!NT_SUCCESS(Status)) > - goto fail5; > + goto fail4; > > // query enumerator > // fix this up to query from device location(?) > @@ -1574,11 +1531,6 @@ __FdoInitialize( > Trace("<===== (%d)\n", KeGetCurrentIrql()); > return STATUS_SUCCESS; > > -fail5: > - Error("fail5\n"); > - ThreadAlert(Fdo->FrontendThread); > - ThreadJoin(Fdo->FrontendThread); > - Fdo->FrontendThread = NULL; > fail4: > Error("fail4\n"); > ThreadAlert(Fdo->ScanThread); > @@ -1621,11 +1573,6 @@ __FdoTerminate( > ThreadJoin(Fdo->DevicePowerThread); > Fdo->DevicePowerThread = NULL; > > - // stop frontend thread > - ThreadAlert(Fdo->FrontendThread); > - ThreadJoin(Fdo->FrontendThread); > - Fdo->FrontendThread = NULL; > - > // stop enum thread > ThreadAlert(Fdo->ScanThread); > ThreadJoin(Fdo->ScanThread); > diff --git a/src/xenvbd/frontend.c b/src/xenvbd/frontend.c > index 4a8fbe3..1436001 100644 > --- a/src/xenvbd/frontend.c > +++ b/src/xenvbd/frontend.c > @@ -41,6 +41,7 @@ > #include "notifier.h" > #include "blockring.h" > #include "granter.h" > +#include "thread.h" > #include <store_interface.h> > #include <suspend_interface.h> > > @@ -76,7 +77,7 @@ struct _XENVBD_FRONTEND { > > // Backend State Watch > BOOLEAN Active; > - PKEVENT BackendEvent; > + PXENVBD_THREAD BackendThread; > PXENBUS_STORE_WATCH BackendWatch; > }; > > @@ -925,7 +926,7 @@ FrontendPrepare( > Frontend->Store, > NULL, > Frontend->BackendPath, > - Frontend->BackendEvent, > + ThreadGetEvent(Frontend->BackendThread), > &Frontend->BackendWatch); > if (!NT_SUCCESS(Status)) > goto fail2; > @@ -1502,21 +1503,32 @@ FrontendSetState( > return Status; > } > > -__drv_requiresIRQL(DISPATCH_LEVEL) > -VOID > -FrontendBackendPathChanged( > - __in PXENVBD_FRONTEND Frontend > +__checkReturn > +static DECLSPEC_NOINLINE NTSTATUS > +FrontendBackend( > + __in PXENVBD_THREAD Thread, > + __in PVOID Context > ) > { > - KIRQL Irql; > - KeAcquireSpinLock(&Frontend->StateLock, &Irql); > - // Only attempt this if Active, Active is set/cleared on D3->D0/D0->D3 > - if (Frontend->Active) { > - // Note: Nothing may have changed with this target, this could be > caused by another target changing > - __ReadDiskInfo(Frontend); > - __CheckBackendForEject(Frontend); > + PXENVBD_FRONTEND Frontend = Context; > + > + for (;;) { > + KIRQL Irql; > + > + if (ThreadWait(Thread)) > + break; > + > + KeAcquireSpinLock(&Frontend->StateLock, &Irql); > + // Only attempt this if Active, Active is set/cleared on > D3->D0/D0->D3 > + if (Frontend->Active) { > + __ReadDiskInfo(Frontend); > + __CheckBackendForEject(Frontend); > + } > + KeReleaseSpinLock(&Frontend->StateLock, Irql); > } > - KeReleaseSpinLock(&Frontend->StateLock, Irql); > + > + return STATUS_SUCCESS; > + > } > > __checkReturn > @@ -1525,7 +1537,6 @@ FrontendCreate( > __in PXENVBD_PDO Pdo, > __in PCHAR DeviceId, > __in ULONG TargetId, > - __in PKEVENT Event, > __out PXENVBD_FRONTEND* _Frontend > ) > { > @@ -1547,7 +1558,6 @@ FrontendCreate( > Frontend->State = XENVBD_INITIALIZED; > Frontend->DiskInfo.SectorSize = 512; // default sector size > Frontend->BackendId = DOMID_INVALID; > - Frontend->BackendEvent = Event; > > Status = STATUS_INSUFFICIENT_RESOURCES; > Frontend->FrontendPath = DriverFormat("device/%s/%s", > FdoEnum(PdoGetFdo(Pdo)), DeviceId); > @@ -1570,6 +1580,10 @@ FrontendCreate( > if (!NT_SUCCESS(Status)) > goto fail6; > > + Status = ThreadCreate(FrontendBackend, Frontend, &Frontend- > >BackendThread); > + if (!NT_SUCCESS(Status)) > + goto fail7; > + > // kernel objects > KeInitializeSpinLock(&Frontend->StateLock); > > @@ -1577,6 +1591,10 @@ FrontendCreate( > *_Frontend = Frontend; > return STATUS_SUCCESS; > > +fail7: > + Error("fail7\n"); > + GranterDestroy(Frontend->Granter); > + Frontend->Granter = NULL; > fail6: > Error("fail6\n"); > BlockRingDestroy(Frontend->BlockRing); > @@ -1614,6 +1632,10 @@ FrontendDestroy( > PdoFreeInquiryData(Frontend->Inquiry); > Frontend->Inquiry = NULL; > > + ThreadAlert(Frontend->BackendThread); > + ThreadJoin(Frontend->BackendThread); > + Frontend->BackendThread = NULL; > + > GranterDestroy(Frontend->Granter); > Frontend->Granter = NULL; > > diff --git a/src/xenvbd/frontend.h b/src/xenvbd/frontend.h > index 7d934f9..7e40bce 100644 > --- a/src/xenvbd/frontend.h > +++ b/src/xenvbd/frontend.h > @@ -171,19 +171,12 @@ FrontendSetState( > __in XENVBD_STATE State > ); > > -__drv_requiresIRQL(DISPATCH_LEVEL) > -extern VOID > -FrontendBackendPathChanged( > - __in PXENVBD_FRONTEND Frontend > - ); > - > __checkReturn > extern NTSTATUS > FrontendCreate( > __in PXENVBD_PDO Pdo, > __in PCHAR DeviceId, > __in ULONG TargetId, > - __in PKEVENT Event, > __out PXENVBD_FRONTEND* _Frontend > ); > > diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c > index c7d8b2b..918b824 100644 > --- a/src/xenvbd/pdo.c > +++ b/src/xenvbd/pdo.c > @@ -2458,15 +2458,6 @@ PdoIssueDeviceEject( > } > } > > -__drv_requiresIRQL(DISPATCH_LEVEL) > -VOID > -PdoBackendPathChanged( > - __in PXENVBD_PDO Pdo > - ) > -{ > - FrontendBackendPathChanged(Pdo->Frontend); > -} > - > __checkReturn > NTSTATUS > PdoD3ToD0( > @@ -2538,7 +2529,6 @@ PdoCreate( > __in PXENVBD_FDO Fdo, > __in __nullterminated PCHAR DeviceId, > __in ULONG TargetId, > - __in PKEVENT FrontendEvent, > __in XENVBD_DEVICE_TYPE DeviceType > ) > { > @@ -2569,15 +2559,14 @@ PdoCreate( > QueueInit(&Pdo->PreparedReqs); > QueueInit(&Pdo->SubmittedReqs); > QueueInit(&Pdo->ShutdownSrbs); > - > - Status = FrontendCreate(Pdo, DeviceId, TargetId, FrontendEvent, &Pdo- > >Frontend); > - if (!NT_SUCCESS(Status)) > - goto fail2; > - > __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST), > REQUEST_POOL_TAG); > __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT), > SEGMENT_POOL_TAG); > __LookasideInit(&Pdo->IndirectList, sizeof(XENVBD_INDIRECT), > INDIRECT_POOL_TAG); > > + Status = FrontendCreate(Pdo, DeviceId, TargetId, &Pdo->Frontend); > + if (!NT_SUCCESS(Status)) > + goto fail2; > + > Status = PdoD3ToD0(Pdo); > if (!NT_SUCCESS(Status)) > goto fail3; > @@ -2595,14 +2584,14 @@ fail4: > > fail3: > Error("Fail3\n"); > - __LookasideTerm(&Pdo->IndirectList); > - __LookasideTerm(&Pdo->SegmentList); > - __LookasideTerm(&Pdo->RequestList); > FrontendDestroy(Pdo->Frontend); > Pdo->Frontend = NULL; > > fail2: > Error("Fail2\n"); > + __LookasideTerm(&Pdo->IndirectList); > + __LookasideTerm(&Pdo->SegmentList); > + __LookasideTerm(&Pdo->RequestList); > __PdoFree(Pdo); > > fail1: > @@ -2665,13 +2654,13 @@ PdoDestroy( > ASSERT3S(Pdo->ReferenceCount, ==, 0); > ASSERT3U(PdoGetDevicePnpState(Pdo), ==, Deleted); > > + FrontendDestroy(Pdo->Frontend); > + Pdo->Frontend = NULL; > + > __LookasideTerm(&Pdo->IndirectList); > __LookasideTerm(&Pdo->SegmentList); > __LookasideTerm(&Pdo->RequestList); > > - FrontendDestroy(Pdo->Frontend); > - Pdo->Frontend = NULL; > - > ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE); > RtlZeroMemory(Pdo, sizeof(XENVBD_PDO)); > __PdoFree(Pdo); > diff --git a/src/xenvbd/pdo.h b/src/xenvbd/pdo.h > index 3bff743..946c34f 100644 > --- a/src/xenvbd/pdo.h > +++ b/src/xenvbd/pdo.h > @@ -55,7 +55,6 @@ PdoCreate( > __in PXENVBD_FDO Fdo, > __in __nullterminated PCHAR DeviceId, > __in ULONG TargetId, > - __in PKEVENT FrontendEvent, > __in XENVBD_DEVICE_TYPE DeviceType > ); > > @@ -75,12 +74,6 @@ PdoD0ToD3( > __in PXENVBD_PDO Pdo > ); > > -__drv_requiresIRQL(DISPATCH_LEVEL) > -extern VOID > -PdoBackendPathChanged( > - __in PXENVBD_PDO Pdo > - ); > - > // PnP States > extern VOID > PdoSetMissing( > -- > 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 _______________________________________________ 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 |