|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [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>
---
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |