[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH xenbus 4/4] Provide a registry override to disable use of per-vcpu event channel upcalls



From: Paul Durrant <pdurrant@xxxxxxxxxx>

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@xxxxxxxxxx>
---
 src/xenbus/evtchn.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index 46227725e237..f2cd61b175b9 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -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);
-- 
2.17.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.