Index: /trunk/src/VBox/VMM/VMMAll/VMMAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/VMMAll.cpp	(revision 31359)
+++ /trunk/src/VBox/VMM/VMMAll/VMMAll.cpp	(revision 31360)
@@ -61,4 +61,19 @@
         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. */
     RTNATIVETHREAD hThread = RTThreadNativeSelf();
@@ -69,5 +84,5 @@
         PVMCPU pVCpu = &pVM->aCpus[idCpu];
 
-        if (pVCpu->hNativeThreadR0 == hThread)
+        if (pVCpu->hNativeThread == hThread)
             return pVCpu->idCpu;
     }
@@ -100,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();
@@ -108,5 +139,5 @@
         PVMCPU pVCpu = &pVM->aCpus[idCpu];
 
-        if (pVCpu->hNativeThreadR0 == hThread)
+        if (pVCpu->hNativeThread == hThread)
             return pVCpu;
     }
Index: /trunk/src/VBox/VMM/VMMR0/VMMR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/VMMR0.cpp	(revision 31359)
+++ /trunk/src/VBox/VMM/VMMR0/VMMR0.cpp	(revision 31360)
@@ -965,7 +965,4 @@
             PVMCPU pVCpu = &pVM->aCpus[idCpu];
 
-            if (pVCpu->hNativeThreadR0 == NIL_RTNATIVETHREAD)
-                pVCpu->hNativeThreadR0 = RTThreadNativeSelf();
-
             /* Make sure that log flushes can jump back to ring-3; annoying to get an incomplete log (this is risky though as the code doesn't take this into account). */
             int rc = GMMR0CheckSharedModulesStart(pVM);
