|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 08/10] Stear transmitter packets to queues
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenvif/transmitter.c | 109 +++++++++++++++++++++++++++++++++++++++--------
1 file changed, 92 insertions(+), 17 deletions(-)
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index f1a3e9e..38e9c62 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -3782,6 +3782,96 @@ fail1:
return status;
}
+static FORCEINLINE ULONG
+__TransmitterGetQueue(
+ IN PXENVIF_TRANSMITTER Transmitter,
+ IN PXENVIF_TRANSMITTER_PACKET_V2 Packet
+ )
+{
+ PXENVIF_FRONTEND Frontend;
+
+ Frontend = Transmitter->Frontend;
+
+ // simplistic mod of hash value
+ // this should become a lookup operation using a shared table
+ return (ULONG)(Packet->HashValue % FrontendGetQueueCount(Frontend));
+}
+
+static FORCEINLINE PXENVIF_TRANSMITTER_RING
+__TransmitterGetRing(
+ IN PXENVIF_TRANSMITTER Transmitter,
+ IN ULONG Index
+ )
+{
+ PLIST_ENTRY ListEntry;
+
+ ASSERT3U(Index, <, FrontendGetQueueCount(Transmitter->Frontend));
+
+ for (ListEntry = Transmitter->List.Flink;
+ ListEntry != &Transmitter->List;
+ ListEntry = ListEntry->Flink) {
+ PXENVIF_TRANSMITTER_RING Ring;
+
+ Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING,
ListEntry);
+ if (Ring->Index != Index)
+ continue;
+
+ return Ring;
+ }
+
+ // return queue-0
+ ListEntry = Transmitter->List.Flink;
+ return CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING, ListEntry);
+}
+
+static FORCEINLINE VOID
+__TransmitterQueuePackets(
+ IN PXENVIF_TRANSMITTER Transmitter,
+ IN PLIST_ENTRY List
+ )
+{
+ PXENVIF_FRONTEND Frontend;
+ PLIST_ENTRY ListEntry;
+ PXENVIF_TRANSMITTER_RING Ring;
+
+ Frontend = Transmitter->Frontend;
+
+ if (FrontendGetQueueCount(Frontend) == 1) {
+ ListEntry = Transmitter->List.Flink;
+ Ring = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_RING,
ListEntry);
+
+ __TransmitterRingQueuePackets(Ring, List);
+ } else {
+ while (!IsListEmpty(List)) {
+ LIST_ENTRY SubList;
+ PXENVIF_TRANSMITTER_PACKET_V2 Packet;
+ ULONG Queue;
+
+ InitializeListHead(&SubList);
+
+ Packet = CONTAINING_RECORD(List->Flink,
XENVIF_TRANSMITTER_PACKET_V2, ListEntry);
+ Queue = __TransmitterGetQueue(Transmitter, Packet);
+
+ ListEntry = RemoveHeadList(List);
+ ASSERT3U(ListEntry, !=, List);
+ InsertTailList(&SubList, ListEntry);
+
+ while (!IsListEmpty(List)) {
+ Packet = CONTAINING_RECORD(List->Flink,
XENVIF_TRANSMITTER_PACKET_V2, ListEntry);
+ if (__TransmitterGetQueue(Transmitter, Packet) != Queue)
+ break;
+
+ ListEntry = RemoveHeadList(List);
+ ASSERT3U(ListEntry, !=, List);
+ InsertTailList(&SubList, ListEntry);
+ }
+
+ Ring = __TransmitterGetRing(Transmitter, Queue);
+ __TransmitterRingQueuePackets(Ring, &SubList);
+ }
+ }
+}
+
VOID
TransmitterQueuePacketsV1(
IN PXENVIF_TRANSMITTER Transmitter,
@@ -3798,8 +3888,6 @@ TransmitterQueuePacketsV1(
NULL)
LIST_ENTRY List;
- PLIST_ENTRY ListEntry;
- PXENVIF_TRANSMITTER_RING Ring;
InitializeListHead(&List);
while (HeadPacket != NULL) {
@@ -3828,12 +3916,7 @@ TransmitterQueuePacketsV1(
HeadPacket = HeadPacket->Next;
}
- // 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);
-
- __TransmitterRingQueuePackets(Ring, &List);
+ __TransmitterQueuePackets(Transmitter, &List);
// if HeadPacket != NULL, errors occured and need returning
if (HeadPacket != NULL) {
@@ -3861,15 +3944,7 @@ TransmitterQueuePacketsV2(
IN PLIST_ENTRY List
)
{
- 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);
-
- __TransmitterRingQueuePackets(Ring, List);
+ __TransmitterQueuePackets(Transmitter, List);
}
static BOOLEAN
--
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 |