[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/2] Use new SystemProcessorCount() function for XENBUS_EVTCHN initialization
Since it's necessary in a few places in the EVTCHN code to map processor number to vcpu_id, the available processors should be limited to that for which such a mapping exists. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- include/xen.h | 9 ++++++++- src/xen/system.c | 37 ++++++++++++++++++++++++++++++++++--- src/xenbus/evtchn.c | 17 ++++++++++++----- src/xenbus/evtchn_2l.c | 16 +++++++++++++--- src/xenbus/evtchn_fifo.c | 27 ++++++++++++++++++++------- src/xenbus/shared_info.c | 23 ++++++++++++++++++----- 6 files changed, 105 insertions(+), 24 deletions(-) diff --git a/include/xen.h b/include/xen.h index 23c7ac0..f03635f 100644 --- a/include/xen.h +++ b/include/xen.h @@ -401,8 +401,15 @@ LogPrintf( XEN_API ULONG +SystemProcessorCount( + VOID + ); + +XEN_API +NTSTATUS SystemVirtualCpuIndex( - IN ULONG Index + IN ULONG Index, + OUT unsigned int *vcpu_id ); #endif // _XEN_H diff --git a/src/xen/system.c b/src/xen/system.c index 3905273..65c9d0e 100644 --- a/src/xen/system.c +++ b/src/xen/system.c @@ -666,6 +666,8 @@ SystemProcessorChangeCallback( } Context->Processor = Processor; + KeMemoryBarrier(); + Context->ProcessorCount = ProcessorCount; break; } @@ -972,18 +974,47 @@ fail1: return status; } +static FORCEINLINE ULONG +__SystemProcessorCount( + VOID + ) +{ + PSYSTEM_CONTEXT Context = &SystemContext; + + KeMemoryBarrier(); + + return Context->ProcessorCount; +} + XEN_API ULONG +SystemProcessorCount( + VOID + ) +{ + return __SystemProcessorCount(); +} + +XEN_API +NTSTATUS SystemVirtualCpuIndex( - IN ULONG Index + IN ULONG Index, + OUT unsigned int *vcpu_id ) { PSYSTEM_CONTEXT Context = &SystemContext; PSYSTEM_PROCESSOR Processor = &Context->Processor[Index]; + NTSTATUS status; - ASSERT3U(Index, <, Context->ProcessorCount); + status = STATUS_UNSUCCESSFUL; + if (Index >= __SystemProcessorCount()) + goto fail1; + + *vcpu_id = Processor->ProcessorID; + return STATUS_SUCCESS; - return Processor->ProcessorID; +fail1: + return status; } VOID diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c index 5769cf3..c5c97e4 100644 --- a/src/xenbus/evtchn.c +++ b/src/xenbus/evtchn.c @@ -699,7 +699,9 @@ EvtchnBind( goto done; LocalPort = Channel->LocalPort; - vcpu_id = SystemVirtualCpuIndex(Index); + + status = SystemVirtualCpuIndex(Index, &vcpu_id); + ASSERT(NT_SUCCESS(status)); status = EventChannelBindVirtualCpu(LocalPort, vcpu_id); if (!NT_SUCCESS(status)) @@ -1155,7 +1157,9 @@ EvtchnInterruptEnable( if (Processor->Interrupt == NULL) continue; - vcpu_id = SystemVirtualCpuIndex(Index); + status = SystemVirtualCpuIndex(Index, &vcpu_id); + ASSERT(NT_SUCCESS(status)); + Vector = FdoGetInterruptVector(Context->Fdo, Processor->Interrupt); status = HvmSetEvtchnUpcallVector(vcpu_id, Vector); @@ -1211,7 +1215,8 @@ EvtchnInterruptDisable( if (!Processor->UpcallEnabled) continue; - vcpu_id = SystemVirtualCpuIndex(Index); + status = SystemVirtualCpuIndex(Index, &vcpu_id); + ASSERT(NT_SUCCESS(status)); (VOID) HvmSetEvtchnUpcallVector(vcpu_id, 0); Processor->UpcallEnabled = FALSE; @@ -1434,7 +1439,7 @@ EvtchnAcquire( if (Context->Interrupt == NULL) goto fail8; - Context->ProcessorCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS); + Context->ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS); Context->Processor = __EvtchnAllocate(sizeof (XENBUS_EVTCHN_PROCESSOR) * Context->ProcessorCount); status = STATUS_NO_MEMORY; @@ -1460,7 +1465,9 @@ EvtchnAcquire( ProcNumber.Number, EvtchnInterruptCallback, Context); - ASSERT(Processor->Interrupt != NULL); + + if (Processor->Interrupt == NULL) + continue; InitializeListHead(&Processor->PendingList); diff --git a/src/xenbus/evtchn_2l.c b/src/xenbus/evtchn_2l.c index 249543d..913160f 100644 --- a/src/xenbus/evtchn_2l.c +++ b/src/xenbus/evtchn_2l.c @@ -67,13 +67,23 @@ __EvtchnTwoLevelFree( static BOOLEAN EvtchnTwoLevelIsProcessorEnabled( - IN PXENBUS_EVTCHN_ABI_CONTEXT _Context, - IN ULONG Index + IN PXENBUS_EVTCHN_ABI_CONTEXT _Context, + IN ULONG Index ) { + unsigned int vcpu_id; + NTSTATUS status; + UNREFERENCED_PARAMETER(_Context); - return (SystemVirtualCpuIndex(Index) == 0) ? TRUE : FALSE; + status = SystemVirtualCpuIndex(Index, &vcpu_id); + if (!NT_SUCCESS(status)) + return FALSE; + + if (vcpu_id != 0) + return FALSE; + + return TRUE; } static BOOLEAN diff --git a/src/xenbus/evtchn_fifo.c b/src/xenbus/evtchn_fifo.c index 98ea0fa..91cbd76 100644 --- a/src/xenbus/evtchn_fifo.c +++ b/src/xenbus/evtchn_fifo.c @@ -285,7 +285,12 @@ EvtchnFifoIsProcessorEnabled( ) { PXENBUS_EVTCHN_FIFO_CONTEXT Context = (PVOID)_Context; - unsigned int vcpu_id = SystemVirtualCpuIndex(Index); + unsigned int vcpu_id; + NTSTATUS status; + + status = SystemVirtualCpuIndex(Index, &vcpu_id); + if (!NT_SUCCESS(status)) + return FALSE; return (Context->ControlBlockMdl[vcpu_id] != NULL) ? TRUE : FALSE; } @@ -348,16 +353,21 @@ EvtchnFifoPoll( ) { PXENBUS_EVTCHN_FIFO_CONTEXT Context = (PVOID)_Context; - unsigned int vcpu_id = SystemVirtualCpuIndex(Index); + unsigned int vcpu_id; PMDL Mdl; evtchn_fifo_control_block_t *ControlBlock; ULONG Ready; ULONG Priority; BOOLEAN DoneSomething; - - Mdl = Context->ControlBlockMdl[vcpu_id]; + NTSTATUS status; DoneSomething = FALSE; + + status = SystemVirtualCpuIndex(Index, &vcpu_id); + if (!NT_SUCCESS(status)) + goto done; + + Mdl = Context->ControlBlockMdl[vcpu_id]; if (Mdl == NULL) goto done; @@ -488,7 +498,7 @@ EvtchnFifoAcquire( Trace("====>\n"); Index = 0; - while (Index < (LONG)KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS)) { + while (Index < (LONG)SystemProcessorCount()) { unsigned int vcpu_id; PFN_NUMBER Pfn; PHYSICAL_ADDRESS Address; @@ -499,7 +509,9 @@ EvtchnFifoAcquire( if (Mdl == NULL) goto fail1; - vcpu_id = SystemVirtualCpuIndex(Index); + status = SystemVirtualCpuIndex(Index, &vcpu_id); + ASSERT(NT_SUCCESS(status)); + Pfn = MmGetMdlPfnArray(Mdl)[0]; status = EventChannelInitControl(Pfn, vcpu_id); @@ -537,7 +549,8 @@ fail1: while (--Index >= 0) { unsigned int vcpu_id; - vcpu_id = SystemVirtualCpuIndex(Index); + status = SystemVirtualCpuIndex(Index, &vcpu_id); + ASSERT(NT_SUCCESS(status)); Mdl = Context->ControlBlockMdl[vcpu_id]; Context->ControlBlockMdl[vcpu_id] = NULL; diff --git a/src/xenbus/shared_info.c b/src/xenbus/shared_info.c index 01621ac..9d8bf11 100644 --- a/src/xenbus/shared_info.c +++ b/src/xenbus/shared_info.c @@ -161,8 +161,13 @@ SharedInfoUpcallPending( { PXENBUS_SHARED_INFO_CONTEXT Context = Interface->Context; shared_info_t *Shared = Context->Shared; - int vcpu_id = SystemVirtualCpuIndex(Index); + unsigned int vcpu_id; UCHAR Pending; + NTSTATUS status; + + status = SystemVirtualCpuIndex(Index, &vcpu_id); + if (!NT_SUCCESS(status)) + return FALSE; KeMemoryBarrier(); @@ -181,13 +186,18 @@ SharedInfoEvtchnPoll( { PXENBUS_SHARED_INFO_CONTEXT Context = Interface->Context; shared_info_t *Shared = Context->Shared; - int vcpu_id = SystemVirtualCpuIndex(Index); + unsigned int vcpu_id; ULONG Port; ULONG_PTR SelectorMask; BOOLEAN DoneSomething; + NTSTATUS status; DoneSomething = FALSE; + status = SystemVirtualCpuIndex(Index, &vcpu_id); + if (!NT_SUCCESS(status)) + goto done; + KeMemoryBarrier(); SelectorMask = (ULONG_PTR)InterlockedExchangePointer((PVOID *)&Shared->vcpu_info[vcpu_id].evtchn_pending_sel, (PVOID)0); @@ -233,6 +243,7 @@ SharedInfoEvtchnPoll( Context->Port = Port; +done: return DoneSomething; } @@ -469,14 +480,16 @@ SharedInfoDebugCallback( Index < KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS); Index++) { PROCESSOR_NUMBER ProcNumber; - int vcpu_id; + unsigned int vcpu_id; NTSTATUS status; + status = SystemVirtualCpuIndex(Index, &vcpu_id); + if (!NT_SUCCESS(status)) + continue; + status = KeGetProcessorNumberFromIndex(Index, &ProcNumber); ASSERT(NT_SUCCESS(status)); - vcpu_id = SystemVirtualCpuIndex(Index); - XENBUS_DEBUG(Printf, &Context->DebugInterface, "CPU %u:%u: PENDING: %s\n", -- 2.1.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |