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

[win-pv-devel] [PATCH 2/3] Stop caching MaxQueues, NumQueues and Split in Transmitter and Receiver



Just call the Frontend accessor when the values are required.

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 src/xenvif/receiver.c    | 72 +++++++++++++++++++++++---------------------
 src/xenvif/transmitter.c | 77 +++++++++++++++++++++++++-----------------------
 2 files changed, 79 insertions(+), 70 deletions(-)

diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index 36557b7..030f84f 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -111,9 +111,6 @@ struct _XENVIF_RECEIVER {
     XENBUS_GNTTAB_INTERFACE GnttabInterface;
     XENBUS_EVTCHN_INTERFACE EvtchnInterface;
     PXENVIF_RECEIVER_RING   *Ring;
-    LONG                    MaxQueues;
-    LONG                    NumQueues;
-    BOOLEAN                 Split;
     LONG                    Loaned;
     LONG                    Returned;
     KEVENT                  Event;
@@ -1737,10 +1734,12 @@ ReceiverRingDebugCallback(
 {
     PXENVIF_RECEIVER_RING       Ring = Argument;
     PXENVIF_RECEIVER            Receiver;
+    PXENVIF_FRONTEND            Frontend;
 
     UNREFERENCED_PARAMETER(Crashing);
 
     Receiver = Ring->Receiver;
+    Frontend = Receiver->Frontend;
 
     XENBUS_DEBUG(Printf,
                  &Receiver->DebugInterface,
@@ -1779,7 +1778,7 @@ ReceiverRingDebugCallback(
     XENBUS_DEBUG(Printf,
                  &Receiver->DebugInterface,
                  "[%s]: Events = %lu Dpcs = %lu\n",
-                 Receiver->Split ? "RX" : "COMBINED",
+                 FrontendIsSplit(Frontend) ? "RX" : "COMBINED",
                  Ring->Events,
                  Ring->Dpcs);
 }
@@ -2014,7 +2013,7 @@ ReceiverRingDpc(
 
     if (Ring->Enabled) {
         __ReceiverRingNotify(Ring);
-        if (!Receiver->Split)
+        if (!FrontendIsSplit(Frontend))
             TransmitterNotify(FrontendGetTransmitter(Frontend),
                               Ring->Index);
     }
@@ -2441,7 +2440,7 @@ __ReceiverRingStoreWrite(
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;
 
-    Path = (Receiver->NumQueues == 1) ?
+    Path = (FrontendGetNumQueues(Frontend) == 1) ?
            FrontendGetPath(Frontend) :
            Ring->Path;
 
@@ -2465,7 +2464,7 @@ __ReceiverRingStoreWrite(
                           &Receiver->StoreInterface,
                           Transaction,
                           Path,
-                          Receiver->Split ? "event-channel-rx" : 
"event-channel",
+                          FrontendIsSplit(Frontend) ? "event-channel-rx" : 
"event-channel",
                           "%u",
                           Port);
     if (!NT_SUCCESS(status))
@@ -2695,6 +2694,7 @@ ReceiverInitialize(
     )
 {
     HANDLE                  ParametersKey;
+    LONG                    MaxQueues;
     LONG                    Index;
     NTSTATUS                status;
 
@@ -2777,16 +2777,16 @@ ReceiverInitialize(
 
     (*Receiver)->Frontend = Frontend;
 
-    (*Receiver)->MaxQueues = FrontendGetMaxQueues(Frontend);
+    MaxQueues = FrontendGetMaxQueues(Frontend);
     (*Receiver)->Ring = __ReceiverAllocate(sizeof (PXENVIF_RECEIVER_RING) *
-                                           (*Receiver)->MaxQueues);
+                                           MaxQueues);
 
     status = STATUS_NO_MEMORY;
     if ((*Receiver)->Ring == NULL)
         goto fail2;
 
     Index = 0;
-    while (Index < (*Receiver)->MaxQueues) {
+    while (Index < MaxQueues) {
         PXENVIF_RECEIVER_RING   Ring;
 
         status = __ReceiverRingInitialize(*Receiver, Index, &Ring);
@@ -2816,7 +2816,6 @@ fail3:
 fail2:
     Error("fail2\n");
 
-    (*Receiver)->MaxQueues = 0;
     (*Receiver)->Frontend = NULL;
 
     RtlZeroMemory(&(*Receiver)->EvtchnInterface,
@@ -2885,13 +2884,8 @@ ReceiverConnect(
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    Receiver->Split = FrontendIsSplit(Frontend);
-
-    Receiver->NumQueues = FrontendGetNumQueues(Frontend);
-    ASSERT3U(Receiver->NumQueues, <=, Receiver->MaxQueues);
-
     Index = 0;
-    while (Index < Receiver->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         status = __ReceiverRingConnect(Ring);
@@ -2916,7 +2910,7 @@ ReceiverConnect(
 fail7:
     Error("fail7\n");
 
-    Index = Receiver->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
 
 fail6:
     Error("fail6\n");
@@ -2927,8 +2921,6 @@ fail6:
         __ReceiverRingDisconnect(Ring);
     }
 
-    Receiver->NumQueues = 0;
-
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
 fail5:
@@ -3092,7 +3084,7 @@ ReceiverStoreWrite(
         goto fail5;
 
     Index = 0;
-    while (Index < Receiver->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         status = __ReceiverRingStoreWrite(Ring, Transaction);
@@ -3130,13 +3122,16 @@ ReceiverEnable(
     IN  PXENVIF_RECEIVER    Receiver
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
     NTSTATUS                status;
 
     Trace("====>\n");
 
+    Frontend = Receiver->Frontend;
+
     Index = 0;
-    while (Index < Receiver->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         status = __ReceiverRingEnable(Ring);
@@ -3170,11 +3165,14 @@ ReceiverDisable(
     IN  PXENVIF_RECEIVER    Receiver
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
     Trace("====>\n");
 
-    Index = Receiver->NumQueues;
+    Frontend = Receiver->Frontend;
+
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
@@ -3201,16 +3199,13 @@ ReceiverDisconnect(
                  Receiver->DebugCallback);
     Receiver->DebugCallback = NULL;
 
-    Index = Receiver->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         __ReceiverRingDisconnect(Ring);
     }
 
-    Receiver->NumQueues = 0;
-    Receiver->Split = FALSE;
-
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
     XENBUS_CACHE(Release, &Receiver->CacheInterface);
@@ -3229,8 +3224,11 @@ ReceiverTeardown(
     IN  PXENVIF_RECEIVER    Receiver
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
+    Frontend = Receiver->Frontend;
+
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     KeFlushQueuedDpcs();
 
@@ -3238,7 +3236,7 @@ ReceiverTeardown(
     Receiver->Loaned = 0;
     Receiver->Returned = 0;
 
-    Index = Receiver->MaxQueues;
+    Index = FrontendGetMaxQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
@@ -3248,7 +3246,6 @@ ReceiverTeardown(
 
     __ReceiverFree(Receiver->Ring);
     Receiver->Ring = NULL;
-    Receiver->MaxQueues = 0;
 
     Receiver->Frontend = NULL;
 
@@ -3286,15 +3283,20 @@ ReceiverSetOffloadOptions(
     IN  XENVIF_VIF_OFFLOAD_OPTIONS  Options
     )
 {
+    PXENVIF_FRONTEND                Frontend;
     LONG                            Index;
 
+    Frontend = Receiver->Frontend;
+
     if (Receiver->AllowGsoPackets == 0) {
         Warning("RECEIVER GSO DISALLOWED\n");
         Options.OffloadIpVersion4LargePacket = 0;
         Options.OffloadIpVersion6LargePacket = 0;
     }
 
-    for (Index = 0; Index < Receiver->MaxQueues; ++Index) {
+    for (Index = 0;
+         Index < (LONG)FrontendGetMaxQueues(Frontend);
+         ++Index) {
         PXENVIF_RECEIVER_RING   Ring;
 
         Ring = Receiver->Ring[Index];
@@ -3311,11 +3313,16 @@ ReceiverSetBackfillSize(
     IN  ULONG               Size
     )
 {
-    LONG                    Index;
+    PXENVIF_FRONTEND                Frontend;
+    LONG                            Index;
+
+    Frontend = Receiver->Frontend;
 
     ASSERT3U(Size, <, PAGE_SIZE);
 
-    for (Index = 0; Index < Receiver->MaxQueues; ++Index) {
+    for (Index = 0;
+         Index < (LONG)FrontendGetMaxQueues(Frontend);
+         ++Index) {
         PXENVIF_RECEIVER_RING   Ring;
 
         Ring = Receiver->Ring[Index];
@@ -3419,7 +3426,6 @@ ReceiverSend(
 {
     PXENVIF_RECEIVER_RING   Ring;
 
-    ASSERT3U(Index, <, (ULONG)Receiver->NumQueues);
     Ring = Receiver->Ring[Index];
 
     __ReceiverRingSend(Ring, FALSE);
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 615d2d0..35ec80a 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -199,9 +199,6 @@ struct _XENVIF_TRANSMITTER {
     XENBUS_RANGE_SET_INTERFACE  RangeSetInterface;
     XENBUS_EVTCHN_INTERFACE     EvtchnInterface;
     PXENVIF_TRANSMITTER_RING    *Ring;
-    LONG                        MaxQueues;
-    LONG                        NumQueues;
-    BOOLEAN                     Split;
     BOOLEAN                     MulticastControl;
     ULONG                       DisableIpVersion4Gso;
     ULONG                       DisableIpVersion6Gso;
@@ -645,10 +642,12 @@ TransmitterRingDebugCallback(
 {
     PXENVIF_TRANSMITTER_RING    Ring = Argument;
     PXENVIF_TRANSMITTER         Transmitter;
+    PXENVIF_FRONTEND            Frontend;
 
     UNREFERENCED_PARAMETER(Crashing);
 
     Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
 
     XENBUS_DEBUG(Printf,
                  &Transmitter->DebugInterface,
@@ -711,7 +710,7 @@ TransmitterRingDebugCallback(
                  Ring->PacketsSent,
                  Ring->PacketsCompleted);
 
-    if (Transmitter->Split) {
+    if (FrontendIsSplit(Frontend)) {
         // Dump event channel
         XENBUS_DEBUG(Printf,
                      &Transmitter->DebugInterface,
@@ -2498,13 +2497,15 @@ __TransmitterRingSend(
     )
 {
     PXENVIF_TRANSMITTER             Transmitter;
+    PXENVIF_FRONTEND                Frontend;
 
     Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
 
     if (!Ring->Connected)
         return;
 
-    if (Transmitter->Split) {
+    if (FrontendIsSplit(Frontend)) {
         ASSERT(Ring->Channel != NULL);
 
         (VOID) XENBUS_EVTCHN(Send,
@@ -2918,7 +2919,6 @@ TransmitterRingDpc(
     ASSERT(Ring != NULL);
 
     Transmitter = Ring->Transmitter;
-    ASSERT(Transmitter->Split);
 
     if (Ring->Enabled)
         __TransmitterRingNotify(Ring);
@@ -2942,7 +2942,6 @@ TransmitterRingEvtchnCallback(
     ASSERT(Ring != NULL);
 
     Transmitter = Ring->Transmitter;
-    ASSERT(Transmitter->Split);
 
     Ring->Events++;
 
@@ -3289,7 +3288,7 @@ __TransmitterRingConnect(
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
 
-    if (Transmitter->Split) {
+    if (FrontendIsSplit(Frontend)) {
         Ring->Channel = XENBUS_EVTCHN(Open,
                                       &Transmitter->EvtchnInterface,
                                       XENBUS_EVTCHN_TYPE_UNBOUND,
@@ -3461,7 +3460,7 @@ __TransmitterRingStoreWrite(
     Transmitter = Ring->Transmitter;
     Frontend = Transmitter->Frontend;
 
-    Path = (Transmitter->NumQueues == 1) ?
+    Path = (FrontendGetNumQueues(Frontend) == 1) ?
            FrontendGetPath(Frontend) :
            Ring->Path;
 
@@ -3477,7 +3476,7 @@ __TransmitterRingStoreWrite(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    if (!Transmitter->Split)
+    if (!FrontendIsSplit(Frontend))
         goto done;
 
     Port = XENBUS_EVTCHN(GetPort,
@@ -3512,15 +3511,17 @@ __TransmitterRingEnable(
     )
 {
     PXENVIF_TRANSMITTER             Transmitter;
+    PXENVIF_FRONTEND                Frontend;
 
     Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
 
     __TransmitterRingAcquireLock(Ring);
 
     ASSERT(!Ring->Enabled);
     Ring->Enabled = TRUE;
 
-    if (Transmitter->Split &&
+    if (FrontendIsSplit(Frontend) &&
         KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
         Ring->Dpcs++;
 
@@ -3995,6 +3996,7 @@ TransmitterInitialize(
     )
 {
     HANDLE                  ParametersKey;
+    LONG                    MaxQueues;
     LONG                    Index;
     NTSTATUS                status;
 
@@ -4055,16 +4057,16 @@ TransmitterInitialize(
     (*Transmitter)->Frontend = Frontend;
     KeInitializeSpinLock(&(*Transmitter)->Lock);
 
-    (*Transmitter)->MaxQueues = FrontendGetMaxQueues(Frontend);
+    MaxQueues = FrontendGetMaxQueues(Frontend);
     (*Transmitter)->Ring = __TransmitterAllocate(sizeof 
(PXENVIF_TRANSMITTER_RING) *
-                                                 (*Transmitter)->MaxQueues);
+                                                 MaxQueues);
 
     status = STATUS_NO_MEMORY;
     if ((*Transmitter)->Ring == NULL)
         goto fail2;
 
     Index = 0;
-    while (Index < (*Transmitter)->MaxQueues) {
+    while (Index < MaxQueues) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
         status = __TransmitterRingInitialize(*Transmitter, Index, &Ring);
@@ -4093,8 +4095,6 @@ fail3:
 fail2:
     Error("fail2\n");
 
-    (*Transmitter)->MaxQueues = 0;
-
     (*Transmitter)->Frontend = NULL;
 
     RtlZeroMemory(&(*Transmitter)->Lock,
@@ -4208,13 +4208,8 @@ TransmitterConnect(
                      Buffer);
     }
 
-    Transmitter->Split = FrontendIsSplit(Frontend);
-
-    Transmitter->NumQueues = FrontendGetNumQueues(Frontend);
-    ASSERT3U(Transmitter->NumQueues, <=, Transmitter->MaxQueues);
-
     Index = 0;
-    while (Index < Transmitter->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         status = __TransmitterRingConnect(Ring);
@@ -4239,7 +4234,7 @@ TransmitterConnect(
 fail10:
     Error("fail10\n");
 
-    Index = Transmitter->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
 
 fail9:
     Error("fail9\n");
@@ -4252,8 +4247,6 @@ fail9:
         __TransmitterRingDisconnect(Ring);
     }
 
-    Transmitter->NumQueues = 0;
-    Transmitter->Split = FALSE;
     Transmitter->MulticastControl = FALSE;
 
     XENBUS_CACHE(Destroy,
@@ -4323,7 +4316,7 @@ TransmitterStoreWrite(
         goto fail1;
 
     Index = 0;
-    while (Index < Transmitter->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         status = __TransmitterRingStoreWrite(Ring, Transaction);
@@ -4349,12 +4342,15 @@ TransmitterEnable(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
     Trace("====>\n");
 
+    Frontend = Transmitter->Frontend;
+
     Index = 0;
-    while (Index < Transmitter->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         __TransmitterRingEnable(Ring);
@@ -4370,11 +4366,14 @@ TransmitterDisable(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND       Frontend;
     LONG                   Index;
 
     Trace("====>\n");
 
-    Index = Transmitter->NumQueues;
+    Frontend = Transmitter->Frontend;
+
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
@@ -4401,16 +4400,14 @@ TransmitterDisconnect(
                  Transmitter->DebugCallback);
     Transmitter->DebugCallback = NULL;
 
-    Index = Transmitter->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         __TransmitterRingDisconnect(Ring);
     }
 
-    Transmitter->NumQueues = 0;
     Transmitter->MulticastControl = FALSE;
-    Transmitter->Split = FALSE;
 
     XENBUS_CACHE(Destroy,
                  &Transmitter->CacheInterface,
@@ -4437,12 +4434,15 @@ TransmitterTeardown(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
+    Frontend = Transmitter->Frontend;
+
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     KeFlushQueuedDpcs();
 
-    Index = Transmitter->MaxQueues;
+    Index = FrontendGetMaxQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
@@ -4452,7 +4452,6 @@ TransmitterTeardown(
 
     __TransmitterFree(Transmitter->Ring);
     Transmitter->Ring = NULL;
-    Transmitter->MaxQueues = 0;
 
     Transmitter->Frontend = NULL;
 
@@ -4583,10 +4582,12 @@ TransmitterQueuePackets(
 {
     PXENVIF_TRANSMITTER_RING    Ring;
     PXENVIF_FRONTEND            Frontend;
+    LONG                        NumQueues;
 
     Frontend = Transmitter->Frontend;
+    NumQueues = FrontendGetNumQueues(Frontend);
 
-    if (Transmitter->NumQueues == 1) {
+    if (NumQueues == 1) {
         Ring = Transmitter->Ring[0];
 
         __TransmitterRingQueuePackets(Ring, List);
@@ -4610,7 +4611,7 @@ TransmitterQueuePackets(
 
                 Packet = CONTAINING_RECORD(ListEntry, 
XENVIF_TRANSMITTER_PACKET, ListEntry);
 
-                Hash = Packet->Value % Transmitter->NumQueues;
+                Hash = Packet->Value % NumQueues;
                 if (Hash != Index) {
                     if (!IsListEmpty(&HashList)) {
                         Ring = Transmitter->Ring[Index];
@@ -4644,12 +4645,15 @@ TransmitterAbortPackets(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     KIRQL                   Irql;
     LONG                    Index;
 
+    Frontend = Transmitter->Frontend;
+
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
-    Index = Transmitter->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
@@ -4712,7 +4716,6 @@ TransmitterNotify(
 {
     PXENVIF_TRANSMITTER_RING    Ring;
 
-    ASSERT3U(Index, <, (ULONG)Transmitter->NumQueues);
     Ring = Transmitter->Ring[Index];
 
     __TransmitterRingNotify(Ring);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://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®.