|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH xenvif] Replace uses of MmAllocatePagesForMdlEx in __AllocatePages()...
> -----Original Message-----
> From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of
> Paul Durrant
> Sent: 16 June 2020 14:03
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Paul Durrant <pdurrant@xxxxxxxxxx>
> Subject: [PATCH xenvif] Replace uses of MmAllocatePagesForMdlEx in
> __AllocatePages()...
>
> From: Paul Durrant <pdurrant@xxxxxxxxxx>
>
> ... again.
>
> Commit 4f85d004 "Replace uses of MmAllocatePagesForMdlEx in __AllocatePage"
> modified __AllocatePage() (only) to use
> MmAllocateContinguousMemorySpecifyCache() as its source of memory. As stated
> in that commit:
>
> "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."
>
> That commit was reverted by e8fe14f6 since it was believed that the bug in
> Windows had been fixed. Subsequently, however, the same symptoms have been
> seen with recent updates of Server 2019. The stack is generally of the form:
>
> nt!KeBugCheckEx
> nt!KiBugCheckDispatch+0x69
> nt!KiFastFailDispatch+0xd0
> nt!KiRaiseSecurityCheckFailure+0x30e
> nt!KiAcquireThreadStateLock+0x11fa90
> nt!KeSetIdealProcessorThreadEx+0xd0
> nt!MiZeroInParallelWorker+0x115016
> nt!MiZeroInParallel+0x11c
> nt!MiInitializeMdlBatchPages+0x2ae
> nt!MiAllocatePagesForMdl+0x192
> nt!MmAllocatePartitionNodePagesForMdlEx+0xc9
> nt!MmAllocatePagesForMdlEx+0x4d
>
> Hence, this patch re-instates the fix originally put in place by 4f85d004
> but generalizes it to include AllocatePages() rather than just
> AllocatePage().
>
> Reported-by: Jan Bakuwel <jan.bakuwel@xxxxxxxxx>
> Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx>
> ---
>
> This fix will also be propogated to all other PV drivers.
This is actually failing in xenvbd, trying to allocate 2 pages for the shared
ring, so I'm going to try the simpler alternative of
continuing to use MmAllocatePagesForMdlEx() but without passing the "don't
zero" flag.
Paul
> ---
> src/xenvif/util.h | 77 +++++++++++++++++++----------------------------
> 1 file changed, 31 insertions(+), 46 deletions(-)
>
> diff --git a/src/xenvif/util.h b/src/xenvif/util.h
> index 30322d8..339485b 100644
> --- a/src/xenvif/util.h
> +++ b/src/xenvif/util.h
> @@ -171,55 +171,43 @@ __FreePoolWithTag(
>
> static FORCEINLINE PMDL
> __AllocatePages(
> - IN ULONG Count
> + IN ULONG Count
> )
> {
> PHYSICAL_ADDRESS LowAddress;
> PHYSICAL_ADDRESS HighAddress;
> - LARGE_INTEGER SkipBytes;
> + PHYSICAL_ADDRESS Align;
> SIZE_T TotalBytes;
> PMDL Mdl;
> PUCHAR MdlMappedSystemVa;
> NTSTATUS status;
>
> - LowAddress.QuadPart = 0ull;
> + ASSERT3U(KeGetCurrentIrql(), <=, DISPATCH_LEVEL);
> +
> + LowAddress.QuadPart = 0ull;
> HighAddress.QuadPart = ~0ull;
> - SkipBytes.QuadPart = 0ull;
> - TotalBytes = (SIZE_T)PAGE_SIZE * Count;
> + Align.QuadPart = PAGE_SIZE;
> + TotalBytes = (SIZE_T)PAGE_SIZE * Count;
>
> - Mdl = MmAllocatePagesForMdlEx(LowAddress,
> - HighAddress,
> - SkipBytes,
> - TotalBytes,
> - MmCached,
> - MM_DONT_ZERO_ALLOCATION);
> + MdlMappedSystemVa = MmAllocateContiguousMemorySpecifyCache(TotalBytes,
> + LowAddress,
> + HighAddress,
> + Align,
> + MmCached);
>
> status = STATUS_NO_MEMORY;
> - if (Mdl == NULL)
> + if (MdlMappedSystemVa == NULL)
> goto fail1;
>
> - if (Mdl->ByteCount < TotalBytes)
> + Mdl = IoAllocateMdl(MdlMappedSystemVa,
> + (ULONG)TotalBytes,
> + FALSE,
> + FALSE,
> + NULL);
> + if (Mdl == NULL)
> goto fail2;
>
> - ASSERT((Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
> - MDL_PARTIAL_HAS_BEEN_MAPPED |
> - MDL_PARTIAL |
> - MDL_PARENT_MAPPED_SYSTEM_VA |
> - MDL_SOURCE_IS_NONPAGED_POOL |
> - MDL_IO_SPACE)) == 0);
> -
> - MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
> - KernelMode,
> -
> MmCached,
> -
> NULL,
> -
> FALSE,
> -
> NormalPagePriority);
> -
> - status = STATUS_UNSUCCESSFUL;
> - if (MdlMappedSystemVa == NULL)
> - goto fail3;
> -
> - Mdl->StartVa = PAGE_ALIGN(MdlMappedSystemVa);
> + MmBuildMdlForNonPagedPool(Mdl);
>
> ASSERT3U(Mdl->ByteOffset, ==, 0);
> ASSERT3P(Mdl->StartVa, ==, MdlMappedSystemVa);
> @@ -229,40 +217,37 @@ __AllocatePages(
>
> return Mdl;
>
> -fail3:
> - Error("fail3\n");
> -
> fail2:
> Error("fail2\n");
>
> - MmFreePagesFromMdl(Mdl);
> - ExFreePool(Mdl);
> -
> + MmFreeContiguousMemory(MdlMappedSystemVa);
> fail1:
> Error("fail1 (%08x)\n", status);
>
> return NULL;
> }
>
> -#define __AllocatePage() __AllocatePages(1)
> +#define __AllocatePage() __AllocatePages(1)
>
> static FORCEINLINE VOID
> __FreePages(
> - IN PMDL Mdl
> + IN PMDL Mdl
> )
> {
> - PUCHAR MdlMappedSystemVa;
> + PUCHAR MdlMappedSystemVa;
> +
> + ASSERT(Mdl->MdlFlags &
> + (MDL_MAPPED_TO_SYSTEM_VA |
> + MDL_SOURCE_IS_NONPAGED_POOL));
>
> - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
> MdlMappedSystemVa = Mdl->MappedSystemVa;
>
> - MmUnmapLockedPages(MdlMappedSystemVa, Mdl);
> + IoFreeMdl(Mdl);
>
> - MmFreePagesFromMdl(Mdl);
> - ExFreePool(Mdl);
> + MmFreeContiguousMemory(MdlMappedSystemVa);
> }
>
> -#define __FreePage(_Mdl) __FreePages(_Mdl)
> +#define __FreePage(_Mdl) __FreePages(_Mdl)
>
> static FORCEINLINE PCHAR
> __strtok_r(
> --
> 2.17.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |