[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH 23/26] Track Queued/Submitted/Completed counts



From: Owen Smith <owen.smith@xxxxxxxxxx>

---
 src/xenvbd/adapter.c   | 31 ++++++++++++++++++++++++++++++-
 src/xenvbd/blockring.c | 33 ++++++++++++++++++++++++++++++++-
 2 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/src/xenvbd/adapter.c b/src/xenvbd/adapter.c
index 945888d..b0a94e2 100644
--- a/src/xenvbd/adapter.c
+++ b/src/xenvbd/adapter.c
@@ -1853,7 +1853,36 @@ AdapterHwInitialize(
     IN  PVOID   DevExt
     )
 {
-    UNREFERENCED_PARAMETER(DevExt);
+    ULONG                   status;
+    PERF_CONFIGURATION_DATA Perf;
+
+    RtlZeroMemory(&Perf, sizeof(PERF_CONFIGURATION_DATA));
+    Perf.Version = STOR_PERF_VERSION;
+    Perf.Size  = sizeof(PERF_CONFIGURATION_DATA);
+
+    status = StorPortInitializePerfOpts(DevExt,
+                                        TRUE,
+                                        &Perf);
+    if (status != STOR_STATUS_SUCCESS)
+        return TRUE;
+
+    Verbose("Perf: %s%s%s%s%s%s\n",
+            Perf.Flags & STOR_PERF_DPC_REDIRECTION ? "DPC_REDIRECT " : "",
+            Perf.Flags & STOR_PERF_CONCURRENT_CHANNELS ? "CONCURRENT " : "",
+            Perf.Flags & STOR_PERF_INTERRUPT_MESSAGE_RANGES ? "MSG_RANGES " : 
"",
+            Perf.Flags & STOR_PERF_ADV_CONFIG_LOCALITY ? "LOCALITY " : "",
+            Perf.Flags & STOR_PERF_OPTIMIZE_FOR_COMPLETION_DURING_STARTIO ? 
"STARTIO " : "",
+            Perf.Flags & STOR_PERF_DPC_REDIRECTION_CURRENT_CPU ? "CURRENT_CPU 
" : "");
+    Verbose("Perf: %u Channels\n",
+            Perf.ConcurrentChannels);
+
+    if (Perf.Flags & STOR_PERF_CONCURRENT_CHANNELS)
+        Perf.ConcurrentChannels = KeQueryActiveProcessorCount(NULL);
+
+    status = StorPortInitializePerfOpts(DevExt,
+                                        FALSE,
+                                        &Perf);
+
     return TRUE;
 }
 
diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c
index a41a912..96cc12e 100644
--- a/src/xenvbd/blockring.c
+++ b/src/xenvbd/blockring.c
@@ -79,6 +79,10 @@ struct _XENVBD_BLOCKRING {
     ULONG                   NrQueued;
     ULONG                   NrSubmitted;
     ULONG                   NrCompleted;
+    ULONG                   CurQueued;
+    ULONG                   CurSubmitted;
+    ULONG                   MaxQueued;
+    ULONG                   MaxSubmitted;
     ULONG                   NrInterrupts;
     ULONG                   NrDpcs;
 };
@@ -265,7 +269,11 @@ BlockRingPostRequest(
 
     req = RING_GET_REQUEST(&BlockRing->Front, BlockRing->Front.req_prod_pvt);
     ++BlockRing->Front.req_prod_pvt;
+    --BlockRing->CurQueued;
     ++BlockRing->NrSubmitted;
+    ++BlockRing->CurSubmitted;
+    if (BlockRing->CurSubmitted > BlockRing->MaxSubmitted)
+        BlockRing->MaxSubmitted = BlockRing->CurSubmitted;
     InsertTailList(&BlockRing->Submitted, &Request->ListEntry);
 
     BlockRingInsert(BlockRing, Request, req);
@@ -355,6 +363,7 @@ BlockRingPoll(
                                       rsp->status);
             }
             ++BlockRing->NrCompleted;
+            --BlockRing->CurSubmitted;
 
             // zero entire ring slot (to detect further failures)
             RtlZeroMemory(rsp, sizeof(union blkif_sring_entry));
@@ -390,7 +399,7 @@ done:
 
     KeReleaseSpinLockFromDpcLevel(&BlockRing->Lock);
 }
-
+ 
 KSERVICE_ROUTINE BlockRingInterrupt;
 
 BOOLEAN
@@ -493,6 +502,14 @@ BlockRingDebugCallback(
                  BlockRing->NrSubmitted,
                  BlockRing->NrCompleted);
 
+    XENBUS_DEBUG(Printf,
+                 &BlockRing->DebugInterface,
+                 "Queued: %u / %u, Submitted: %u / %u\n",
+                 BlockRing->CurQueued,
+                 BlockRing->MaxQueued,
+                 BlockRing->CurSubmitted,
+                 BlockRing->MaxSubmitted);
+
     Port = XENBUS_EVTCHN(GetPort,
                          &BlockRing->EvtchnInterface,
                          BlockRing->Channel);
@@ -847,9 +864,20 @@ BlockRingDisconnect(
     XENBUS_STORE(Release, &BlockRing->StoreInterface);
     RtlZeroMemory(&BlockRing->StoreInterface, sizeof(XENBUS_STORE_INTERFACE));
 
+    Verbose("Queued: %u / %u, Submitted %u / %u, Completed: %u\n",
+            BlockRing->NrQueued,
+            BlockRing->MaxQueued,
+            BlockRing->NrSubmitted,
+            BlockRing->MaxSubmitted,
+            BlockRing->NrCompleted);
+
     BlockRing->NrQueued = 0;
     BlockRing->NrSubmitted = 0;
     BlockRing->NrCompleted = 0;
+    BlockRing->CurQueued = 0;
+    BlockRing->CurSubmitted = 0;
+    BlockRing->MaxQueued = 0;
+    BlockRing->MaxSubmitted = 0;
     BlockRing->NrInterrupts = 0;
     BlockRing->NrDpcs = 0;
 
@@ -873,7 +901,10 @@ BlockRingSubmit(
             break;
         InsertTailList(&BlockRing->Queued, ListEntry);
         ++BlockRing->NrQueued;
+        ++BlockRing->CurQueued;
     }
+    if (BlockRing->CurQueued > BlockRing->MaxQueued)
+        BlockRing->MaxQueued = BlockRing->CurQueued;
 
     KeReleaseSpinLock(&BlockRing->Lock, Irql);
 
-- 
2.8.3


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.