Index: /trunk/src/VBox/Runtime/r0drv/alloc-r0drv.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/alloc-r0drv.cpp	(revision 36981)
+++ /trunk/src/VBox/Runtime/r0drv/alloc-r0drv.cpp	(revision 36982)
@@ -180,41 +180,60 @@
 RTDECL(void *) RTMemReallocTag(void *pvOld, size_t cbNew, const char *pszTag) RT_NO_THROW
 {
-    if (!cbNew)
+    /* Free. */
+    if (!cbNew && pvOld)
+    {
         RTMemFree(pvOld);
-    else if (!pvOld)
+        return NULL;
+    }
+
+    /* Alloc. */
+    if (!pvOld)
         return RTMemAllocTag(cbNew, pszTag);
-    else
-    {
-        PRTMEMHDR pHdrOld = (PRTMEMHDR)pvOld - 1;
-        RT_ASSERT_PREEMPTIBLE();
-
-        if (pHdrOld->u32Magic == RTMEMHDR_MAGIC)
+
+    /*
+     * Realloc.
+     */
+    PRTMEMHDR pHdrOld = (PRTMEMHDR)pvOld - 1;
+    RT_ASSERT_PREEMPTIBLE();
+
+    if (pHdrOld->u32Magic == RTMEMHDR_MAGIC)
+    {
+        PRTMEMHDR pHdrNew;
+
+        /* If there is sufficient space in the old block and we don't cause
+           substantial internal fragmentation, reuse the old block. */
+        if (   pHdrOld->cb >= cbNew + RTR0MEM_FENCE_EXTRA
+            && pHdrOld->cb - (cbNew + RTR0MEM_FENCE_EXTRA) <= 128)
         {
-            PRTMEMHDR pHdrNew;
-            if (pHdrOld->cb >= cbNew && pHdrOld->cb - cbNew <= 128)
-                return pvOld;
-            pHdrNew = rtR0MemAlloc(cbNew + RTR0MEM_FENCE_EXTRA, 0);
-            if (pHdrNew)
-            {
-                size_t cbCopy = RT_MIN(pHdrOld->cb, pHdrNew->cb);
-                memcpy(pHdrNew + 1, pvOld, cbCopy);
-#ifdef RTR0MEM_STRICT
-                pHdrNew->cbReq = (uint32_t)cbNew; Assert(pHdrNew->cbReq == cbNew);
-                memcpy((uint8_t *)(pHdrNew + 1) + cbNew, &g_abFence[0], RTR0MEM_FENCE_EXTRA);
-                AssertReleaseMsg(!memcmp((uint8_t *)(pHdrOld + 1) + pHdrOld->cbReq, &g_abFence[0], RTR0MEM_FENCE_EXTRA),
-                                 ("pHdr=%p pvOld=%p cb=%zu cbNew=%zu\n"
-                                  "fence:    %.*Rhxs\n"
-                                  "expected: %.*Rhxs\n",
-                                  pHdrOld, pvOld, pHdrOld->cb, cbNew,
-                                  RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdrOld + 1) + pHdrOld->cb,
-                                  RTR0MEM_FENCE_EXTRA, &g_abFence[0]));
-#endif
-                rtR0MemFree(pHdrOld);
-                return pHdrNew + 1;
-            }
+            pHdrOld->cbReq = (uint32_t)cbNew; Assert(pHdrOld->cbReq == cbNew);
+#ifdef RTR0MEM_STRICT
+            memcpy((uint8_t *)(pHdrOld + 1) + cbNew, &g_abFence[0], RTR0MEM_FENCE_EXTRA);
+#endif
+            return pvOld;
         }
-        else
-            AssertMsgFailed(("pHdrOld->u32Magic=%RX32 pvOld=%p cbNew=%#zx\n", pHdrOld->u32Magic, pvOld, cbNew));
-    }
+
+        /* Allocate a new block and copy over the content. */
+        pHdrNew = rtR0MemAlloc(cbNew + RTR0MEM_FENCE_EXTRA, 0);
+        if (pHdrNew)
+        {
+            size_t cbCopy = RT_MIN(pHdrOld->cb, pHdrNew->cb);
+            memcpy(pHdrNew + 1, pvOld, cbCopy);
+#ifdef RTR0MEM_STRICT
+            pHdrNew->cbReq = (uint32_t)cbNew; Assert(pHdrNew->cbReq == cbNew);
+            memcpy((uint8_t *)(pHdrNew + 1) + cbNew, &g_abFence[0], RTR0MEM_FENCE_EXTRA);
+            AssertReleaseMsg(!memcmp((uint8_t *)(pHdrOld + 1) + pHdrOld->cbReq, &g_abFence[0], RTR0MEM_FENCE_EXTRA),
+                             ("pHdr=%p pvOld=%p cbReq=%u cb=%u cbNew=%zu fFlags=%#x\n"
+                              "fence:    %.*Rhxs\n"
+                              "expected: %.*Rhxs\n",
+                              pHdrOld, pvOld, pHdrOld->cbReq, pHdrOld->cb, cbNew, pHdrOld->fFlags,
+                              RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdrOld + 1) + pHdrOld->cbReq,
+                              RTR0MEM_FENCE_EXTRA, &g_abFence[0]));
+#endif
+            rtR0MemFree(pHdrOld);
+            return pHdrNew + 1;
+        }
+    }
+    else
+        AssertMsgFailed(("pHdrOld->u32Magic=%RX32 pvOld=%p cbNew=%#zx\n", pHdrOld->u32Magic, pvOld, cbNew));
 
     return NULL;
