]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Remove erroneous use of transmitter DPC
authorPaul Durrant <paul.durrant@citrix.com>
Thu, 2 Jul 2015 10:31:29 +0000 (11:31 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Thu, 2 Jul 2015 10:31:29 +0000 (11:31 +0100)
If the backend does not support split event channels then the transmitter
DPC should not be used, and it contains an assertion to that effect.
The ring enable function, however, unconditionally queues the DPC leading
to an assertion failure. This patch makes sure the DPC is only queued if
the backend does indeed support split event channels.

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

index 1a3e26f218bde87a73d3fd5780206495658bbc86..b833ab6f631f5a7adff89e92cfad8b4dbf6c06ab 100644 (file)
@@ -2683,11 +2683,10 @@ TransmitterRingDpc(
     ASSERT(Ring != NULL);
 
     Transmitter = Ring->Transmitter;
+    ASSERT(Transmitter->Split);
 
-    if (Ring->Enabled) {
-        ASSERT(Transmitter->Split);
+    if (Ring->Enabled)
         __TransmitterRingNotify(Ring);
-    }
 
     __TransmitterRingUnmask(Ring);
 }
@@ -2696,16 +2695,20 @@ KSERVICE_ROUTINE    TransmitterRingEvtchnCallback;
 
 BOOLEAN
 TransmitterRingEvtchnCallback(
-    IN  PKINTERRUPT         InterruptObject,
-    IN  PVOID               Argument
+    IN  PKINTERRUPT             InterruptObject,
+    IN  PVOID                   Argument
     )
 {
     PXENVIF_TRANSMITTER_RING    Ring = Argument;
+    PXENVIF_TRANSMITTER         Transmitter;
 
     UNREFERENCED_PARAMETER(InterruptObject);
 
     ASSERT(Ring != NULL);
 
+    Transmitter = Ring->Transmitter;
+    ASSERT(Transmitter->Split);
+
     Ring->Events++;
 
     if (KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
@@ -3256,12 +3259,17 @@ __TransmitterRingEnable(
     IN  PXENVIF_TRANSMITTER_RING    Ring
     )
 {
+    PXENVIF_TRANSMITTER             Transmitter;
+
+    Transmitter = Ring->Transmitter;
+
     __TransmitterRingAcquireLock(Ring);
 
     ASSERT(!Ring->Enabled);
     Ring->Enabled = TRUE;
 
-    if (KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
+    if (Transmitter->Split &&
+        KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
         Ring->Dpcs++;
 
     __TransmitterRingReleaseLock(Ring);