]> xenbits.xensource.com Git - people/pauldu/xenbus.git/commitdiff
Make registration of vcpu_info conditional lm-fix3
authorPaul Durrant <pdurrant@amazon.com>
Fri, 29 Jan 2021 19:10:55 +0000 (19:10 +0000)
committerPaul Durrant <pdurrant@amazon.com>
Fri, 29 Jan 2021 19:18:06 +0000 (19:18 +0000)
Signed-off-by: Paul Durrant <pdurrant@amazon.com>
src/xen/driver.c
src/xen/driver.h
src/xen/system.c
src/xenbus/evtchn_2l.c
src/xenbus/shared_info.c

index 4670539b488a4b4a6a4e030ba5a948d7175d7be6..3f126eefa8f2e5349dd38cde1017c22663cae078 100644 (file)
@@ -60,6 +60,7 @@
 typedef struct _XEN_DRIVER {
     PLOG_DISPOSITION    XenDisposition;
     PLOG_DISPOSITION    QemuDisposition;
+    HANDLE              ParametersKey;
     HANDLE              UnplugKey;
     HANDLE              MemoryKey;
 } XEN_DRIVER, *PXEN_DRIVER;
@@ -94,6 +95,30 @@ __DriverSafeMode(
     return (*InitSafeBootMode > 0) ? TRUE : FALSE;
 }
 
