|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] Skip uninitialized CPUs
From: Owen Smith <owen.smith@xxxxxxxxxx>
EvtchnFifoAcquire will loop through all CPUs to call EVTCHNOP_init_control.
Skip any CPUs that are not initialized, which is indicated by
SystemProcessorVcpuId failing, instead of failing the Acquire operation.
This is primarily an issue when KeQueryMaximumProcessorCountEx returns
a different value to KeQueryActiveProcessorCountEx, or the system
processor callback has not been called with KeProcessorAddCompleteNotify
for that CPU.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenbus/evtchn_fifo.c | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/src/xenbus/evtchn_fifo.c b/src/xenbus/evtchn_fifo.c
index a8dab8c..7a74af7 100644
--- a/src/xenbus/evtchn_fifo.c
+++ b/src/xenbus/evtchn_fifo.c
@@ -501,20 +501,21 @@ EvtchnFifoAcquire(
ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
- Index = 0;
- while (Index < ProcessorCount) {
+ for (Index = 0; Index < ProcessorCount; ++Index) {
unsigned int vcpu_id;
PFN_NUMBER Pfn;
PHYSICAL_ADDRESS Address;
+ status = SystemProcessorVcpuId(Index, &vcpu_id);
+ if (status == STATUS_NOT_SUPPORTED)
+ continue;
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
Mdl = __AllocatePage();
status = STATUS_NO_MEMORY;
if (Mdl == NULL)
- goto fail1;
-
- status = SystemProcessorVcpuId(Index, &vcpu_id);
- if (!NT_SUCCESS(status))
goto fail2;
Pfn = MmGetMdlPfnArray(Mdl)[0];
@@ -532,8 +533,6 @@ EvtchnFifoAcquire(
Address.LowPart);
Context->ControlBlockMdl[vcpu_id] = Mdl;
-
- Index++;
}
Trace("<====\n");
@@ -546,11 +545,11 @@ done:
fail3:
Error("fail3\n");
+ __FreePage(Mdl);
+
fail2:
Error("fail2\n");
- __FreePage(Mdl);
-
fail1:
Error("fail1 (%08x)\n", status);
--
2.39.0.windows.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |