]> xenbits.xensource.com Git - pvdrivers/win/xenbus.git/commitdiff
Eagerly enable and disable interrupts
authorPaul Durrant <paul.durrant@citrix.com>
Mon, 19 Jan 2015 09:54:38 +0000 (09:54 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Tue, 27 Jan 2015 16:12:54 +0000 (16:12 +0000)
There's really no need to lazily enable event channel interrupts. It makes
the code simpler to enable at the end of the first acquire and disable at
the start of the last release.

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

index 0d62cf06448d8e3bce7165e908a626f39a302b83..453f9d606360541783368970a5f0ed85bb5fc3e9 100644 (file)
@@ -93,7 +93,6 @@ struct _XENBUS_EVTCHN_CONTEXT {
     PXENBUS_INTERRUPT               LevelSensitiveInterrupt;
     PXENBUS_INTERRUPT               LatchedInterrupt[MAXIMUM_PROCESSORS];
     KAFFINITY                       Affinity;
-    BOOLEAN                         Enabled;
     XENBUS_SUSPEND_INTERFACE        SuspendInterface;
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackEarly;
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
@@ -127,76 +126,6 @@ __EvtchnFree(
     ExFreePoolWithTag(Buffer, XENBUS_EVTCHN_TAG);
 }
 
-static VOID
-EvtchnInterruptEnable(
-    IN  PXENBUS_EVTCHN_CONTEXT  Context
-    )
-{
-    LONG                        Cpu;
-    ULONG                       Line;
-    NTSTATUS                    status;
-
-    Trace("====>\n");
-
-    ASSERT3U(Context->Affinity, ==, 0);
-
-    Cpu = 0;
-    while (Cpu < KeNumberProcessors) {
-        unsigned int    vcpu_id;
-        UCHAR           Vector;
-
-        vcpu_id = SystemVirtualCpuIndex(Cpu);
-        Vector = FdoGetInterruptVector(Context->Fdo,
-                                       Context->LatchedInterrupt[Cpu]);
-
-        status = HvmSetEvtchnUpcallVector(vcpu_id, Vector);
-        if (NT_SUCCESS(status)) {
-            Info("CPU %u\n", Cpu);
-            Context->Affinity |= (KAFFINITY)1 << Cpu;
-        }
-
-        Cpu++;
-    }
-
-    Line = FdoGetInterruptLine(Context->Fdo,
-                               Context->LevelSensitiveInterrupt);
-
-    status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, Line);
-    ASSERT(NT_SUCCESS(status));
-
-    Trace("<====\n");
-}
-
-static VOID
-EvtchnInterruptDisable(
-    IN  PXENBUS_EVTCHN_CONTEXT  Context
-    )
-{
-    LONG                        Cpu;
-    NTSTATUS                    status;
-
-    UNREFERENCED_PARAMETER(Context);
-
-    Trace("====>\n");
-
-    status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, 0);
-    ASSERT(NT_SUCCESS(status));
-
-    Cpu = KeNumberProcessors;
-    while (--Cpu >= 0) {
-        unsigned int    vcpu_id;
-
-        vcpu_id = SystemVirtualCpuIndex(Cpu);
-
-        (VOID) HvmSetEvtchnUpcallVector(vcpu_id, 0);
-        Context->Affinity &= ~((KAFFINITY)1 << Cpu);
-    }
-
-    ASSERT3U(Context->Affinity, ==, 0);
-
-    Trace("<====\n");
-}
-
 static NTSTATUS
 EvtchnOpenFixed(
     IN  PXENBUS_EVTCHN_CHANNEL  Channel,
@@ -394,14 +323,7 @@ EvtchnOpen(
     Channel->Active = TRUE;
 
     KeAcquireSpinLockAtDpcLevel(&Context->Lock);
-
     InsertTailList(&Context->List, &Channel->ListEntry);
-
-    if (!IsListEmpty(&Context->List) && !Context->Enabled) {
-        EvtchnInterruptEnable(Context);
-        Context->Enabled = TRUE;
-    }
-
     KeReleaseSpinLockFromDpcLevel(&Context->Lock);
 
     KeLowerIrql(Irql);
@@ -466,8 +388,6 @@ EvtchnBind(
     if (Cpu >= (ULONG)KeNumberProcessors)
         goto fail1;
 
-    ASSERT(Context->Enabled);
-
     status = STATUS_NOT_SUPPORTED;
     if (~Context->Affinity & ((KAFFINITY)1 << Cpu))
         goto fail2;
@@ -683,14 +603,7 @@ EvtchnClose(
     KeRaiseIrql(DISPATCH_LEVEL, &Irql); // Prevent suspend
 
     KeAcquireSpinLockAtDpcLevel(&Context->Lock);
-
     RemoveEntryList(&Channel->ListEntry);
-
-    if (IsListEmpty(&Context->List) && Context->Enabled) {
-        EvtchnInterruptDisable(Context);
-        Context->Enabled = FALSE;
-    }
-
     KeReleaseSpinLockFromDpcLevel(&Context->Lock);
 
     RtlZeroMemory(&Channel->ListEntry, sizeof (LIST_ENTRY));
@@ -869,6 +782,76 @@ EvtchnAbiRelease(
     RtlZeroMemory(&Context->EvtchnAbi, sizeof (XENBUS_EVTCHN_ABI));
 }
 
+static VOID
+EvtchnInterruptEnable(
+    IN  PXENBUS_EVTCHN_CONTEXT  Context
+    )
+{
+    LONG                        Cpu;
+    ULONG                       Line;
+    NTSTATUS                    status;
+
+    Trace("====>\n");
+
+    ASSERT3U(Context->Affinity, ==, 0);
+
+    Cpu = 0;
+    while (Cpu < KeNumberProcessors) {
+        unsigned int    vcpu_id;
+        UCHAR           Vector;
+
+        vcpu_id = SystemVirtualCpuIndex(Cpu);
+        Vector = FdoGetInterruptVector(Context->Fdo,
+                                       Context->LatchedInterrupt[Cpu]);
+
+        status = HvmSetEvtchnUpcallVector(vcpu_id, Vector);
+        if (NT_SUCCESS(status)) {
+            Info("CPU %u\n", Cpu);
+            Context->Affinity |= (KAFFINITY)1 << Cpu;
+        }
+
+        Cpu++;
+    }
+
+    Line = FdoGetInterruptLine(Context->Fdo,
+                               Context->LevelSensitiveInterrupt);
+
+    status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, Line);
+    ASSERT(NT_SUCCESS(status));
+
+    Trace("<====\n");
+}
+
+static VOID
+EvtchnInterruptDisable(
+    IN  PXENBUS_EVTCHN_CONTEXT  Context
+    )
+{
+    LONG                        Cpu;
+    NTSTATUS                    status;
+
+    UNREFERENCED_PARAMETER(Context);
+
+    Trace("====>\n");
+
+    status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, 0);
+    ASSERT(NT_SUCCESS(status));
+
+    Cpu = KeNumberProcessors;
+    while (--Cpu >= 0) {
+        unsigned int    vcpu_id;
+
+        vcpu_id = SystemVirtualCpuIndex(Cpu);
+
+        (VOID) HvmSetEvtchnUpcallVector(vcpu_id, 0);
+        Context->Affinity &= ~((KAFFINITY)1 << Cpu);
+    }
+
+    ASSERT3U(Context->Affinity, ==, 0);
+
+    Trace("<====\n");
+}
+
 static VOID
 EvtchnSuspendCallbackEarly(
     IN  PVOID               Argument
@@ -909,10 +892,8 @@ EvtchnSuspendCallbackLate(
     status = EvtchnAbiAcquire(Context);
     ASSERT(NT_SUCCESS(status));
 
-    if (Context->Enabled) {
-        EvtchnInterruptDisable(Context);
-        EvtchnInterruptEnable(Context);
-    }
+    EvtchnInterruptDisable(Context);
+    EvtchnInterruptEnable(Context);
 }
 
 static VOID
@@ -1082,6 +1063,8 @@ EvtchnAcquire(
         Cpu++;
     }
 
+    EvtchnInterruptEnable(Context);
+
     Trace("<====\n");
 
 done:
@@ -1174,6 +1157,8 @@ EvtchnRelease(
     if (!IsListEmpty(&Context->List))
         BUG("OUTSTANDING EVENT CHANNELS");
 
+    EvtchnInterruptDisable(Context);
+
     Cpu = KeNumberProcessors;
     while (--Cpu >= 0) {
         FdoFreeInterrupt(Fdo, Context->LatchedInterrupt[Cpu]);