[ros-diffs] [cgutman] 37479: - Queue a work item for each packet instead of looping all packets currently on the work list - Round trip ping time to the loopback adapter is now about 1 ms

cgutman at svn.reactos.org cgutman at svn.reactos.org
Thu Nov 20 01:08:26 CET 2008


Author: cgutman
Date: Wed Nov 19 18:08:26 2008
New Revision: 37479

URL: http://svn.reactos.org/svn/reactos?rev=37479&view=rev
Log:
 - Queue a work item for each packet instead of looping all packets currently on the work list
 - Round trip ping time to the loopback adapter is now about 1 ms

Modified:
    branches/aicom-network-fixes/lib/drivers/ip/network/loopback.c

Modified: branches/aicom-network-fixes/lib/drivers/ip/network/loopback.c
URL: http://svn.reactos.org/svn/reactos/branches/aicom-network-fixes/lib/drivers/ip/network/loopback.c?rev=37479&r1=37478&r2=37479&view=diff
==============================================================================
--- branches/aicom-network-fixes/lib/drivers/ip/network/loopback.c [iso-8859-1] (original)
+++ branches/aicom-network-fixes/lib/drivers/ip/network/loopback.c [iso-8859-1] Wed Nov 19 18:08:26 2008
@@ -22,7 +22,6 @@
 KSPIN_LOCK LoopWorkLock;
 LIST_ENTRY LoopWorkList;
 WORK_QUEUE_ITEM LoopWorkItem;
-BOOLEAN LoopReceiveWorkerBusy = FALSE;
 
 VOID STDCALL LoopReceiveWorker( PVOID Context ) {
     PLIST_ENTRY ListEntry;
@@ -35,46 +34,43 @@
 
     TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
 
-    while( (ListEntry =
-	    ExInterlockedRemoveHeadList( &LoopWorkList, &LoopWorkLock )) ) {
-	WorkItem = CONTAINING_RECORD(ListEntry, LAN_WQ_ITEM, ListEntry);
-
-	TI_DbgPrint(DEBUG_DATALINK, ("WorkItem: %x\n", WorkItem));
-
-	Packet = WorkItem->Packet;
-	Adapter = WorkItem->Adapter;
-	BytesTransferred = WorkItem->BytesTransferred;
-
-	ExFreePool( WorkItem );
-
-        IPPacket.NdisPacket = Packet;
-
-        TI_DbgPrint(DEBUG_DATALINK, ("Packet %x Adapter %x Trans %x\n",
-                                     Packet, Adapter, BytesTransferred));
-
-        NdisGetFirstBufferFromPacket(Packet,
-                                     &NdisBuffer,
-                                     &IPPacket.Header,
-                                     &IPPacket.ContigSize,
-                                     &IPPacket.TotalSize);
-
-	IPPacket.ContigSize = IPPacket.TotalSize = BytesTransferred;
-        /* Determine which upper layer protocol that should receive
-           this packet and pass it to the correct receive handler */
-
-	TI_DbgPrint(MID_TRACE,
-		    ("ContigSize: %d, TotalSize: %d, BytesTransferred: %d\n",
-		     IPPacket.ContigSize, IPPacket.TotalSize,
-		     BytesTransferred));
-
-	IPPacket.Position = 0;
-
-        IPReceive(Loopback, &IPPacket);
-
-	FreeNdisPacket( Packet );
-    }
+    ListEntry = ExInterlockedRemoveHeadList( &LoopWorkList, &LoopWorkLock );
+    WorkItem = CONTAINING_RECORD(ListEntry, LAN_WQ_ITEM, ListEntry);
+
+    TI_DbgPrint(DEBUG_DATALINK, ("WorkItem: %x\n", WorkItem));
+
+    Packet = WorkItem->Packet;
+    Adapter = WorkItem->Adapter;
+    BytesTransferred = WorkItem->BytesTransferred;
+
+    ExFreePool( WorkItem );
+
+    IPPacket.NdisPacket = Packet;
+
+    TI_DbgPrint(DEBUG_DATALINK, ("Packet %x Adapter %x Trans %x\n",
+                                  Packet, Adapter, BytesTransferred));
+
+    NdisGetFirstBufferFromPacket(Packet,
+                                 &NdisBuffer,
+                                 &IPPacket.Header,
+                                 &IPPacket.ContigSize,
+                                 &IPPacket.TotalSize);
+
+    IPPacket.ContigSize = IPPacket.TotalSize = BytesTransferred;
+    /* Determine which upper layer protocol that should receive
+    this packet and pass it to the correct receive handler */
+
+    TI_DbgPrint(MID_TRACE,
+	       ("ContigSize: %d, TotalSize: %d, BytesTransferred: %d\n",
+	         IPPacket.ContigSize, IPPacket.TotalSize,
+		 BytesTransferred));
+
+    IPPacket.Position = 0;
+
+    IPReceive(Loopback, &IPPacket);
+
+    FreeNdisPacket( Packet );
     TI_DbgPrint(DEBUG_DATALINK, ("Leaving\n"));
-    LoopReceiveWorkerBusy = FALSE;
 }
 
 VOID LoopSubmitReceiveWork(
@@ -84,34 +80,19 @@
     UINT BytesTransferred) {
     PLAN_WQ_ITEM WQItem;
     PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
-    KIRQL OldIrql;
-
-    TcpipAcquireSpinLock( &LoopWorkLock, &OldIrql );
 
     WQItem = ExAllocatePool( NonPagedPool, sizeof(LAN_WQ_ITEM) );
-    if( !WQItem ) {
-	TcpipReleaseSpinLock( &LoopWorkLock, OldIrql );
-	return;
-    }
+    if( !WQItem ) return;
 
     WQItem->Packet = Packet;
     WQItem->Adapter = Adapter;
     WQItem->BytesTransferred = BytesTransferred;
-    InsertTailList( &LoopWorkList, &WQItem->ListEntry );
+    ExInterlockedInsertTailList( &LoopWorkList, &WQItem->ListEntry, &LoopWorkLock );
 
     TI_DbgPrint(DEBUG_DATALINK, ("Packet %x Adapter %x BytesTrans %x\n",
                                  Packet, Adapter, BytesTransferred));
 
-    if( !LoopReceiveWorkerBusy ) {
-	LoopReceiveWorkerBusy = TRUE;
-	ExQueueWorkItem( &LoopWorkItem, CriticalWorkQueue );
-	TI_DbgPrint(DEBUG_DATALINK,
-		    ("Work item inserted %x %x\n", &LoopWorkItem, WQItem));
-    } else {
-        TI_DbgPrint(DEBUG_DATALINK,
-                    ("LOOP WORKER BUSY %x %x\n", &LoopWorkItem, WQItem));
-    }
-    TcpipReleaseSpinLock( &LoopWorkLock, OldIrql );
+    ExQueueWorkItem( &LoopWorkItem, CriticalWorkQueue );
 }
 
 VOID LoopTransmit(



More information about the Ros-diffs mailing list