@@ -237,9 +256,9 @@
 #ifdef RTR0MEM_STRICT
         AssertReleaseMsg(!memcmp((uint8_t *)(pHdr + 1) + pHdr->cbReq, &g_abFence[0], RTR0MEM_FENCE_EXTRA),
-                         ("pHdr=%p pv=%p cb=%zu\n"
+                         ("pHdr=%p pv=%p cbReq=%u cb=%u fFlags=%#x\n"
                           "fence:    %.*Rhxs\n"
                           "expected: %.*Rhxs\n",
-                          pHdr, pv, pHdr->cb,
-                          RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cb,
+                          pHdr, pv, pHdr->cbReq, pHdr->cb, pHdr->fFlags,
+                          RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cbReq,
                           RTR0MEM_FENCE_EXTRA, &g_abFence[0]));
 #endif
@@ -292,9 +311,9 @@
 #ifdef RTR0MEM_STRICT
         AssertReleaseMsg(!memcmp((uint8_t *)(pHdr + 1) + pHdr->cbReq, &g_abFence[0], RTR0MEM_FENCE_EXTRA),
-                         ("pHdr=%p pv=%p cb=%zu\n"
+                         ("pHdr=%p pv=%p cbReq=%u cb=%u fFlags=%#x\n"
                           "fence:    %.*Rhxs\n"
                           "expected: %.*Rhxs\n",
-                          pHdr, pv, pHdr->cb,
-                          RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cb,
+                          pHdr, pv, pHdr->cbReq, pHdr->cb, pHdr->fFlags,
+                          RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cbReq,
                           RTR0MEM_FENCE_EXTRA, &g_abFence[0]));
 #endif
@@ -393,9 +412,9 @@
 #ifdef RTR0MEM_STRICT
         AssertReleaseMsg(!memcmp((uint8_t *)(pHdr + 1) + pHdr->cbReq, &g_abFence[0], RTR0MEM_FENCE_EXTRA),
-                         ("pHdr=%p pv=%p cb=%zu\n"
+                         ("pHdr=%p pv=%p cbReq=%u cb=%u fFlags=%#x\n"
                           "fence:    %.*Rhxs\n"
                           "expected: %.*Rhxs\n",
-                          pHdr, pv, pHdr->cb,
-                          RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cb,
+                          pHdr, pv, pHdr->cbReq, pHdr->cb, pHdr->fFlags,
+                          RTR0MEM_FENCE_EXTRA, (uint8_t *)(pHdr + 1) + pHdr->cbReq,
                           RTR0MEM_FENCE_EXTRA, &g_abFence[0]));
 #endif
