]> xenbits.xensource.com Git - pvdrivers/win/xenbus.git/commitdiff
Provide a registry override to disable use of per-vcpu event channel upcalls
authorPaul Durrant <pdurrant@amazon.com>
Wed, 25 Nov 2020 19:24:05 +0000 (19:24 +0000)
committerPaul Durrant <pdurrant@amazon.com>
Fri, 27 Nov 2020 07:53:50 +0000 (07:53 +0000)
There is already a REG_DWORD (UseEvtchnFifoAbi) to disable use of FIFO event
channels and force a fall-back to 2-level. This patch adds another
(UseEvtchnUpcall) to disable use of per-vcpu upcalls and force a fall-back to
the callback via.

Signed-off-by: Paul Durrant <pdurrant@amazon.com>
src/xenbus/evtchn.c

index 46227725e23772f14c569ae1a0db6421050d48d1..f2cd61b175b9b48f0a69e063a09ec10531194d70 100644 (file)
@@ -114,6 +114,7 @@ struct _XENBUS_EVTCHN_CONTEXT {
     PXENBUS_EVTCHN_ABI_CONTEXT      EvtchnFifoContext;
     XENBUS_EVTCHN_ABI               EvtchnAbi;
     BOOLEAN                         UseEvtchnFifoAbi;
+    BOOLEAN                         UseEvtchnUpcall;
     PXENBUS_HASH_TABLE              Table;
     LIST_ENTRY                      List;
 };
@@ -1271,6 +1272,12 @@ EvtchnInterruptEnable(
 
     Trace("====>\n");
 
+    if (!Context->UseEvtchnUpcall)
+    {
+        Info("PER-CPU UPCALL DISABLED\n");
+        goto line;
+    }
+
     for (Cpu = 0; Cpu < Context->ProcessorCount; Cpu++) {
         PXENBUS_EVTCHN_PROCESSOR    Processor;
         unsigned int                vcpu_id;
@@ -1306,6 +1313,7 @@ EvtchnInterruptEnable(
         Processor->UpcallEnabled = TRUE;
     }
 
+line:
     Line = FdoGetInterruptLine(Context->Fdo, Context->Interrupt);
 
     status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, Line);
@@ -1840,6 +1848,7 @@ EvtchnInitialize(
 {
     HANDLE                      ParametersKey;
     ULONG                       UseEvtchnFifoAbi;
+    ULONG                       UseEvtchnUpcall;
     NTSTATUS                    status;
 
     Trace("====>\n");
@@ -1873,6 +1882,14 @@ EvtchnInitialize(
 
     (*Context)->UseEvtchnFifoAbi = (UseEvtchnFifoAbi != 0) ? TRUE : FALSE;
 
+    status = RegistryQueryDwordValue(ParametersKey,
+                                     "UseEvtchnUpcall",
+                                     &UseEvtchnUpcall);
+    if (!NT_SUCCESS(status))
+        UseEvtchnUpcall = 1;
+
+    (*Context)->UseEvtchnUpcall = (UseEvtchnUpcall != 0) ? TRUE : FALSE;
+
     status = SuspendGetInterface(FdoGetSuspendContext(Fdo),
                                  XENBUS_SUSPEND_INTERFACE_VERSION_MAX,
                                  (PINTERFACE)&(*Context)->SuspendInterface,
@@ -2082,6 +2099,7 @@ EvtchnTeardown(
     RtlZeroMemory(&Context->SuspendInterface,
                   sizeof (XENBUS_SUSPEND_INTERFACE));
 
+    Context->UseEvtchnUpcall = FALSE;
     Context->UseEvtchnFifoAbi = FALSE;
 
     EvtchnFifoTeardown(Context->EvtchnFifoContext);