+static FORCEINLINE VOID
+__DriverSetParametersKey(
+    IN  HANDLE  Key
+    )
+{
+    Driver.ParametersKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetParametersKey(
+    VOID
+    )
+{
+    return Driver.ParametersKey;
+}
+
+HANDLE
+DriverGetParametersKey(
+    VOID
+    )
+{
+    return __DriverGetParametersKey();
+}
+
 static FORCEINLINE VOID
 __DriverSetUnplugKey(
     IN  HANDLE  Key
@@ -504,6 +529,8 @@ DllInitialize(
     if (!NT_SUCCESS(status))
         goto fail4;
 
+    __DriverSetParametersKey(ParametersKey);
+
     status = LogReadLogLevel(ParametersKey,
                              "XenLogLevel",
                              &LogLevel);
@@ -584,8 +611,6 @@ DllInitialize(
     if (!NT_SUCCESS(status))
         goto fail12;
 
-    RegistryCloseKey(ParametersKey);
-
     RegistryCloseKey(ServiceKey);
 
     Trace("<====\n");
@@ -641,6 +666,7 @@ fail5:
     Driver.XenDisposition = NULL;
 
     RegistryCloseKey(ParametersKey);
+    __DriverSetParametersKey(NULL);
 
 fail4:
     Error("fail4\n");
@@ -672,6 +698,7 @@ DllUnload(
 {
     HANDLE  MemoryKey;
     HANDLE  UnplugKey;
+    HANDLE  ParametersKey;
 
     Trace("====>\n");
 
@@ -699,6 +726,11 @@ DllUnload(
     RegistryCloseKey(UnplugKey);
     __DriverSetUnplugKey(NULL);
 
+    ParametersKey = __DriverGetParametersKey();
+
+    RegistryCloseKey(ParametersKey);
+    __DriverSetParametersKey(NULL);
+
     RegistryTeardown();
 
     Info("XEN %d.%d.%d (%d) (%02d.%02d.%04d)\n",
index 8c39735147c6e3067a44d0853eee3ec171f4643d..11b421b10f76a08dcce4af1a2287ec21dad005a3 100644 (file)
 #ifndef _XEN_DRIVER_H
 #define _XEN_DRIVER_H
 
+extern HANDLE
+DriverGetParametersKey(
+    VOID
+    );
+
 extern HANDLE
 DriverGetUnplugKey(
     VOID
index 14de3a2de015b1ae9f1d8ed0e514774b8b77090f..86401ad423406f8bbdf99cc8da6f172440d6f086 100644 (file)
@@ -75,6 +75,7 @@ typedef struct _SYSTEM_CONTEXT {
     PHYSICAL_ADDRESS    MaximumPhysicalAddress;
     BOOLEAN             RealTimeIsUniversal;
     SYSTEM_WATCHDOG     Watchdog;
+    BOOLEAN             RegisterVcpuInfo;
     PMDL                Mdl;
 } SYSTEM_CONTEXT, *PSYSTEM_CONTEXT;
 
@@ -676,11 +677,16 @@ SystemProcessorVcpuInfo(
     if (Cpu >= __SystemProcessorCount())
         goto fail1;
 
+    status = STATUS_NOT_SUPPORTED;
+    if (Processor->Registered == NULL)
+        goto fail2;
+
     ASSERT(*Processor->Registered);
     *Vcpu = Processor->Vcpu;
 
     return STATUS_SUCCESS;
 
+fail2:
 fail1:
     return status;
 }
@@ -701,6 +707,8 @@ SystemProcessorRegisterVcpuInfo(
     PUCHAR              MdlMappedSystemVa;
     NTSTATUS            status;
 
+    ASSERT(Context->RegisterVcpuInfo);
+
     status = STATUS_UNSUCCESSFUL;
     if (Cpu >= __SystemProcessorCount())
         goto fail1;
@@ -768,6 +776,8 @@ SystemProcessorDeregisterVcpuInfo(
     PSYSTEM_CONTEXT     Context = &SystemContext;
     PSYSTEM_PROCESSOR   Processor = &Context->Processor[Cpu];
 
+    ASSERT(Context->RegisterVcpuInfo);
+
     Processor->Vcpu = NULL;
     Processor->Registered = NULL;
 }
@@ -807,9 +817,11 @@ SystemProcessorDpc(
 
     SystemProcessorInitialize(Cpu);
 
-    status = SystemProcessorRegisterVcpuInfo(Cpu, FALSE);
-    if (!NT_SUCCESS(status))
-        goto fail1;
+    if (Context->RegisterVcpuInfo) {
+        status = SystemProcessorRegisterVcpuInfo(Cpu, FALSE);
+        if (!NT_SUCCESS(status))
+            goto fail1;
+    }
 
     Info("<==== (%u:%u)\n", ProcNumber.Group, ProcNumber.Number);
 
@@ -840,6 +852,7 @@ SystemProcessorChangeCallback(
     NTSTATUS                                    status;
 
     UNREFERENCED_PARAMETER(Argument);
+    UNREFERENCED_PARAMETER(Status);
 
     Cpu = Change->NtNumber;
 
@@ -852,36 +865,8 @@ SystemProcessorChangeCallback(
           ProcessorChangeName(Change->State));
 
     switch (Change->State) {
-    case KeProcessorAddStartNotify: {
-        PSYSTEM_PROCESSOR   Processor;
-        ULONG               ProcessorCount;
-
-        if (Cpu < Context->ProcessorCount)
-            break;
-
-        ProcessorCount = Cpu + 1;
-        Processor = __SystemAllocate(sizeof (SYSTEM_PROCESSOR) *
-                                     ProcessorCount);
-
-        if (Processor == NULL) {
-            *Status = STATUS_NO_MEMORY;
-            break;
-        }
-
-        if (Context->ProcessorCount != 0) {
-            RtlCopyMemory(Processor,
-                          Context->Processor,
-                          sizeof (SYSTEM_PROCESSOR) *
-                          Context->ProcessorCount);
-            __SystemFree(Context->Processor);
-        }
-
-        Context->Processor = Processor;
-        KeMemoryBarrier();
-
-        Context->ProcessorCount = ProcessorCount;
+    case KeProcessorAddStartNotify:
         break;
-    }
     case KeProcessorAddCompleteNotify: {
         PSYSTEM_PROCESSOR   Processor;
 
@@ -931,6 +916,8 @@ SystemAllocateVcpuInfo(
     ULONG           Size;
     NTSTATUS        status;
 
+    ASSERT(Context->RegisterVcpuInfo);
+
     Size = sizeof (vcpu_info_t) * HVM_MAX_VCPUS;
     Size += sizeof (BOOLEAN) * HVM_MAX_VCPUS;
     Size = P2ROUNDUP(Size, PAGE_SIZE);
@@ -956,6 +943,8 @@ SystemFreeVcpuInfo(
 {
     PSYSTEM_CONTEXT Context = &SystemContext;
 
+    ASSERT(Context->RegisterVcpuInfo);
+
     DriverPutNamedPages(Context->Mdl);
     Context->Mdl = NULL;
 }
@@ -969,9 +958,11 @@ SystemRegisterProcessorChangeCallback(
     PVOID           Handle;
     NTSTATUS        status;
 
-    status = SystemAllocateVcpuInfo();
-    if (!NT_SUCCESS(status))
-        goto fail1;
+    if (Context->RegisterVcpuInfo) {
+        status = SystemAllocateVcpuInfo();
+        if (!NT_SUCCESS(status))
+            goto fail1;
+    }
 
     Handle = KeRegisterProcessorChangeCallback(SystemProcessorChangeCallback,
                                                NULL,
@@ -988,7 +979,8 @@ SystemRegisterProcessorChangeCallback(
 fail2:
     Error("fail2\n");
 
-    SystemFreeVcpuInfo();
+    if (Context->RegisterVcpuInfo)
+        SystemFreeVcpuInfo();
 
 fail1:
     Error("fail1 (%08x)\n", status);
@@ -1010,7 +1002,9 @@ SystemDeregisterProcessorChangeCallback(
     for (Cpu = 0; Cpu < __SystemProcessorCount(); Cpu++) {
         PSYSTEM_PROCESSOR   Processor = &Context->Processor[Cpu];
 
-        SystemProcessorDeregisterVcpuInfo(Cpu);
+        if (Context->RegisterVcpuInfo)
+            SystemProcessorDeregisterVcpuInfo(Cpu);
+
         SystemProcessorTeardown(Cpu);
 
         RtlZeroMemory(&Processor->Dpc, sizeof (KDPC));
@@ -1020,11 +1014,8 @@ SystemDeregisterProcessorChangeCallback(
         ASSERT(IsZeroMemory(Processor, sizeof (SYSTEM_PROCESSOR)));
     }
 
-    __SystemFree(Context->Processor);
-    Context->Processor = NULL;
-    Context->ProcessorCount = 0;
-
-    SystemFreeVcpuInfo();
+    if (Context->RegisterVcpuInfo)
+        SystemFreeVcpuInfo();
 }
 
 static NTSTATUS
@@ -1263,6 +1254,8 @@ SystemInitialize(
 {
     PSYSTEM_CONTEXT Context = &SystemContext;
     LONG            References;
+    HANDLE          ParametersKey;
+    ULONG           RegisterVcpuInfo;
     NTSTATUS        status;
 
     References = InterlockedIncrement(&Context->References);
@@ -1271,59 +1264,80 @@ SystemInitialize(
     if (References != 1)
         goto fail1;
 
+    Context->ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    Context->Processor = __SystemAllocate(sizeof (SYSTEM_PROCESSOR) * Context->ProcessorCount);
+
+    status = STATUS_NO_MEMORY;
+    if (Context->Processor == NULL)
+        goto fail2;
+    
+    ParametersKey = DriverGetParametersKey();
+
+    status = RegistryQueryDwordValue(ParametersKey,
+                                     "RegisterVcpuInfo",
+                                     &RegisterVcpuInfo);
+    if (NT_SUCCESS(status))
+        Context->RegisterVcpuInfo = (RegisterVcpuInfo != 0) ? TRUE : FALSE;
+    else 
+        Context->RegisterVcpuInfo = (Context->ProcessorCount > XEN_LEGACY_MAX_VCPUS) ?
+                                    TRUE : FALSE;
+
     status = SystemGetStartOptions();
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail3;
 
     status = SystemGetVersionInformation();
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail4;
 
     status = SystemGetMemoryInformation();
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail5;
 
     status = SystemGetAcpiInformation();
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
     status = SystemRegisterProcessorChangeCallback();
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     status = SystemRegisterPowerStateCallback();
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail8;
 
     status = SystemGetTimeInformation();
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail9;
 
     status = SystemCheckProcessors();
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail10;
 
     return STATUS_SUCCESS;
 
+fail10:
+    Error("fail10\n");
+
 fail9:
     Error("fail9\n");
 
+    SystemDeregisterPowerStateCallback();
+
 fail8:
     Error("fail8\n");
 
-    SystemDeregisterPowerStateCallback();
+    SystemDeregisterProcessorChangeCallback();
 
 fail7:
     Error("fail7\n");
 
-    SystemDeregisterProcessorChangeCallback();
+    __SystemFree(Context->Madt);
+    Context->Madt = NULL;
 
 fail6:
     Error("fail6\n");
 
-    __SystemFree(Context->Madt);
-    Context->Madt = NULL;
-
 fail5:
     Error("fail5\n");
 
@@ -1333,9 +1347,13 @@ fail4:
 fail3:
     Error("fail3\n");
 
+    __SystemFree(Context->Processor);
+    
 fail2:
     Error("fail2\n");
 
+    Context->ProcessorCount = 0;
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -1447,6 +1465,9 @@ SystemTeardown(
 
     Context->MaximumPhysicalAddress.QuadPart = 0;
 
+    __SystemFree(Context->Processor);
+    Context->ProcessorCount = 0;
+    
     (VOID) InterlockedDecrement(&Context->References);
 
     ASSERT(IsZeroMemory(Context, sizeof (SYSTEM_CONTEXT)));
index 99a37798932b918a25dea5227184e1d6f50c3fc3..6acf70f29ac4b5790feb2a2e22a47e85c3dbfd9f 100644 (file)
@@ -71,10 +71,22 @@ EvtchnTwoLevelIsProcessorEnabled(
     IN  ULONG                       Index
     )
 {
+    vcpu_info_t                     *Vcpu;
+    unsigned int                    vcpu_id;
+    NTSTATUS                        status;
+
     UNREFERENCED_PARAMETER(_Context);
-    UNREFERENCED_PARAMETER(Index);
 
-    return TRUE;
+    status = SystemProcessorVcpuInfo(Index, &Vcpu);
+    if (NT_SUCCESS(status))
+        return TRUE;
+
+    ASSERT(status == STATUS_NOT_SUPPORTED);
+
+    status = SystemProcessorVcpuId(Index, &vcpu_id);
+    ASSERT(NT_SUCCESS(status));
+
+    return (vcpu_id < XEN_LEGACY_MAX_VCPUS) ? TRUE : FALSE;
 }
 
 static BOOLEAN
index 5ed65be82844cbc895f759c348844ce41659ba82..1bd4cc7bc0417317d94bc27f25375ca8cc51b739 100644 (file)
@@ -643,8 +643,15 @@ SharedInfoAcquire(
             goto fail7;
 
         status = SystemProcessorVcpuInfo(Index, &Processor->Vcpu);
-        if (status != STATUS_NOT_SUPPORTED)
-            goto fail8;
+        if (!NT_SUCCESS(status)) {
+            if (status != STATUS_NOT_SUPPORTED)
+                goto fail8;
+
+            if (Processor->vcpu_id >= XEN_LEGACY_MAX_VCPUS)
+                continue;
+
+            Processor->Vcpu = &Shared->vcpu_info[Processor->vcpu_id];
+        }
     }
 
     Trace("<====\n");