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

[win-pv-devel] [PATCH 2/7] Move to transmitter ring pointer array



Replace the list of rings with a maximally sized array of pointers.

Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
 src/xenvif/transmitter.c | 141 ++++++++++++++++++++---------------------------
 1 file changed, 61 insertions(+), 80 deletions(-)

diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 8125a5a..645872b 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -106,7 +106,6 @@ typedef struct _XENVIF_TRANSMITTER_PACKET_LIST {
 
 typedef struct _XENVIF_TRANSMITTER_RING {
     PXENVIF_TRANSMITTER             Transmitter;
-    LIST_ENTRY                      ListEntry;
     ULONG                           Index;
     PXENBUS_CACHE                   BufferCache;
     PXENBUS_CACHE                   FragmentCache;
@@ -146,7 +145,7 @@ struct _XENVIF_TRANSMITTER {
     PXENVIF_FRONTEND            Frontend;
     XENBUS_CACHE_INTERFACE      CacheInterface;
     XENBUS_RANGE_SET_INTERFACE  RangeSetInterface;
-    LIST_ENTRY                  List;
+    PXENVIF_TRANSMITTER_RING    Rings[MAXIMUM_PROCESSORS];
     LONG_PTR                    Offset[XENVIF_TRANSMITTER_PACKET_OFFSET_COUNT];
     ULONG                       DisableIpVersion4Gso;
     ULONG                       DisableIpVersion6Gso;
@@ -3240,8 +3239,6 @@ TransmitterInitialize(
             (*Transmitter)->AlwaysCopy = TransmitterAlwaysCopy;
     }
 
-    InitializeListHead(&(*Transmitter)->List);
-
     FdoGetDebugInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
                          &(*Transmitter)->DebugInterface);
 
@@ -3264,16 +3261,15 @@ TransmitterInitialize(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    Index = 0;
-    while (Index < Count) {
+    ASSERT3U(Count, <=, MAXIMUM_PROCESSORS);
+    for (Index = 0; Index < Count; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
         status = __TransmitterRingInitialize(*Transmitter, Index, &Ring);
         if (!NT_SUCCESS(status))
             goto fail4;
 
-        InsertTailList(&(*Transmitter)->List, &Ring->ListEntry);
-        Index++;
+        (*Transmitter)->Rings[Index] = Ring;
     }
 
     return STATUS_SUCCESS;
@@ -3281,21 +3277,17 @@ TransmitterInitialize(
 fail4:
     Error("fail4\n");
 
-    while (!IsListEmpty(&(*Transmitter)->List)) {
-        PLIST_ENTRY                 ListEntry;
+    for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
-        ListEntry = RemoveTailList(&(*Transmitter)->List);
-        ASSERT3P(ListEntry, !=, &(*Transmitter)->List);
-
-        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+        Ring = (*Transmitter)->Rings[Index];
+        (*Transmitter)->Rings[Index] = NULL;
 
-        Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, 
ListEntry);
+        if (Ring == NULL)
+            continue;
 
         __TransmitterRingTeardown(Ring);
-        --Index;
     }
-    ASSERT3U(Index, ==, 0);
 
     XENBUS_CACHE(Release, &(*Transmitter)->CacheInterface);
 
@@ -3321,8 +3313,6 @@ fail2:
     RtlZeroMemory(&(*Transmitter)->DebugInterface,
                   sizeof (XENBUS_DEBUG_INTERFACE));
 
-    RtlZeroMemory(&(*Transmitter)->List, sizeof (LIST_ENTRY));
-
     (*Transmitter)->DisableIpVersion4Gso = 0;
     (*Transmitter)->DisableIpVersion6Gso = 0;
     (*Transmitter)->AlwaysCopy = 0;
@@ -3342,7 +3332,7 @@ TransmitterConnect(
     )
 {
     PXENVIF_FRONTEND            Frontend;
-    PLIST_ENTRY                 ListEntry;
+    ULONG                       Index;
     NTSTATUS                    status;
 
     Frontend = Transmitter->Frontend;
@@ -3355,12 +3345,12 @@ TransmitterConnect(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    for (ListEntry = Transmitter->List.Flink;
-         ListEntry != &Transmitter->List;
-         ListEntry = ListEntry->Flink) {
+    for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
-        Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, 
ListEntry);
+        Ring = Transmitter->Rings[Index];
+        if (Ring == NULL)
+            break;
 
         status = __TransmitterRingConnect(Ring);
         if (!NT_SUCCESS(status))
@@ -3381,22 +3371,17 @@ TransmitterConnect(
 fail4:
     Error("fail4\n");
 
-    ListEntry = &Transmitter->List;
-
 fail3:
     Error("fail3\n");
 
-    ListEntry = ListEntry->Blink;
-
-    while (ListEntry != &Transmitter->List) {
-        PLIST_ENTRY                 Prev = ListEntry->Blink;
+    for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
-        Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, 
ListEntry);
+        Ring = Transmitter->Rings[Index];
+        if (Ring == NULL)
+            continue;
 
         __TransmitterRingDisconnect(Ring);
-
-        ListEntry = Prev;
     }
 
     XENBUS_STORE(Release, &Transmitter->StoreInterface);
@@ -3418,15 +3403,15 @@ TransmitterStoreWrite(
     IN  PXENBUS_STORE_TRANSACTION   Transaction
     )
 {
-    PLIST_ENTRY                     ListEntry;
     NTSTATUS                        status;
+    ULONG                   Index;
 
-    for (ListEntry = Transmitter->List.Flink;
-         ListEntry != &Transmitter->List;
-         ListEntry = ListEntry->Flink) {
+    for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
-        Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, 
ListEntry);
+        Ring = Transmitter->Rings[Index];
+        if (Ring == NULL)
+            break;
 
         status = __TransmitterRingStoreWrite(Ring, Transaction);
         if (!NT_SUCCESS(status))
@@ -3446,14 +3431,14 @@ TransmitterEnable(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
-    PLIST_ENTRY             ListEntry;
+    ULONG                   Index;
 
-    for (ListEntry = Transmitter->List.Flink;
-         ListEntry != &Transmitter->List;
-         ListEntry = ListEntry->Flink) {
+    for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
-        Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, 
ListEntry);
+        Ring = Transmitter->Rings[Index];
+        if (Ring == NULL)
+            break;
 
         __TransmitterRingEnable(Ring);
     }    
@@ -3466,14 +3451,14 @@ TransmitterDisable(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
-    PLIST_ENTRY             ListEntry;
+    ULONG                   Index;
 
-    for (ListEntry = Transmitter->List.Blink;
-         ListEntry != &Transmitter->List;
-         ListEntry = ListEntry->Blink) {
+    for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
-        Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, 
ListEntry);
+        Ring = Transmitter->Rings[Index];
+        if (Ring == NULL)
+            break;
 
         __TransmitterRingDisable(Ring);
     }
@@ -3485,7 +3470,7 @@ TransmitterDisconnect(
     )
 {
     PXENVIF_FRONTEND        Frontend;
-    PLIST_ENTRY             ListEntry;
+    ULONG                   Index;
 
     Frontend = Transmitter->Frontend;
 
@@ -3494,12 +3479,12 @@ TransmitterDisconnect(
                  Transmitter->DebugCallback);
     Transmitter->DebugCallback = NULL;
 
-    for (ListEntry = Transmitter->List.Blink;
-         ListEntry != &Transmitter->List;
-         ListEntry = ListEntry->Blink) {
+    for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
-        Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, 
ListEntry);
+        Ring = Transmitter->Rings[Index];
+        if (Ring == NULL)
+            break;
 
         __TransmitterRingDisconnect(Ring);
     }
@@ -3514,18 +3499,19 @@ TransmitterTeardown(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    ULONG                   Index;
+
     RtlZeroMemory(Transmitter->Offset,
                   sizeof (LONG_PTR) *  
XENVIF_TRANSMITTER_PACKET_OFFSET_COUNT); 
 
-    while (!IsListEmpty(&Transmitter->List)) {
-        PLIST_ENTRY                 ListEntry;
+    for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
-        ListEntry = RemoveHeadList(&Transmitter->List);
-        ASSERT3P(ListEntry, !=, &Transmitter->List);
-        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+        Ring = Transmitter->Rings[Index];
+        Transmitter->Rings[Index] = NULL;
 
-        Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, 
ListEntry);
+        if (Ring == NULL)
+            continue;
 
         __TransmitterRingTeardown(Ring);
     }
@@ -3548,8 +3534,6 @@ TransmitterTeardown(
     RtlZeroMemory(&Transmitter->DebugInterface,
                   sizeof (XENBUS_DEBUG_INTERFACE));
 
-    RtlZeroMemory(&Transmitter->List, sizeof (LIST_ENTRY));
-
     Transmitter->DisableIpVersion4Gso = 0;
     Transmitter->DisableIpVersion6Gso = 0;
     Transmitter->AlwaysCopy = 0;
@@ -3566,15 +3550,14 @@ TransmitterUpdateAddressTable(
     )
 {
     KIRQL                       Irql;
-    PLIST_ENTRY                 ListEntry;
     PXENVIF_TRANSMITTER_RING    Ring;
 
     // Make sure we don't suspend
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
     // Use the first ring for address advertisment
-    ListEntry = Transmitter->List.Flink;
-    Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, ListEntry);
+    Ring = Transmitter->Rings[0];
+    ASSERT3U(Ring, !=, NULL);
 
     __TransmitterRingUpdateAddressTable(Ring, Table, Count);
 
@@ -3586,12 +3569,11 @@ TransmitterAdvertiseAddresses(
     IN  PXENVIF_TRANSMITTER     Transmitter
     )
 {
-    PLIST_ENTRY                 ListEntry;
     PXENVIF_TRANSMITTER_RING    Ring;
 
     // Use the first ring for address advertisment
-    ListEntry = Transmitter->List.Flink;
-    Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, ListEntry);
+    Ring = Transmitter->Rings[0];
+    ASSERT3U(Ring, !=, NULL);
 
     __TransmitterRingAdvertiseAddresses(Ring);
 }
@@ -3625,13 +3607,12 @@ TransmitterQueuePackets(
     IN  PXENVIF_TRANSMITTER_PACKET  HeadPacket
     )
 {
-    PLIST_ENTRY                     ListEntry;
     PXENVIF_TRANSMITTER_RING        Ring;
 
     // We need to hash for a ring eventually. Since there is only a
     // single ring for now, we just use that.
-    ListEntry = Transmitter->List.Flink;
-    Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, ListEntry);
+    Ring = Transmitter->Rings[0];
+    ASSERT3P(Ring, !=, NULL);
 
     __TransmitterRingQueuePackets(Ring, HeadPacket);
 }
@@ -3641,17 +3622,17 @@ TransmitterAbortPackets(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
-    PLIST_ENTRY             ListEntry;
+    ULONG                   Index;
     KIRQL                   Irql;
 
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
-    for (ListEntry = Transmitter->List.Flink;
-         ListEntry != &Transmitter->List;
-         ListEntry = ListEntry->Flink) {
+    for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
-        Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, 
ListEntry);
+        Ring = Transmitter->Rings[Index];
+        if (Ring == NULL)
+            break;
 
         __TransmitterRingAbortPackets(Ring);
     }    
@@ -3675,14 +3656,14 @@ TransmitterNotify(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
-    PLIST_ENTRY             ListEntry;
+    ULONG                   Index;
 
-    for (ListEntry = Transmitter->List.Flink;
-         ListEntry != &Transmitter->List;
-         ListEntry = ListEntry->Flink) {
+    for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
-        Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, 
ListEntry);
+        Ring = Transmitter->Rings[Index];
+        if (Ring == NULL)
+            break;
 
         __TransmitterRingNotify(Ring);
     }    
-- 
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


 


Rackspace

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