]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Don't bump the receiver event counter if the poller is going to retry
authorPaul Durrant <paul.durrant@citrix.com>
Mon, 6 Aug 2018 12:11:39 +0000 (13:11 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Mon, 6 Aug 2018 12:11:39 +0000 (13:11 +0100)
There is little point in bumping rsp_event (to trigger a new event from
the backend) if the poller is going to retry, so we can save modifying the
shared ring in this case.

This patch also adds extra debug code to the poller to make sure it never
exits from the main loop until either there are no retries pending or
the instance has been disabled.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xenvif/poller.c
src/xenvif/receiver.c

index 6ff2c8ccf33013b903d9163ed89e7b3b1c0ffbf0..cc7e68f7a81befc580561fe3c2bbad270568299b 100644 (file)
@@ -551,6 +551,9 @@ PollerInstanceDpc(
     PXENVIF_POLLER_INSTANCE Instance = Context;
     PXENVIF_POLLER          Poller;
     PXENVIF_FRONTEND        Frontend;
+    BOOLEAN                 Enabled;
+    BOOLEAN                 ReceiverRetry;
+    BOOLEAN                 TransmitterRetry;
 
     UNREFERENCED_PARAMETER(Dpc);
     UNREFERENCED_PARAMETER(Argument1);
@@ -560,9 +563,11 @@ PollerInstanceDpc(
 
     Poller = Instance->Poller;
     Frontend = Poller->Frontend;
+    Enabled = FALSE;
+    ReceiverRetry = FALSE;
+    TransmitterRetry = FALSE;
 
     for (;;) {
-        BOOLEAN Enabled;
         BOOLEAN NeedReceiverPoll;
         BOOLEAN NeedTransmitterPoll;
         KIRQL   Irql;
@@ -591,14 +596,12 @@ PollerInstanceDpc(
 
         if (NeedReceiverPoll)
         {
-            BOOLEAN Retry;
-
             KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
-            Retry = ReceiverPoll(FrontendGetReceiver(Frontend),
-                                 Instance->Index);
+            ReceiverRetry = ReceiverPoll(FrontendGetReceiver(Frontend),
+                                         Instance->Index);
 
-            if (!Retry) {
+            if (!ReceiverRetry) {
                 PollerInstanceUnmask(Instance, XENVIF_POLLER_EVENT_RECEIVE);
             } else {
                 (VOID) InterlockedBitTestAndSet(&Instance->Pending,
@@ -610,14 +613,12 @@ PollerInstanceDpc(
 
         if (NeedTransmitterPoll)
         {
-            BOOLEAN Retry;
-
             KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
-            Retry = TransmitterPoll(FrontendGetTransmitter(Frontend),
-                                    Instance->Index);
+            TransmitterRetry = TransmitterPoll(FrontendGetTransmitter(Frontend),
+                                               Instance->Index);
 
-            if (!Retry) {
+            if (!TransmitterRetry) {
                 PollerInstanceUnmask(Instance, XENVIF_POLLER_EVENT_TRANSMIT);
             } else {
                 (VOID) InterlockedBitTestAndSet(&Instance->Pending,
@@ -627,6 +628,9 @@ PollerInstanceDpc(
             KeLowerIrql(Irql);
         }
     }
+
+    ASSERT(!Enabled || !ReceiverRetry);
+    ASSERT(!Enabled || !TransmitterRetry);
 }
 
 static NTSTATUS
index 6f1fbe58ec942d57c25bbe83b3bdaa000426003b..1f64fabbe3d02d3a90444c1393c827ff26468141 100644 (file)
@@ -1959,6 +1959,9 @@ ReceiverRingPoll(
         TailMdl = NULL;
         EOP = TRUE;
 
+        if (Retry)
+            break;
+
         KeMemoryBarrier();
 
         rsp_prod = Ring->Shared->rsp_prod;
@@ -1966,7 +1969,7 @@ ReceiverRingPoll(
 
         KeMemoryBarrier();
 
-        if (rsp_cons == rsp_prod || Retry)
+        if (rsp_cons == rsp_prod)
             break;
 
         while (rsp_cons != rsp_prod && !Retry) {
@@ -2153,7 +2156,9 @@ ReceiverRingPoll(
         KeMemoryBarrier();
 
         Ring->Front.rsp_cons = rsp_cons;
-        Ring->Shared->rsp_event = rsp_cons + 1;
+        if (!Retry)
+            Ring->Shared->rsp_event = rsp_cons + 1;
+
     }
 
     if (!__ReceiverRingIsStopped(Ring))