| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH xenvif 1/5] Stop using a threaded DPC in the poller
 The threaded DPC was introduced by commit bc722edd "Don't use KTIMERs in
receive path" but it appears to have too much of an impact on performance.
This patch reverts the poller to a normal DPC but does not introduce any
DPC timeout mitigation. That will be done by a subsequent patch.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 src/xenvif/poller.c | 44 +++++++++++++++++++-------------------------
 1 file changed, 19 insertions(+), 25 deletions(-)
diff --git a/src/xenvif/poller.c b/src/xenvif/poller.c
index cc7e68f..7f18d13 100644
--- a/src/xenvif/poller.c
+++ b/src/xenvif/poller.c
@@ -157,38 +157,42 @@ fail1:
     return status;
 }
 
-static VOID
+static BOOLEAN
 PollerChannelSetPending(
     IN  PXENVIF_POLLER_CHANNEL  Channel
     )
 {
     PXENVIF_POLLER_INSTANCE     Instance;
+    ULONG                       Set;
 
     Instance = Channel->Instance;
 
     switch (Channel->Type)
     {
     case XENVIF_POLLER_CHANNEL_RECEIVER:
-        (VOID) InterlockedBitTestAndSet(&Instance->Pending,
-                                        XENVIF_POLLER_EVENT_RECEIVE);
+        Set = InterlockedBitTestAndSet(&Instance->Pending,
+                                       XENVIF_POLLER_EVENT_RECEIVE);
         break;
 
     case XENVIF_POLLER_CHANNEL_TRANSMITTER:
-        (VOID) InterlockedBitTestAndSet(&Instance->Pending,
-                                        XENVIF_POLLER_EVENT_TRANSMIT);
+        Set = InterlockedBitTestAndSet(&Instance->Pending,
+                                       XENVIF_POLLER_EVENT_TRANSMIT);
         break;
 
     case XENVIF_POLLER_CHANNEL_COMBINED:
-        (VOID) InterlockedBitTestAndSet(&Instance->Pending,
-                                        XENVIF_POLLER_EVENT_RECEIVE);
-        (VOID) InterlockedBitTestAndSet(&Instance->Pending,
+        Set = InterlockedBitTestAndSet(&Instance->Pending,
+                                       XENVIF_POLLER_EVENT_RECEIVE);
+        Set |= InterlockedBitTestAndSet(&Instance->Pending,
                                         XENVIF_POLLER_EVENT_TRANSMIT);
         break;
 
     default:
         ASSERT(FALSE);
+        Set = 0;
         break;
     }
+
+    return (Set != 0) ? FALSE : TRUE;
 }
 
 static FORCEINLINE BOOLEAN
@@ -256,9 +260,8 @@ PollerChannelEvtchnCallback(
 
     Channel->Events++;
 
-    PollerChannelSetPending(Channel);
-
-    if (KeInsertQueueDpc(&Instance->Dpc, NULL, NULL))
+    if (PollerChannelSetPending(Channel) &&
+        KeInsertQueueDpc(&Instance->Dpc, NULL, NULL))
         Instance->Dpcs++;
 
     return TRUE;
@@ -412,7 +415,7 @@ PollerChannelUnmask(
                             FALSE,
                             FALSE);
     if (Pending)
-        PollerChannelSetPending(Channel);
+        (VOID) PollerChannelSetPending(Channel);
 }
 
 static VOID
@@ -538,7 +541,7 @@ done:
 
 __drv_functionClass(KDEFERRED_ROUTINE)
 __drv_maxIRQL(DISPATCH_LEVEL)
-__drv_minIRQL(PASSIVE_LEVEL)
+__drv_minIRQL(DISPATCH_LEVEL)
 __drv_sameIRQL
 static VOID
 PollerInstanceDpc(
@@ -570,11 +573,10 @@ PollerInstanceDpc(
     for (;;) {
         BOOLEAN NeedReceiverPoll;
         BOOLEAN NeedTransmitterPoll;
-        KIRQL   Irql;
 
-        KeAcquireSpinLock(&Instance->Lock, &Irql);
+        KeAcquireSpinLockAtDpcLevel(&Instance->Lock);
         Enabled = Instance->Enabled;
-        KeReleaseSpinLock(&Instance->Lock, Irql);
+        KeReleaseSpinLockFromDpcLevel(&Instance->Lock);
 
         if (!Enabled)
             break;
@@ -596,8 +598,6 @@ PollerInstanceDpc(
 
         if (NeedReceiverPoll)
         {
-            KeRaiseIrql(DISPATCH_LEVEL, &Irql);
-
             ReceiverRetry = ReceiverPoll(FrontendGetReceiver(Frontend),
                                          Instance->Index);
 
@@ -607,14 +607,10 @@ PollerInstanceDpc(
                 (VOID) InterlockedBitTestAndSet(&Instance->Pending,
                                                 XENVIF_POLLER_EVENT_RECEIVE);
             }
-
-            KeLowerIrql(Irql);
         }
 
         if (NeedTransmitterPoll)
         {
-            KeRaiseIrql(DISPATCH_LEVEL, &Irql);
-
             TransmitterRetry = 
TransmitterPoll(FrontendGetTransmitter(Frontend),
                                                Instance->Index);
 
@@ -624,8 +620,6 @@ PollerInstanceDpc(
                 (VOID) InterlockedBitTestAndSet(&Instance->Pending,
                                                 XENVIF_POLLER_EVENT_TRANSMIT);
             }
-
-            KeLowerIrql(Irql);
         }
     }
 
@@ -672,7 +666,7 @@ PollerInstanceInitialize(
 
     KeInitializeSpinLock(&(*Instance)->Lock);
 
-    KeInitializeThreadedDpc(&(*Instance)->Dpc, PollerInstanceDpc, *Instance);
+    KeInitializeDpc(&(*Instance)->Dpc, PollerInstanceDpc, *Instance);
 
     return STATUS_SUCCESS;
 
-- 
2.5.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |