| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] Change AllocatePage to use ExAllocatePoolWithTag
 From: Owen Smith <owen.smith@xxxxxxxxxx>
Windows appears to have an edge case bug in which zeroing
memory using MmAllocatePAgesForMdlEx (which in Win 10 1803
happens even if you specify MM_DONT_ZERO_ALLOCATION) can cause
a BSOD 139 1e.
__AllocatePages is left unchanged (as we don't want
to allocate multiple contiguous pages).  This issue
has not been seen outside of xenvif calls to
__AllocatePage and we expect a fix to the underlying
Windows problem in the near future
Signed-off-by: Ben.Chalmers <ben.chalmers@xxxxxxxxxx>
Signed-Off-By: Martin Harvey <martin.harvey@xxxxxxxxxx>
Ported-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
 src/common/util.h | 72 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 70 insertions(+), 2 deletions(-)
diff --git a/src/common/util.h b/src/common/util.h
index eddad4a..93875b3 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -39,6 +39,8 @@
 #define        P2ROUNDUP(_x, _a)   \
         (-(-(_x) & -(_a)))
 
+#define XENBUS_SINGLEPAGE_TAG 'PSUB'
+
 static FORCEINLINE LONG
 __ffs(
     IN  unsigned long long  mask
@@ -236,7 +238,57 @@ fail1:
     return NULL;
 }
 
-#define __AllocatePage()    __AllocatePages(1)
+static FORCEINLINE PMDL
+__AllocatePage()
+{
+    PMDL                Mdl;
+    PUCHAR              MdlMappedSystemVa;
+    NTSTATUS            status;
+
+    ASSERT3U(KeGetCurrentIrql(), <=, DISPATCH_LEVEL);
+
+    MdlMappedSystemVa = __AllocatePoolWithTag(NonPagedPool,
+                                              PAGE_SIZE,
+                                              XENBUS_SINGLEPAGE_TAG);
+
+    status = STATUS_NO_MEMORY;
+    if (MdlMappedSystemVa == NULL)
+        goto fail1;
+
+    status = STATUS_INTERNAL_ERROR;
+    if (((ULONG_PTR)MdlMappedSystemVa) & (PAGE_SIZE - 1))
+        goto fail2;
+
+    Mdl = IoAllocateMdl(MdlMappedSystemVa,
+                        (ULONG)PAGE_SIZE,
+                        FALSE,
+                        FALSE,
+                        NULL);
+    if (Mdl == NULL)
+        goto fail3;
+
+    MmBuildMdlForNonPagedPool(Mdl);
+
+    ASSERT3U(Mdl->ByteOffset, ==, 0);
+    ASSERT3P(Mdl->StartVa, ==, MdlMappedSystemVa);
+    ASSERT3P(Mdl->MappedSystemVa, ==, MdlMappedSystemVa);
+
+    RtlZeroMemory(MdlMappedSystemVa, Mdl->ByteCount);
+
+    return Mdl;
+
+fail3:
+    Error("fail3\n");
+
+fail2:
+    Error("fail2\n");
+
+    __FreePoolWithTag(MdlMappedSystemVa, XENBUS_SINGLEPAGE_TAG);
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return NULL;
+}
 
 static FORCEINLINE VOID
 __FreePages(
@@ -254,7 +306,23 @@ __FreePages(
     ExFreePool(Mdl);
 }
 
-#define __FreePage(_Mdl)    __FreePages(_Mdl)
+static FORCEINLINE VOID
+__FreePage(
+    IN  PMDL    Mdl
+    )
+{
+    PUCHAR  MdlMappedSystemVa;
+
+    ASSERT(Mdl->MdlFlags &
+            (MDL_MAPPED_TO_SYSTEM_VA |
+             MDL_SOURCE_IS_NONPAGED_POOL));
+
+    MdlMappedSystemVa = Mdl->MappedSystemVa;
+
+    IoFreeMdl(Mdl);
+
+    __FreePoolWithTag(MdlMappedSystemVa, XENBUS_SINGLEPAGE_TAG);
+}
 
 static FORCEINLINE PCHAR
 __strtok_r(
-- 
2.30.1.windows.1
 
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |