[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH xenbus 4/8] Allocate SYSTEM_PROCESSOR array up-front
From: Paul Durrant <pdurrant@xxxxxxxxxx> Most code uses KeQueryMaximumProcessorCountEx() to determine the number of CPUs in the system, so remove the one and only caller of SystemProcessorCount(), remove it from the XEN_API and allocate the array up-front (also using KeQueryMaximumProcessorCountEx()) rather than growing it in response to each processor callback. Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx> --- include/xen.h | 6 --- src/xen/system.c | 110 ++++++++++++++------------------------- src/xenbus/evtchn_fifo.c | 5 +- 3 files changed, 42 insertions(+), 79 deletions(-) diff --git a/include/xen.h b/include/xen.h index fd3bb3ebb4b8..e1ed1178f0d2 100644 --- a/include/xen.h +++ b/include/xen.h @@ -448,12 +448,6 @@ LogRemoveDisposition( // SYSTEM -XEN_API -ULONG -SystemProcessorCount( - VOID - ); - XEN_API NTSTATUS SystemProcessorVcpuId( diff --git a/src/xen/system.c b/src/xen/system.c index 14de3a2de015..5323b3e11b35 100644 --- a/src/xen/system.c +++ b/src/xen/system.c @@ -627,18 +627,6 @@ SystemProcessorTeardown( RtlZeroMemory(Processor->Manufacturer, sizeof (Processor->Manufacturer)); } -static FORCEINLINE ULONG -__SystemProcessorCount( - VOID - ) -{ - PSYSTEM_CONTEXT Context = &SystemContext; - - KeMemoryBarrier(); - - return Context->ProcessorCount; -} - XEN_API NTSTATUS SystemProcessorVcpuId( @@ -651,7 +639,7 @@ SystemProcessorVcpuId( NTSTATUS status; status = STATUS_UNSUCCESSFUL; - if (Cpu >= __SystemProcessorCount()) + if (Cpu >= Context->ProcessorCount) goto fail1; *vcpu_id = Processor->ProcessorID; @@ -673,7 +661,7 @@ SystemProcessorVcpuInfo( NTSTATUS status; status = STATUS_UNSUCCESSFUL; - if (Cpu >= __SystemProcessorCount()) + if (Cpu >= Context->ProcessorCount) goto fail1; ASSERT(*Processor->Registered); @@ -702,7 +690,7 @@ SystemProcessorRegisterVcpuInfo( NTSTATUS status; status = STATUS_UNSUCCESSFUL; - if (Cpu >= __SystemProcessorCount()) + if (Cpu >= Context->ProcessorCount) goto fail1; ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); @@ -840,6 +828,7 @@ SystemProcessorChangeCallback( NTSTATUS status; UNREFERENCED_PARAMETER(Argument); + UNREFERENCED_PARAMETER(Status); Cpu = Change->NtNumber; @@ -852,36 +841,9 @@ 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; @@ -1007,7 +969,7 @@ SystemDeregisterProcessorChangeCallback( KeDeregisterProcessorChangeCallback(Context->ProcessorChangeHandle); Context->ProcessorChangeHandle = NULL; - for (Cpu = 0; Cpu < __SystemProcessorCount(); Cpu++) { + for (Cpu = 0; Cpu < Context->ProcessorCount; Cpu++) { PSYSTEM_PROCESSOR Processor = &Context->Processor[Cpu]; SystemProcessorDeregisterVcpuInfo(Cpu); @@ -1020,10 +982,6 @@ SystemDeregisterProcessorChangeCallback( ASSERT(IsZeroMemory(Processor, sizeof (SYSTEM_PROCESSOR))); } - __SystemFree(Context->Processor); - Context->Processor = NULL; - Context->ProcessorCount = 0; - SystemFreeVcpuInfo(); } @@ -1233,7 +1191,7 @@ SystemCheckProcessors( ULONG Cpu; NTSTATUS status; - for (Cpu = 0; Cpu < __SystemProcessorCount(); Cpu++) + for (Cpu = 0; Cpu < Context->ProcessorCount; Cpu++) { PSYSTEM_PROCESSOR Processor = &Context->Processor[Cpu]; @@ -1271,59 +1229,69 @@ 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; + 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 +1301,13 @@ fail4: fail3: Error("fail3\n"); + __SystemFree(Context->Processor); + fail2: Error("fail2\n"); + Context->ProcessorCount = 0; + fail1: Error("fail1 (%08x)\n", status); @@ -1344,15 +1316,6 @@ fail1: return status; } -XEN_API -ULONG -SystemProcessorCount( - VOID - ) -{ - return __SystemProcessorCount(); -} - XEN_API PHYSICAL_ADDRESS SystemMaximumPhysicalAddress( @@ -1447,6 +1410,9 @@ SystemTeardown( Context->MaximumPhysicalAddress.QuadPart = 0; + __SystemFree(Context->Processor); + Context->ProcessorCount = 0; + (VOID) InterlockedDecrement(&Context->References); ASSERT(IsZeroMemory(Context, sizeof (SYSTEM_CONTEXT))); diff --git a/src/xenbus/evtchn_fifo.c b/src/xenbus/evtchn_fifo.c index 475f99de10d7..3b3f4938ed73 100644 --- a/src/xenbus/evtchn_fifo.c +++ b/src/xenbus/evtchn_fifo.c @@ -487,6 +487,7 @@ EvtchnFifoAcquire( { PXENBUS_EVTCHN_FIFO_CONTEXT Context = (PVOID)_Context; KIRQL Irql; + LONG ProcessorCount; LONG Index; PMDL Mdl; NTSTATUS status; @@ -498,8 +499,10 @@ EvtchnFifoAcquire( Trace("====>\n"); + ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS); + Index = 0; - while (Index < (LONG)SystemProcessorCount()) { + while (Index < ProcessorCount) { unsigned int vcpu_id; PFN_NUMBER Pfn; PHYSICAL_ADDRESS Address; -- 2.17.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |