]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Don't force event channel unmasking
authorPaul Durrant <paul.durrant@citrix.com>
Fri, 2 Nov 2018 11:49:06 +0000 (11:49 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Tue, 6 Nov 2018 09:40:35 +0000 (09:40 +0000)
The effect of efbe65aa "Make use of possible XENBUS_EVTCHN Unmask failure"
was lost when the poller subsystem was reverted. This patch re-instates
equivalent functionality.

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

index 53532943bfd8bb75c21a9fc4b10531e71e82fc25..9c69b770f387d349d966a712816aed719dc74af2 100644 (file)
@@ -1975,19 +1975,22 @@ __ReceiverRingQueuePacket(
     } while (InterlockedCompareExchangePointer(&Ring->PacketQueue, (PVOID)New, (PVOID)Old) != Old);
 }
 
-static DECLSPEC_NOINLINE VOID
+static DECLSPEC_NOINLINE ULONG
 ReceiverRingPoll(
     IN  PXENVIF_RECEIVER_RING   Ring
     )
 {
     PXENVIF_RECEIVER            Receiver;
     PXENVIF_FRONTEND            Frontend;
+    ULONG                       Count;
 
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;
 
+    Count = 0;
+
     if (!Ring->Enabled)
-        return;
+        goto done;
 
     for (;;) {
         BOOLEAN                 Error;
@@ -2044,6 +2047,7 @@ ReceiverRingPoll(
 
             rsp_cons++;
             Ring->ResponsesProcessed++;
+            Count++;
 
             ASSERT3U(id, <=, XENVIF_RECEIVER_MAXIMUM_FRAGMENT_ID);
             Fragment = Ring->Pending[id];
@@ -2216,25 +2220,29 @@ ReceiverRingPoll(
     if (Ring->PacketQueue != NULL &&
         KeInsertQueueDpc(&Ring->QueueDpc, NULL, NULL))
         Ring->QueueDpcs++;
+
+done:
+    return Count;
 }
 
-static FORCEINLINE VOID
+static FORCEINLINE BOOLEAN
 __ReceiverRingUnmask(
-    IN  PXENVIF_RECEIVER_RING   Ring
+    IN  PXENVIF_RECEIVER_RING   Ring,
+    IN  BOOLEAN                 Force
     )
 {
     PXENVIF_RECEIVER            Receiver;
 
     if (!Ring->Connected)
-        return;
+        return TRUE;
 
     Receiver = Ring->Receiver;
 
-    XENBUS_EVTCHN(Unmask,
-                  &Receiver->EvtchnInterface,
-                  Ring->Channel,
-                  FALSE,
-                  TRUE);
+    return !XENBUS_EVTCHN(Unmask,
+                          &Receiver->EvtchnInterface,
+                          Ring->Channel,
+                          FALSE,
+                          Force);
 }
 
 __drv_functionClass(KDEFERRED_ROUTINE)
@@ -2251,6 +2259,7 @@ ReceiverRingPollDpc(
     )
 {
     PXENVIF_RECEIVER_RING   Ring = Context;
+    ULONG                   Count;
 
     UNREFERENCED_PARAMETER(Dpc);
     UNREFERENCED_PARAMETER(Argument1);
@@ -2258,13 +2267,16 @@ ReceiverRingPollDpc(
 
     ASSERT(Ring != NULL);
 
+    Count = 0;
+
     for (;;) {
         __ReceiverRingAcquireLock(Ring);
-        ReceiverRingPoll(Ring);
+        Count += ReceiverRingPoll(Ring);
         __ReceiverRingReleaseLock(Ring);
 
-        __ReceiverRingUnmask(Ring);
-        break;
+        if (__ReceiverRingUnmask(Ring,
+                                 (Count > XENVIF_RECEIVER_RING_SIZE)))
+            break;
     }
 }
 
index 5e53f9a3d34137df10d7acd53905b9dd02ed03d6..34028e7f7cb6e076356b067bb740c275b6d1cc70 100644 (file)
@@ -2614,19 +2614,22 @@ done:
     Ring->PacketsCompleted++;
 }
 
-static DECLSPEC_NOINLINE VOID
+static DECLSPEC_NOINLINE ULONG
 TransmitterRingPoll(
     IN  PXENVIF_TRANSMITTER_RING    Ring
     )
 {
     PXENVIF_TRANSMITTER             Transmitter;
     PXENVIF_FRONTEND                Frontend;
+    ULONG                           Count;
 
     Transmitter = Ring->Transmitter;
     Frontend = Transmitter->Frontend;
 
+    Count = 0;
+
     if (!Ring->Enabled)
-        return;
+        goto done;
 
     for (;;) {
         RING_IDX    rsp_prod;
@@ -2660,6 +2663,7 @@ TransmitterRingPoll(
             rsp = RING_GET_RESPONSE(&Ring->Front, rsp_cons);
             rsp_cons++;
             Ring->ResponsesProcessed++;
+            Count++;
 
             Ring->Stopped = FALSE;
 
@@ -2785,6 +2789,9 @@ TransmitterRingPoll(
 
         Ring->Front.rsp_cons = rsp_cons;
     }
+
+done:
+    return Count;
 }
 
 static FORCEINLINE VOID
@@ -2941,7 +2948,7 @@ TransmitterRingSchedule(
 
         if (Ring->Stopped) {
             if (!Polled) {
-                (VOID) TransmitterRingPoll(Ring);
+                TransmitterRingPoll(Ring);
                 Polled = TRUE;
             }
 
@@ -3212,9 +3219,10 @@ TransmitterRingReleaseLock(
     __TransmitterRingReleaseLock(Ring);
 }
 
-static FORCEINLINE VOID
+static FORCEINLINE BOOLEAN
 __TransmitterRingUnmask(
-    IN  PXENVIF_TRANSMITTER_RING    Ring
+    IN  PXENVIF_TRANSMITTER_RING    Ring,
+    IN  BOOLEAN                     Force
     )
 {
     PXENVIF_TRANSMITTER             Transmitter;
@@ -3224,13 +3232,13 @@ __TransmitterRingUnmask(
     Frontend = Transmitter->Frontend;
 
     if (!Ring->Connected || !FrontendIsSplit(Frontend))
-        return;
+        return TRUE;
 
-    XENBUS_EVTCHN(Unmask,
-                  &Transmitter->EvtchnInterface,
-                  Ring->Channel,
-                  FALSE,
-                  TRUE);
+    return !XENBUS_EVTCHN(Unmask,
+                          &Transmitter->EvtchnInterface,
+                          Ring->Channel,
+                          FALSE,
+                          Force);
 }
 
 __drv_functionClass(KDEFERRED_ROUTINE)
@@ -3247,6 +3255,7 @@ TransmitterRingPollDpc(
     )
 {
     PXENVIF_TRANSMITTER_RING    Ring = Context;
+    ULONG                       Count;
 
     UNREFERENCED_PARAMETER(Dpc);
     UNREFERENCED_PARAMETER(Argument1);
@@ -3254,13 +3263,16 @@ TransmitterRingPollDpc(
 
     ASSERT(Ring != NULL);
 
+    Count = 0;
+
     for (;;) {
         __TransmitterRingAcquireLock(Ring);
-        TransmitterRingPoll(Ring);
+        Count += TransmitterRingPoll(Ring);
         __TransmitterRingReleaseLock(Ring);
 
-        __TransmitterRingUnmask(Ring);
-        break;
+        if (__TransmitterRingUnmask(Ring,
+                                    (Count > XENVIF_TRANSMITTER_RING_SIZE)))
+            break;
     }
 }