]> xenbits.xensource.com Git - pvdrivers/win/xenbus.git/commitdiff
Use new SystemProcessorCount() function for XENBUS_EVTCHN initialization 8.1.0-rc8
authorPaul Durrant <paul.durrant@citrix.com>
Wed, 9 Dec 2015 14:35:42 +0000 (14:35 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Wed, 9 Dec 2015 16:02:37 +0000 (16:02 +0000)
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@citrix.com>
include/xen.h
src/xen/system.c
src/xenbus/evtchn.c
src/xenbus/evtchn_2l.c
src/xenbus/evtchn_fifo.c
src/xenbus/shared_info.c

index 6007582c0aaaf1d0984143dd643ec7435b329d04..91a10bbb0de7293d803868ef536cc9339ac4c9c5 100644 (file)
@@ -382,8 +382,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
index 68bef14f9157fffab6860b811da567763f9a6365..c7638973f435a41a8448c0e6cfec8c8e7f931782 100644 (file)
@@ -435,6 +435,8 @@ SystemProcessorChangeCallback(
         }
 
         Context->Processor = Processor;
+        KeMemoryBarrier();
+
         Context->ProcessorCount = ProcessorCount;
         break;
     }
@@ -741,18 +743,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
index 5769cf33554867374298c715c216b975b31e944b..c5c97e421ab189d0538deafd75f46ada9040a656 100644 (file)
@@ -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);
 
index 249543d377af90befba6c609cb41ef4d471a57f4..913160ff591564fdf53181c45661689f720aff7e 100644 (file)
@@ -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
index 98ea0fa0dec5a110bd6408a9335c8e3802230d63..91cbd76a9ac73155c45bba5435fd5b73c74cc303 100644 (file)
@@ -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;
index 01621acf7f9585524fcc3d664c8df93eb369f29e..9d8bf1173732ae86528a5a4fabad1b1976cdfbe4 100644 (file)
@@ -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",