[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 3/7] Move to receiver 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/receiver.c | 134 ++++++++++++++++++++++---------------------------- 1 file changed, 60 insertions(+), 74 deletions(-) diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c index c9e865e..1b81b73 100644 --- a/src/xenvif/receiver.c +++ b/src/xenvif/receiver.c @@ -74,7 +74,6 @@ typedef struct _XENVIF_RECEIVER_FRAGMENT { typedef struct _XENVIF_RECEIVER_RING { PXENVIF_RECEIVER Receiver; - LIST_ENTRY ListEntry; ULONG Index; KSPIN_LOCK Lock; PXENBUS_CACHE PacketCache; @@ -98,7 +97,7 @@ typedef struct _XENVIF_RECEIVER_RING { struct _XENVIF_RECEIVER { PXENVIF_FRONTEND Frontend; XENBUS_CACHE_INTERFACE CacheInterface; - LIST_ENTRY List; + PXENVIF_RECEIVER_RING Rings[MAXIMUM_PROCESSORS]; LONG Loaned; LONG Returned; KEVENT Event; @@ -2360,7 +2359,6 @@ ReceiverInitialize( (*Receiver)->AlwaysPullup = ReceiverAlwaysPullup; } - InitializeListHead(&(*Receiver)->List); KeInitializeEvent(&(*Receiver)->Event, NotificationEvent, FALSE); FdoGetDebugInterface(PdoGetFdo(FrontendGetPdo(Frontend)), @@ -2378,16 +2376,15 @@ ReceiverInitialize( if (!NT_SUCCESS(status)) goto fail2; - Index = 0; - while (Index < Count) { + ASSERT3U(Count, <=, MAXIMUM_PROCESSORS); + for (Index = 0; Index < Count; ++Index) { PXENVIF_RECEIVER_RING Ring; status = __ReceiverRingInitialize(*Receiver, Index, &Ring); if (!NT_SUCCESS(status)) goto fail3; - InsertTailList(&(*Receiver)->List, &Ring->ListEntry); - Index++; + (*Receiver)->Rings[Index] = Ring; } return STATUS_SUCCESS; @@ -2395,22 +2392,17 @@ ReceiverInitialize( fail3: Error("fail3\n"); - while (!IsListEmpty(&(*Receiver)->List)) { - PLIST_ENTRY ListEntry; + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - ListEntry = RemoveTailList(&(*Receiver)->List); - ASSERT3P(ListEntry, !=, &(*Receiver)->List); - - RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY)); + Ring = (*Receiver)->Rings[Index]; + (*Receiver)->Rings[Index] = NULL; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + if (Ring == NULL) + continue; __ReceiverRingTeardown(Ring); - - --Index; } - ASSERT3U(Index, ==, 0); XENBUS_CACHE(Release, &(*Receiver)->CacheInterface); @@ -2429,7 +2421,6 @@ fail2: sizeof (XENBUS_DEBUG_INTERFACE)); RtlZeroMemory(&(*Receiver)->Event, sizeof (KEVENT)); - RtlZeroMemory(&(*Receiver)->List, sizeof (LIST_ENTRY)); (*Receiver)->CalculateChecksums = 0; (*Receiver)->AllowGsoPackets = 0; @@ -2453,7 +2444,7 @@ ReceiverConnect( ) { PXENVIF_FRONTEND Frontend; - PLIST_ENTRY ListEntry; + ULONG Index; NTSTATUS status; Frontend = Receiver->Frontend; @@ -2466,12 +2457,12 @@ ReceiverConnect( if (!NT_SUCCESS(status)) goto fail2; - for (ListEntry = Receiver->List.Flink; - ListEntry != &Receiver->List; - ListEntry = ListEntry->Flink) { + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + Ring = Receiver->Rings[Index]; + if (Ring == NULL) + break; status = __ReceiverRingConnect(Ring); if (!NT_SUCCESS(status)) @@ -2492,22 +2483,17 @@ ReceiverConnect( fail4: Error("fail4\n"); - ListEntry = &Receiver->List; - fail3: Error("fail3\n"); - ListEntry = ListEntry->Blink; - - while (ListEntry != &Receiver->List) { - PLIST_ENTRY Prev = ListEntry->Blink; + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + Ring = Receiver->Rings[Index]; + if (Ring == NULL) + break; __ReceiverRingDisconnect(Ring); - - ListEntry = Prev; } XENBUS_STORE(Release, &Receiver->StoreInterface); @@ -2614,7 +2600,7 @@ ReceiverStoreWrite( ) { PXENVIF_FRONTEND Frontend; - PLIST_ENTRY ListEntry; + ULONG Index; NTSTATUS status; Frontend = Receiver->Frontend; @@ -2657,12 +2643,12 @@ ReceiverStoreWrite( if (!NT_SUCCESS(status)) goto fail5; - for (ListEntry = Receiver->List.Flink; - ListEntry != &Receiver->List; - ListEntry = ListEntry->Flink) { + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + Ring = Receiver->Rings[Index]; + if (Ring == NULL) + break; status = __ReceiverRingStoreWrite(Ring, Transaction); if (!NT_SUCCESS(status)) @@ -2698,17 +2684,17 @@ ReceiverEnable( ) { PXENVIF_FRONTEND Frontend; - PLIST_ENTRY ListEntry; + ULONG Index; NTSTATUS status; Frontend = Receiver->Frontend; - for (ListEntry = Receiver->List.Flink; - ListEntry != &Receiver->List; - ListEntry = ListEntry->Flink) { + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + Ring = Receiver->Rings[Index]; + if (Ring == NULL) + break; status = __ReceiverRingEnable(Ring); if (!NT_SUCCESS(status)) @@ -2720,12 +2706,12 @@ ReceiverEnable( fail1: Error("fail1 (%08x)\n", status); - ListEntry = ListEntry->Blink; - - while (ListEntry != &Receiver->List) { + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + Ring = Receiver->Rings[Index]; + if (Ring == NULL) + break; __ReceiverRingDisable(Ring); } @@ -2738,14 +2724,14 @@ ReceiverDisable( IN PXENVIF_RECEIVER Receiver ) { - PLIST_ENTRY ListEntry; + ULONG Index; - for (ListEntry = Receiver->List.Blink; - ListEntry != &Receiver->List; - ListEntry = ListEntry->Blink) { + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + Ring = Receiver->Rings[Index]; + if (Ring == NULL) + break; __ReceiverRingDisable(Ring); } @@ -2757,7 +2743,7 @@ ReceiverDisconnect( ) { PXENVIF_FRONTEND Frontend; - PLIST_ENTRY ListEntry; + ULONG Index; Frontend = Receiver->Frontend; @@ -2766,12 +2752,12 @@ ReceiverDisconnect( Receiver->DebugCallback); Receiver->DebugCallback = NULL; - for (ListEntry = Receiver->List.Blink; - ListEntry != &Receiver->List; - ListEntry = ListEntry->Blink) { + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + Ring = Receiver->Rings[Index]; + if (Ring == NULL) + break; __ReceiverRingDisconnect(Ring); } @@ -2786,19 +2772,20 @@ ReceiverTeardown( IN PXENVIF_RECEIVER Receiver ) { + ULONG Index; + ASSERT3U(Receiver->Returned, ==, Receiver->Loaned); Receiver->Loaned = 0; Receiver->Returned = 0; - while (!IsListEmpty(&Receiver->List)) { - PLIST_ENTRY ListEntry; + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - ListEntry = RemoveTailList(&Receiver->List); - ASSERT3P(ListEntry, !=, &Receiver->List); - RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY)); + Ring = Receiver->Rings[Index]; + Receiver->Rings[Index] = NULL; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + if (Ring == NULL) + break; __ReceiverRingTeardown(Ring); } @@ -2817,8 +2804,7 @@ ReceiverTeardown( sizeof (XENBUS_DEBUG_INTERFACE)); RtlZeroMemory(&Receiver->Event, sizeof (KEVENT)); - RtlZeroMemory(&Receiver->List, sizeof (LIST_ENTRY)); Receiver->CalculateChecksums = 0; Receiver->AllowGsoPackets = 0; Receiver->DisableIpVersion4Gso = 0; @@ -2836,7 +2822,7 @@ ReceiverSetOffloadOptions( IN XENVIF_VIF_OFFLOAD_OPTIONS Options ) { - PLIST_ENTRY ListEntry; + ULONG Index; if (Receiver->AllowGsoPackets == 0) { Warning("RECEIVER GSO DISALLOWED\n"); @@ -2844,12 +2830,12 @@ ReceiverSetOffloadOptions( Options.OffloadIpVersion6LargePacket = 0; } - for (ListEntry = Receiver->List.Flink; - ListEntry != &Receiver->List; - ListEntry = ListEntry->Flink) { + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + Ring = Receiver->Rings[Index]; + if (Ring == NULL) + break; __ReceiverRingSetOffloadOptions(Ring, Options); } @@ -2939,14 +2925,14 @@ ReceiverNotify( IN PXENVIF_RECEIVER Receiver ) { - PLIST_ENTRY ListEntry; + ULONG Index; - for (ListEntry = Receiver->List.Flink; - ListEntry != &Receiver->List; - ListEntry = ListEntry->Flink) { + for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) { PXENVIF_RECEIVER_RING Ring; - Ring = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_RING, ListEntry); + Ring = Receiver->Rings[Index]; + if (Ring == NULL) + break; __ReceiverRingNotify(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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |