Index: /trunk/src/VBox/Devices/Storage/DrvVD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvVD.cpp	(revision 64726)
+++ /trunk/src/VBox/Devices/Storage/DrvVD.cpp	(revision 64727)
@@ -3233,4 +3233,7 @@
         if (cIoReqsWaiting > 0)
         {
+            RTLISTANCHOR LstIoReqProcess;
+            RTListInit(&LstIoReqProcess);
+
             /* Try to process as many requests as possible. */
             RTCritSectEnter(&pThis->CritSectIoReqsIoBufWait);
@@ -3255,13 +3258,5 @@
                     pIoReqCur->ReadWrite.pSgBuf     = &pIoReqCur->ReadWrite.IoBuf.SgBuf;
 
-                    bool fXchg = ASMAtomicCmpXchgU32((volatile uint32_t *)&pIoReqCur->enmState, VDIOREQSTATE_ACTIVE, VDIOREQSTATE_ALLOCATED);
-                    if (RT_UNLIKELY(!fXchg))
-                    {
-                        /* Must have been canceled inbetween. */
-                        Assert(pIoReqCur->enmState == VDIOREQSTATE_CANCELED);
-                        drvvdMediaExIoReqCompleteWorker(pThis, pIoReqCur, VERR_PDM_MEDIAEX_IOREQ_CANCELED, true /* fUpNotify */);
-                    }
-                    ASMAtomicIncU32(&pThis->cIoReqsActive);
-                    rc = drvvdMediaExIoReqReadWriteProcess(pThis, pIoReqCur, true /* fUpNotify */);
+                    RTListAppend(&LstIoReqProcess, &pIoReqCur->NdLstWait);
                 }
                 else
@@ -3274,4 +3269,20 @@
 
             ASMAtomicAddU32(&pThis->cIoReqsWaiting, cIoReqsWaiting);
+
+            /* Process the requests we could allocate memory for outside the lock now. */
+            RTListForEachSafe(&LstIoReqProcess, pIoReqCur, pIoReqNext, PDMMEDIAEXIOREQINT, NdLstWait)
+            {
+                RTListNodeRemove(&pIoReqCur->NdLstWait);
+
+                bool fXchg = ASMAtomicCmpXchgU32((volatile uint32_t *)&pIoReqCur->enmState, VDIOREQSTATE_ACTIVE, VDIOREQSTATE_ALLOCATED);
+                if (RT_UNLIKELY(!fXchg))
+                {
+                    /* Must have been canceled inbetween. */
+                    Assert(pIoReqCur->enmState == VDIOREQSTATE_CANCELED);
+                    drvvdMediaExIoReqCompleteWorker(pThis, pIoReqCur, VERR_PDM_MEDIAEX_IOREQ_CANCELED, true /* fUpNotify */);
+                }
+                ASMAtomicIncU32(&pThis->cIoReqsActive);
+                drvvdMediaExIoReqReadWriteProcess(pThis, pIoReqCur, true /* fUpNotify */);
+            }
         }
     }
