]> xenbits.xensource.com Git - pvdrivers/win/xenvbd.git/commitdiff
Query "multi-queue-max-queues"
authorOwen Smith <owen.smith@citrix.com>
Mon, 4 Jun 2018 13:36:21 +0000 (14:36 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Mon, 4 Jun 2018 15:24:59 +0000 (16:24 +0100)
Query "multi-queue-max-queues", and override if neccessary, and work
out a suitable value for the number of queues used. Also adds the
commented out writing code to set "multi-queue-num-queues"

Signed-off-by: Owen Smith <owen.smith@citrix.com>
src/xenvbd/driver.c
src/xenvbd/driver.h
src/xenvbd/frontend.c
src/xenvbd/frontend.h

index 59b380cc9310622baf0bb2f436bf5f105791301a..2e9ba54a15f010e98f3143b612f6371212a25b8f 100644 (file)
@@ -267,7 +267,8 @@ __DriverInitializeOverrides(
               { "discard-secure", FeatureDiscardSecure },
               { "discard-alignment", FeatureDiscardAlignment },
               { "discard-granularity", FeatureDiscardGranularity },
-              { "max-ring-page-order", FeatureMaxRingPageOrder }
+              { "max-ring-page-order", FeatureMaxRingPageOrder },
+              { "multi-queue-max-queues", FeatureMultiQueueMaxQueues }
           };
 
     for (Index = 0; Index < ARRAYSIZE(Mapping); Index++) {
index d99c09af56e9bce18e7febb31ea68a11c328f016..5a24c4a21eb39f5b939ee3ed4adad40dd2c2fd54 100644 (file)
@@ -80,6 +80,7 @@ typedef enum _XENVBD_FEATURE {
     FeatureDiscardAlignment,
     FeatureDiscardGranularity,
     FeatureMaxRingPageOrder,
+    FeatureMultiQueueMaxQueues,
 
     // Add any new features before this enum
     NumberOfFeatures
index d6b36b4283f7f756321cfadb0962c2672e2f0177..1cb7f0a016ea2dab6c20193ca61b30652bd357a7 100644 (file)
@@ -74,6 +74,8 @@ struct _XENVBD_FRONTEND {
     XENVBD_DISKINFO             DiskInfo;
     XENVBD_PAGE                 Page80;
     XENVBD_PAGE                 Page83;
+    ULONG                       MaxQueues;
+    ULONG                       NumQueues;
 
     // Interfaces to XenBus
     XENBUS_STORE_INTERFACE      StoreInterface;
@@ -109,6 +111,101 @@ __XenvbdStateName(
     default:                        return "UNKNOWN";
     }
 }
+
+
+#define FRONTEND_GET_PROPERTY(_name, _type)     \
+static FORCEINLINE _type                        \
+__FrontendGet ## _name ## (                     \
+    IN  PXENVBD_FRONTEND    Frontend            \
+    )                                           \
+{                                               \
+    return Frontend-> ## _name ## ;             \
+}                                               \
+_type                                           \
+FrontendGet ## _name ## (                       \
+    IN  PXENVBD_FRONTEND    Frontend            \
+    )                                           \
+{                                               \
+    return __FrontendGet ## _name ## (Frontend);\
+}
+
+FRONTEND_GET_PROPERTY(Target, PXENVBD_TARGET)
+FRONTEND_GET_PROPERTY(Ring, PXENVBD_RING)
+FRONTEND_GET_PROPERTY(Granter, PXENVBD_GRANTER)
+FRONTEND_GET_PROPERTY(TargetId, ULONG)
+FRONTEND_GET_PROPERTY(DeviceId, ULONG)
+FRONTEND_GET_PROPERTY(BackendDomain, ULONG)
+FRONTEND_GET_PROPERTY(BackendPath, PCHAR)
+FRONTEND_GET_PROPERTY(FrontendPath, PCHAR)
+//FRONTEND_GET_PROPERTY(Caps, PXENVBD_CAPS)
+PXENVBD_CAPS
+FrontendGetCaps(
+    IN  PXENVBD_FRONTEND    Frontend
+    )
+{
+    return &Frontend->Caps;
+}
+//FRONTEND_GET_PROPERTY(Features, PXENVBD_FEATURES)
+PXENVBD_FEATURES
+FrontendGetFeatures(
+    IN  PXENVBD_FRONTEND    Frontend
+    )
+{
+    return &Frontend->Features;
+}
+//FRONTEND_GET_PROPERTY(DiskInfo, PXENVBD_DISKINFO)
+PXENVBD_DISKINFO
+FrontendGetDiskInfo(
+    IN  PXENVBD_FRONTEND    Frontend
+    )
+{
+    return &Frontend->DiskInfo;
+}
+//FRONTEND_GET_PROPERTY(Connected, BOOLEAN)
+BOOLEAN
+FrontendGetConnected(
+    IN  PXENVBD_FRONTEND    Frontend
+    )
+{
+    return Frontend->Caps.Connected;
+}
+//FRONTEND_GET_PROPERTY(ReadOnly, BOOLEAN)
+BOOLEAN
+FrontendGetReadOnly(
+    IN  PXENVBD_FRONTEND    Frontend
+    )
+{
+    return !!(Frontend->DiskInfo.DiskInfo & VDISK_READONLY);
+}
+//FRONTEND_GET_PROPERTY(Discard, BOOLEAN)
+BOOLEAN
+FrontendGetDiscard(
+    IN  PXENVBD_FRONTEND    Frontend
+    )
+{
+    return Frontend->DiskInfo.Discard;
+}
+//FRONTEND_GET_PROPERTY(FlushCache, BOOLEAN)
+BOOLEAN
+FrontendGetFlushCache(
+    IN  PXENVBD_FRONTEND    Frontend
+    )
+{
+    return Frontend->DiskInfo.FlushCache;
+}
+//FRONTEND_GET_PROPERTY(Barrier, BOOLEAN)
+BOOLEAN
+FrontendGetBarrier(
+    IN  PXENVBD_FRONTEND    Frontend
+    )
+{
+    return Frontend->DiskInfo.Barrier;
+}
+FRONTEND_GET_PROPERTY(MaxQueues, ULONG)
+FRONTEND_GET_PROPERTY(NumQueues, ULONG)
+
+#undef FRONTEND_GET_PROPERTY
+
 //=============================================================================
 #define FRONTEND_POOL_TAG            'tnFX'
 __checkReturn
@@ -1079,6 +1176,38 @@ fail1:
     Error("Fail1 (%08x)\n", Status);
     return Status;
 }
