Index: /trunk/src/VBox/VMM/VMMAll/VMMAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/VMMAll.cpp	(revision 31355)
+++ /trunk/src/VBox/VMM/VMMAll/VMMAll.cpp	(revision 31356)
@@ -27,4 +27,5 @@
 #include <VBox/param.h>
 #include <iprt/thread.h>
+#include <iprt/mp.h>
 
 
@@ -59,4 +60,19 @@
     if (pVM->cCpus == 1)
         return 0;
+
+    /* Search first by host cpu id (most common case)
+     * and then by native thread id (page fusion case).
+     */
+    /* RTMpCpuId had better be cheap. */ 
+    RTCPUID idHostCpu = RTMpCpuId(); 
+
+    /** @todo optimize for large number of VCPUs when that becomes more common. */
+    for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
+    {
+        PVMCPU pVCpu = &pVM->aCpus[idCpu];
+
+        if (pVCpu->idHostCpu == idHostCpu)
+            return pVCpu->idCpu;
+    }
 
     /* RTThreadGetNativeSelf had better be cheap. */
@@ -99,4 +115,20 @@
         return &pVM->aCpus[0];
 
+    /* Search first by host cpu id (most common case)
+     * and then by native thread id (page fusion case).
+     */
+
+    /* RTMpCpuId had better be cheap. */ 
+    RTCPUID idHostCpu = RTMpCpuId(); 
+
+    /** @todo optimize for large number of VCPUs when that becomes more common. */
+    for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
+    {
+        PVMCPU pVCpu = &pVM->aCpus[idCpu];
+
+        if (pVCpu->idHostCpu == idHostCpu)
+            return pVCpu;
+    }
+
     /* RTThreadGetNativeSelf had better be cheap. */
     RTNATIVETHREAD hThread = RTThreadNativeSelf();
