[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH] Replace uses of MmAllocatePagesForMdlEx in __AllocatePage
> -----Original Message----- > From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On > Behalf Of Ben Chalmers > Sent: Tuesday, July 3, 2018 11:23 AM > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Ben Chalmers <ben.chalmers@xxxxxxxxxx> > Subject: [win-pv-devel] [PATCH] Replace uses of MmAllocatePagesForMdlEx > in __AllocatePage > > 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. > > This commit users MmAllocateContinguousMemorySpecifyCache > to allocate memory instead, then builds and Mdl to wrap it up. > > __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> Acked-by: Paul Durrant <paul.durrant@xxxxxxxxxx> > --- > src/xenvif/controller.c | 12 ++++++-- > src/xenvif/receiver.c | 56 ++++++++++++++++++++++++++--------- > src/xenvif/transmitter.c | 24 +++++++++++---- > src/xenvif/util.h | 76 > ++++++++++++++++++++++++++++++++++++++++++++++-- > 4 files changed, 143 insertions(+), 25 deletions(-) > > diff --git a/src/xenvif/controller.c b/src/xenvif/controller.c index > 35901a2..37abb1d 100644 > --- a/src/xenvif/controller.c > +++ b/src/xenvif/controller.c > @@ -469,7 +469,9 @@ ControllerConnect( > if (Controller->Mdl == NULL) > goto fail7; > > - ASSERT(Controller->Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Controller->Mdl->MdlFlags > + & (MDL_MAPPED_TO_SYSTEM_VA > + | MDL_SOURCE_IS_NONPAGED_POOL)); > Controller->Shared = Controller->Mdl->MappedSystemVa; > ASSERT(Controller->Shared != NULL); > > @@ -904,7 +906,9 @@ ControllerSetHashKey( > if (Mdl == NULL) > goto fail1; > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags > + & (MDL_MAPPED_TO_SYSTEM_VA > + | MDL_SOURCE_IS_NONPAGED_POOL)); > Buffer = Mdl->MappedSystemVa; > ASSERT(Buffer != NULL); > > @@ -1083,7 +1087,9 @@ ControllerSetHashMapping( > if (Mdl == NULL) > goto fail2; > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags > + & (MDL_MAPPED_TO_SYSTEM_VA > + | MDL_SOURCE_IS_NONPAGED_POOL)); > Buffer = Mdl->MappedSystemVa; > ASSERT(Buffer != NULL); > > diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c index > a6b3ad2..ab3e416 100644 > --- a/src/xenvif/receiver.c > +++ b/src/xenvif/receiver.c > @@ -169,7 +169,9 @@ __ReceiverPacketMdlInit( > Packet->Mdl.Size = sizeof (MDL) + sizeof (PFN_NUMBER); > Packet->Mdl.MdlFlags = Mdl->MdlFlags; > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > Packet->Mdl.StartVa = Mdl->StartVa; > Packet->Mdl.MappedSystemVa = Mdl->MappedSystemVa; > > @@ -406,7 +408,9 @@ ReceiverRingProcessTag( > > PayloadLength = Packet->Length - Info->Length; > > - ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Packet->Mdl.MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Packet->Mdl.MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -497,7 +501,9 @@ ReceiverRingProcessChecksum( > if (Info->IpHeader.Length == 0) > return; > > - ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Packet->Mdl.MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Packet->Mdl.MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -654,7 +660,9 @@ ReceiverRingPullup( > PUCHAR SourceVa; > ULONG CopyLength; > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > SourceVa = Mdl->MappedSystemVa; > ASSERT(SourceVa != NULL); > > @@ -700,7 +708,9 @@ __ReceiverRingPullupPacket( > XENVIF_PACKET_PAYLOAD Payload; > ULONG Length; > > - ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Packet->Mdl.MdlFlags > + & (MDL_MAPPED_TO_SYSTEM_VA > + | MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Packet->Mdl.MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -744,7 +754,9 @@ __ReceiverRingBuildSegment( > > Info = &Packet->Info; > > - ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Packet->Mdl.MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > InfoVa = Packet->Mdl.MappedSystemVa; > ASSERT(InfoVa != NULL); > > @@ -767,7 +779,9 @@ __ReceiverRingBuildSegment( > > Mdl = &Segment->Mdl; > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Mdl->MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -849,7 +863,9 @@ __ReceiverRingBuildSegment( > > Mdl = Mdl->Next; > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Mdl->MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -939,7 +955,9 @@ ReceiverRingProcessLargePacket( > > Packet->Mdl.Next = NULL; > > - ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Packet->Mdl.MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > InfoVa = Packet->Mdl.MappedSystemVa; > ASSERT(InfoVa != NULL); > > @@ -1134,7 +1152,9 @@ ReceiverRingProcessStandardPacket( > if (Mdl == NULL) > goto fail2; > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Mdl->MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -1240,7 +1260,9 @@ ReceiverRingProcessPacket( > // Override offset to align > Packet->Offset = Receiver->IpAlignOffset; > > - ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Packet->Mdl.MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Packet->Mdl.MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -1422,7 +1444,9 @@ __ReceiverRingReleaseLock( > XENVIF_RECEIVER_PACKET, > ListEntry); > > - ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Packet->Mdl.MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Packet->Mdl.MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -2034,7 +2058,9 @@ ReceiverRingPoll( > > ASSERT3U(rsp->id, ==, id); > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Mdl->MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -2419,7 +2445,9 @@ __ReceiverRingConnect( > if (Ring->Mdl == NULL) > goto fail3; > > - ASSERT(Ring->Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Ring->Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > Ring->Shared = Ring->Mdl->MappedSystemVa; > ASSERT(Ring->Shared != NULL); > > diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c index > 1d46f85..bf6004a 100644 > --- a/src/xenvif/transmitter.c > +++ b/src/xenvif/transmitter.c > @@ -867,7 +867,9 @@ __TransmitterRingCopyPayload( > > Length = __min(Payload.Length, PAGE_SIZE); > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Mdl->MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -1187,7 +1189,9 @@ __TransmitterRingPrepareHeader( > > Mdl = Buffer->Mdl; > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Mdl->MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -1684,7 +1688,9 @@ __TransmitterRingPreparePacket( > > ASSERT3U(Mdl->ByteCount, <=, PAGE_SIZE - Trailer); > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Mdl->MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -1783,7 +1789,9 @@ __TransmitterRingPrepareArp( > > Mdl = Buffer->Mdl; > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Mdl->MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -1924,7 +1932,9 @@ > __TransmitterRingPrepareNeighbourAdvertisement( > > Mdl = Buffer->Mdl; > > - ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > BaseVa = Mdl->MappedSystemVa; > ASSERT(BaseVa != NULL); > > @@ -3638,7 +3648,9 @@ __TransmitterRingConnect( > if (Ring->Mdl == NULL) > goto fail3; > > - ASSERT(Ring->Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); > + ASSERT(Ring->Mdl->MdlFlags & > + (MDL_MAPPED_TO_SYSTEM_VA | > + MDL_SOURCE_IS_NONPAGED_POOL)); > Ring->Shared = Ring->Mdl->MappedSystemVa; > ASSERT(Ring->Shared != NULL); > > diff --git a/src/xenvif/util.h b/src/xenvif/util.h index 30322d8..d6b332e > 100644 > --- a/src/xenvif/util.h > +++ b/src/xenvif/util.h > @@ -244,7 +244,63 @@ fail1: > return NULL; > } > > -#define __AllocatePage() __AllocatePages(1) > + > +static FORCEINLINE PMDL > +__AllocatePage() > +{ > + PHYSICAL_ADDRESS LowAddress; > + PHYSICAL_ADDRESS HighAddress; > + PHYSICAL_ADDRESS Align; > + SIZE_T TotalBytes; > + PMDL Mdl; > + PUCHAR MdlMappedSystemVa; > + NTSTATUS status; > + > + ASSERT3U(KeGetCurrentIrql(), <=, DISPATCH_LEVEL); > + > + LowAddress.QuadPart = 0ull; > + HighAddress.QuadPart = ~0ull; > + Align.QuadPart = PAGE_SIZE; > + TotalBytes = (SIZE_T)PAGE_SIZE; > + > + MdlMappedSystemVa = MmAllocateContiguousMemorySpecifyCache( > + TotalBytes, > + LowAddress, > + HighAddress, > + Align, > + MmCached); > + > + status = STATUS_NO_MEMORY; > + if (MdlMappedSystemVa == NULL) > + goto fail1; > + > + Mdl = IoAllocateMdl(MdlMappedSystemVa, > + (ULONG)TotalBytes, > + FALSE, > + FALSE, > + NULL); > + if (Mdl == NULL) > + goto fail2; > + > + MmBuildMdlForNonPagedPool(Mdl); > + > + ASSERT3U(Mdl->ByteOffset, ==, 0); > + ASSERT3P(Mdl->StartVa, ==, MdlMappedSystemVa); > + ASSERT3P(Mdl->MappedSystemVa, ==, MdlMappedSystemVa); > + > + RtlZeroMemory(MdlMappedSystemVa, Mdl->ByteCount); > + > + return Mdl; > + > +fail2: > + Error("fail2\n"); > + > + MmFreeContiguousMemory(MdlMappedSystemVa); > +fail1: > + Error("fail1 (%08x)\n", status); > + > + return NULL; > +} > > static FORCEINLINE VOID > __FreePages( > @@ -262,7 +318,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); > + > + MmFreeContiguousMemory(MdlMappedSystemVa); > +} > > static FORCEINLINE PCHAR > __strtok_r( > -- > 2.10.1.windows.1 > > > _______________________________________________ > win-pv-devel mailing list > win-pv-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/win-pv-devel _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |