]> xenbits.xensource.com Git - pvdrivers/win/xenvbd.git/commitdiff
Create a seperate thread per VBD to handle backend change watches
authorOwen Smith <owen.smith@citrix.com>
Tue, 19 Apr 2016 15:50:08 +0000 (16:50 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Mon, 9 May 2016 12:29:32 +0000 (13:29 +0100)
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@citrix.com>
src/xenvbd/fdo.c
src/xenvbd/frontend.c
src/xenvbd/frontend.h
src/xenvbd/pdo.c
src/xenvbd/pdo.h

index 3cee464a191481b79355c5796b964fa31a2f616b..fc46cb32f0a54bd559a1bc0427e8333b4766cb8e 100644 (file)
@@ -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);
index 4a8fbe3defed4200dfcde666aca1aab9f38f6127..2dd9fc77126ea18477fcd16bf86b78ce41a2bde3 100644 (file)
@@ -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;
 
index 7d934f9726c0610e6f7956bcc7bcb111fe5aa4d4..7e40bce8cac0f8df4dde826996f124efa058541a 100644 (file)
@@ -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
     );
 
index c7d8b2b8f8e13a247eca9eb127d06a69c3e6de73..918b824a21155ccd3907a8d8822b7bf364cc34b3 100644 (file)
@@ -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);
index 3bff743d047f0b6c2b4504243b921b67e15b3278..946c34ffca007390e8af27eb62333b3650226d2f 100644 (file)
@@ -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(