Index: trunk/include/VBox/em.h
===================================================================
--- trunk/include/VBox/em.h	(revision 19681)
+++ trunk/include/VBox/em.h	(revision 19682)
@@ -181,4 +181,6 @@
 VMMR3DECL(int)      EMR3Interpret(PVM pVM);
 
+VMMR3DECL(void)     EMR3ReleaseOwnedLocks(PVM pVM);
+
 /**
  * Command argument for EMR3RawSetMode().
Index: trunk/include/VBox/iom.h
===================================================================
--- trunk/include/VBox/iom.h	(revision 19681)
+++ trunk/include/VBox/iom.h	(revision 19682)
@@ -264,4 +264,7 @@
                                     RCPTRTYPE(PFNIOMMMIOFILL)  pfnFillCallback);
 VMMR3DECL(int)  IOMR3MMIODeregister(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange);
+
+VMMR3DECL(void) IOMR3ReleaseOwnedLocks(PVM pVM);
+
 /** @} */
 #endif /* IN_RING3 */
Index: trunk/include/VBox/mm.h
===================================================================
--- trunk/include/VBox/mm.h	(revision 19681)
+++ trunk/include/VBox/mm.h	(revision 19682)
@@ -253,5 +253,5 @@
 
 VMMR3DECL(int)      MMR3HCPhys2HCVirt(PVM pVM, RTHCPHYS HCPhys, void **ppv);
-
+VMMR3DECL(void)     MMR3ReleaseOwnedLocks(PVM pVM);
 
 /** @defgroup grp_mm_r3_hyper  Hypervisor Memory Manager (HC R3 Portion)
Index: trunk/include/VBox/pdmapi.h
===================================================================
--- trunk/include/VBox/pdmapi.h	(revision 19681)
+++ trunk/include/VBox/pdmapi.h	(revision 19682)
@@ -115,4 +115,5 @@
 VMMR3DECL(int)  PDMR3UnregisterVMMDevHeap(PVM pVM, RTGCPHYS GCPhys);
 
+VMMR3DECL(void) PDMR3ReleaseOwnedLocks(PVM pVM);
 /** @} */
 #endif
Index: trunk/include/VBox/pgm.h
===================================================================
--- trunk/include/VBox/pgm.h	(revision 19681)
+++ trunk/include/VBox/pgm.h	(revision 19682)
@@ -551,4 +551,7 @@
 VMMR3DECL(int)      PGMR3PhysAllocateHandyPages(PVM pVM);
 
+
+VMMR3DECL(void)     PGMR3ReleaseOwnedLocks(PVM pVM);
+
 VMMR3DECL(int)      PGMR3CheckIntegrity(PVM pVM);
 
Index: trunk/src/VBox/VMM/EM.cpp
===================================================================
--- trunk/src/VBox/VMM/EM.cpp	(revision 19681)
+++ trunk/src/VBox/VMM/EM.cpp	(revision 19682)
@@ -3595,4 +3595,15 @@
 }
 
+/**
+ * Release the IOM lock if owned by the current VCPU
+ *
+ * @param   pVM         The VM to operate on.
+ */
+VMMR3DECL(void) EMR3ReleaseOwnedLocks(PVM pVM)
+{
+    if (PDMCritSectIsOwner(&pVM->em.s.CritSectREM))
+        PDMCritSectLeave(&pVM->em.s.CritSectREM);
+}
+
 
 /**
Index: trunk/src/VBox/VMM/IOM.cpp
===================================================================
--- trunk/src/VBox/VMM/IOM.cpp	(revision 19681)
+++ trunk/src/VBox/VMM/IOM.cpp	(revision 19682)
@@ -1641,4 +1641,16 @@
     iomR3FlushCache(pVM);
     return VINF_SUCCESS;
+}
+
+
+/**
+ * Release the IOM lock if owned by the current VCPU
+ *
+ * @param   pVM         The VM to operate on.
+ */
+VMMR3DECL(void) IOMR3ReleaseOwnedLocks(PVM pVM)
+{
+    if (PDMCritSectIsOwner(&pVM->iom.s.EmtLock))
+        PDMCritSectLeave(&pVM->iom.s.EmtLock);
 }
 
Index: trunk/src/VBox/VMM/MMHyper.cpp
===================================================================
--- trunk/src/VBox/VMM/MMHyper.cpp	(revision 19681)
+++ trunk/src/VBox/VMM/MMHyper.cpp	(revision 19682)
@@ -1090,4 +1090,17 @@
 }
 