+static VOID
+FrontendSetNumQueues(
+    IN  PXENVBD_FRONTEND    Frontend
+    )
+{
+    PCHAR                   Buffer;
+    ULONG                   BackendMaxQueues;
+    NTSTATUS                status;
+
+    status = XENBUS_STORE(Read,
+                          &Frontend->StoreInterface,
+                          NULL,
+                          __FrontendGetBackendPath(Frontend),
+                          "multi-queue-max-queues",
+                          &Buffer);
+    if (NT_SUCCESS(status)) {
+        BackendMaxQueues = (ULONG)strtoul(Buffer, NULL, 10);
+
+        XENBUS_STORE(Free,
+                     &Frontend->StoreInterface,
+                     Buffer);
+    } else {
+        BackendMaxQueues = 1;
+    }
+
+    Frontend->NumQueues = __min(__FrontendGetMaxQueues(Frontend),
+                                BackendMaxQueues);
+
+    Verbose("Target[%u] NumQueues %u\n",
+            __FrontendGetTargetId(Frontend),
+            Frontend->NumQueues);
+}
 __drv_requiresIRQL(DISPATCH_LEVEL)
 static NTSTATUS
 FrontendConnect(
@@ -1088,6 +1217,8 @@ FrontendConnect(
     NTSTATUS        Status;
     XenbusState     BackendState;
 
+    FrontendSetNumQueues(Frontend);
+
     // Alloc Ring, Create Evtchn, Gnttab map
     Status = GranterConnect(Frontend->Granter);
     if (!NT_SUCCESS(Status))
@@ -1145,6 +1276,16 @@ FrontendConnect(
         if (!NT_SUCCESS(Status))
             goto abort;
 
+        //status = XENBUS_STORE(Printf,
+        //                      &Frontend->StoreInterface,
+        //                      Transaction,
+        //                      Frontend->FrontendPath,
+        //                      "multi-queue-num-queues",
+        //                      "%u",
+        //                      __FrontendGetNumQueues(Frontend));
+        //if (!NT_SUCCESS(status))
+        //    goto abort;
+
         Status = XENBUS_STORE(TransactionEnd,
                               &Frontend->StoreInterface,
                               Transaction,
@@ -1215,6 +1356,7 @@ fail2:
     GranterDisconnect(Frontend->Granter);
 fail1:
     Error("Fail1 (%08x)\n", Status);
+    Frontend->NumQueues = 0;
     return Status;
 }
 __drv_requiresIRQL(DISPATCH_LEVEL)
@@ -1226,6 +1368,8 @@ FrontendDisconnect(
     RingDisconnect(Frontend->Ring);
     GranterDisconnect(Frontend->Granter);
 
+    Frontend->NumQueues = 0;
+
     Base64Free(Frontend->Page80.Data);
     Frontend->Page80.Data = NULL;
     Frontend->Page80.Size = 0;
@@ -1724,6 +1868,29 @@ fail1:
     return status;
 }
 
+static VOID
+FrontendSetMaxQueues(
+    IN  PXENVBD_FRONTEND    Frontend
+    )
+{
+    ULONG                   FrontendMaxQueues;
+
+    Frontend->MaxQueues = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+
+    if (DriverGetFeatureOverride(FeatureMultiQueueMaxQueues,
+                                 &FrontendMaxQueues)) {
+        if (FrontendMaxQueues < Frontend->MaxQueues)
+            Frontend->MaxQueues = FrontendMaxQueues;
+    }
+
+    if (Frontend->MaxQueues == 0)
+        Frontend->MaxQueues = 1;
+
+    Verbose("Target[%u] MaxQueues %u\n",
+            __FrontendGetTargetId(Frontend),
+            Frontend->MaxQueues);
+}
+
 NTSTATUS
 FrontendCreate(
     IN  PXENVBD_TARGET      Target,
@@ -1750,6 +1917,8 @@ FrontendCreate(
     Frontend->State = XENVBD_INITIALIZED;
     Frontend->DiskInfo.SectorSize = 512; // default sector size
     Frontend->BackendDomain = DOMID_INVALID;
+
+    FrontendSetMaxQueues(Frontend);
     
     status = RtlStringCbPrintfA(Frontend->FrontendPath,
                                 sizeof(Frontend->FrontendPath),
@@ -1798,6 +1967,14 @@ fail3:
     Error("fail3\n");
 fail2:
     Error("Fail2\n");
+    Frontend->Target = NULL;
+    Frontend->TargetId = 0;
+    Frontend->DeviceId = 0;
+    Frontend->State = XENVBD_STATE_INVALID; // 0
+    Frontend->DiskInfo.SectorSize = 0;
+    Frontend->BackendDomain = 0;
+    Frontend->MaxQueues = 0;
+    ASSERT(IsZeroMemory(Frontend, sizeof(XENVBD_FRONTEND)));
     __FrontendFree(Frontend);
 fail1:
     Error("Fail1 (%08x)\n", status);
@@ -1822,6 +1999,8 @@ FrontendDestroy(
     Frontend->Page83.Data = NULL;
     Frontend->Page83.Size = 0;
 
+    Frontend->MaxQueues = 0;
+
     ThreadAlert(Frontend->BackendThread);
     ThreadJoin(Frontend->BackendThread);
     Frontend->BackendThread = NULL;
@@ -1838,94 +2017,3 @@ FrontendDestroy(
     __FrontendFree(Frontend);
     Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
 }
-
-#define FRONTEND_GET_PROPERTY(_name, _type)     \
-static FORCEINLINE _type                        \
-__FrontendGet ## _name ## (                     \
-    IN  PXENVBD_FRONTEND    Frontend            \
-    )                                           \
-{                                               \
-    return Frontend-> ## _name ## ;             \
-}                                               \
-_type                                           \
-FrontendGet ## _name ## (                       \
-    IN  PXENVBD_FRONTEND    Frontend            \
-    )                                           \
-{                                               \
-    return __FrontendGet ## _name ## (Frontend);\
-}
-
-FRONTEND_GET_PROPERTY(Target, PXENVBD_TARGET)
-FRONTEND_GET_PROPERTY(Ring, PXENVBD_RING)
-FRONTEND_GET_PROPERTY(Granter, PXENVBD_GRANTER)
-FRONTEND_GET_PROPERTY(TargetId, ULONG)
-FRONTEND_GET_PROPERTY(DeviceId, ULONG)
-FRONTEND_GET_PROPERTY(BackendDomain, ULONG)
-FRONTEND_GET_PROPERTY(BackendPath, PCHAR)
-FRONTEND_GET_PROPERTY(FrontendPath, PCHAR)
-//FRONTEND_GET_PROPERTY(Caps, PXENVBD_CAPS)
-PXENVBD_CAPS
-FrontendGetCaps(
-    IN  PXENVBD_FRONTEND    Frontend
-    )
-{
-    return &Frontend->Caps;
-}
-//FRONTEND_GET_PROPERTY(Features, PXENVBD_FEATURES)
-PXENVBD_FEATURES
-FrontendGetFeatures(
-    IN  PXENVBD_FRONTEND    Frontend
-    )
-{
-    return &Frontend->Features;
-}
-//FRONTEND_GET_PROPERTY(DiskInfo, PXENVBD_DISKINFO)
-PXENVBD_DISKINFO
-FrontendGetDiskInfo(
-    IN  PXENVBD_FRONTEND    Frontend
-    )
-{
-    return &Frontend->DiskInfo;
-}
-//FRONTEND_GET_PROPERTY(Connected, BOOLEAN)
-BOOLEAN
-FrontendGetConnected(
-    IN  PXENVBD_FRONTEND    Frontend
-    )
-{
-    return Frontend->Caps.Connected;
-}
-//FRONTEND_GET_PROPERTY(ReadOnly, BOOLEAN)
-BOOLEAN
-FrontendGetReadOnly(
-    IN  PXENVBD_FRONTEND    Frontend
-    )
-{
-    return !!(Frontend->DiskInfo.DiskInfo & VDISK_READONLY);
-}
-//FRONTEND_GET_PROPERTY(Discard, BOOLEAN)
-BOOLEAN
-FrontendGetDiscard(
-    IN  PXENVBD_FRONTEND    Frontend
-    )
-{
-    return Frontend->DiskInfo.Discard;
-}
-//FRONTEND_GET_PROPERTY(FlushCache, BOOLEAN)
-BOOLEAN
-FrontendGetFlushCache(
-    IN  PXENVBD_FRONTEND    Frontend
-    )
-{
-    return Frontend->DiskInfo.FlushCache;
-}
-//FRONTEND_GET_PROPERTY(Barrier, BOOLEAN)
-BOOLEAN
-FrontendGetBarrier(
-    IN  PXENVBD_FRONTEND    Frontend
-    )
-{
-    return Frontend->DiskInfo.Barrier;
-}
-
-#undef FRONTEND_GET_PROPERTY
index 1488476d11e9b2d3b5377aefb8d8907bf3e559ad..fcf5632996f4031a9fd9390671d85ac70d692037 100644 (file)
@@ -167,6 +167,8 @@ FRONTEND_GET_PROPERTY(ReadOnly, BOOLEAN)
 FRONTEND_GET_PROPERTY(Discard, BOOLEAN)
 FRONTEND_GET_PROPERTY(FlushCache, BOOLEAN)
 FRONTEND_GET_PROPERTY(Barrier, BOOLEAN)
+FRONTEND_GET_PROPERTY(MaxQueues, ULONG)
+FRONTEND_GET_PROPERTY(NumQueues, ULONG)
 
 #undef FRONTEND_GET_PROPERTY