+/**
+ * Release the MM hypervisor heap lock if owned by the current VCPU
+ *
+ * @param   pVM         The VM to operate on.
+ */
+VMMR3DECL(void) MMR3ReleaseOwnedLocks(PVM pVM)
+{
+    PMMHYPERHEAP pHeap = pVM->mm.s.CTX_SUFF(pHyperHeap);
+
+    if (PDMCritSectIsOwner(&pHeap->Lock))
+        PDMCritSectLeave(&pHeap->Lock);
+}
+
 
 /**
Index: trunk/src/VBox/VMM/PDM.cpp
===================================================================
--- trunk/src/VBox/VMM/PDM.cpp	(revision 19681)
+++ trunk/src/VBox/VMM/PDM.cpp	(revision 19682)
@@ -1441,2 +1441,13 @@
     return VINF_SUCCESS;
 }
+
+/**
+ * Release the PDM lock if owned by the current VCPU
+ *
+ * @param   pVM         The VM to operate on.
+ */
+VMMR3DECL(void) PDMR3ReleaseOwnedLocks(PVM pVM)
+{
+    if (PDMCritSectIsOwner(&pVM->pdm.s.CritSect))
+        PDMCritSectLeave(&pVM->pdm.s.CritSect);
+}
Index: trunk/src/VBox/VMM/PGM.cpp
===================================================================
--- trunk/src/VBox/VMM/PGM.cpp	(revision 19681)
+++ trunk/src/VBox/VMM/PGM.cpp	(revision 19682)
@@ -4054,4 +4054,14 @@
 }
 
+/**
+ * Release the pgm lock if owned by the current VCPU
+ *
+ * @param   pVM         The VM to operate on.
+ */
+VMMR3DECL(void) PGMR3ReleaseOwnedLocks(PVM pVM)
+{
+    if (PDMCritSectIsOwner(&pVM->pgm.s.CritSect))
+        PDMCritSectLeave(&pVM->pgm.s.CritSect);
+}
 
 /**
Index: trunk/src/VBox/VMM/VMEmt.cpp
===================================================================
--- trunk/src/VBox/VMM/VMEmt.cpp	(revision 19681)
+++ trunk/src/VBox/VMM/VMEmt.cpp	(revision 19682)
@@ -34,4 +34,8 @@
 #include <VBox/vm.h>
 #include <VBox/uvm.h>
+#include <VBox/mm.h>
+#include <VBox/pgm.h>
+#include <VBox/iom.h>
+#include <VBox/pdm.h>
 
 #include <VBox/err.h>
@@ -224,5 +228,14 @@
                 if (   EMGetState(pVCpu) == EMSTATE_GURU_MEDITATION
                     && pVM->enmVMState == VMSTATE_RUNNING)
+                {
+                    /* Release owned locks to make sure other VCPUs can continue in case they were waiting for one. */
+                    MMR3ReleaseOwnedLocks(pVM);
+                    PGMR3ReleaseOwnedLocks(pVM);
+                    PDMR3ReleaseOwnedLocks(pVM);
+                    IOMR3ReleaseOwnedLocks(pVM);
+                    EMR3ReleaseOwnedLocks(pVM);
+
                     vmR3SetState(pVM, VMSTATE_GURU_MEDITATION);
+                }
             }
         }
Index: trunk/src/VBox/VMM/VMMAll/PDMAllCritSect.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMAll/PDMAllCritSect.cpp	(revision 19681)
+++ trunk/src/VBox/VMM/VMMAll/PDMAllCritSect.cpp	(revision 19682)
@@ -218,7 +218,10 @@
     PVM pVM = pCritSect->s.CTX_SUFF(pVM);
     Assert(pVM);
+
+#ifdef VBOX_STRICT
     PVMCPU pVCpu = VMMGetCpu(pVM);
     Assert(pVCpu);
     AssertMsg(pCritSect->s.Core.NativeThreadOwner == pVCpu->hNativeThread, ("Owner %RX64 emt=%RX64\n", pCritSect->s.Core.NativeThreadOwner, pVCpu->hNativeThread));
+#endif
 
     /*
@@ -232,5 +235,7 @@
         return;
     }
-
+#ifndef VBOX_STRICT
+    PVMCPU pVCpu = VMMGetCpu(pVM);
+#endif
     /*
      * Try leave it.
Index: trunk/src/VBox/VMM/VMMAll/PGMAll.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMAll/PGMAll.cpp	(revision 19681)
+++ trunk/src/VBox/VMM/VMMAll/PGMAll.cpp	(revision 19682)
@@ -2030,5 +2030,4 @@
 }
 
-
 /**
  * Check if this VCPU currently owns the PGM lock.
