[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 1/2] Don't try to __FreePages() with local copy of MDL
The XENVIF_RECEIVER_PACKET structure contains an embedded MDL so that multi-fragment packets can be properly chained together. However this structure should not be passed to __FreePages() as: a) It appears to create problems with system PTE tracking b) It results in memory corruption now that __FreePages() calls ExFreePool() This patch therefore extends the packet structure with a pointer to the original system MDL such that it can be passed to __FreePages() when the packet destructor is called. The patch also bypasses some calls to MmGetSystemAddressForMdlSafe() since we can ASSERT that the MDL is already mapped to a system address. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenvif/receiver.c | 50 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c index 99c113e..67a5cb2 100644 --- a/src/xenvif/receiver.c +++ b/src/xenvif/receiver.c @@ -121,6 +121,7 @@ typedef struct _XENVIF_RECEIVER_PACKET { PXENVIF_RECEIVER_RING Ring; MDL Mdl; PFN_NUMBER __Pfn; + PMDL SystemMdl; } XENVIF_RECEIVER_PACKET, *PXENVIF_RECEIVER_PACKET; struct _XENVIF_RECEIVER { @@ -170,7 +171,6 @@ ReceiverPacketCtor( PXENVIF_RECEIVER_RING Ring = Argument; PXENVIF_RECEIVER_PACKET Packet = Object; PMDL Mdl; - PUCHAR StartVa; NTSTATUS status; ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_RECEIVER_PACKET))); @@ -181,18 +181,17 @@ ReceiverPacketCtor( if (Mdl == NULL) goto fail1; - StartVa = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority); - ASSERT(StartVa != NULL); - RtlFillMemory(StartVa, PAGE_SIZE, 0xAA); - ASSERT3U(Mdl->ByteOffset, ==, 0); - Mdl->StartVa = StartVa; - Mdl->ByteCount = 0; - Packet->Mdl = *Mdl; - Packet->__Pfn = MmGetMdlPfnArray(Mdl)[0]; + Packet->SystemMdl = Mdl; - ExFreePool(Mdl); + Packet->Mdl.Size = sizeof (MDL) + sizeof (PFN_NUMBER); + Packet->Mdl.MdlFlags = Mdl->MdlFlags; + + ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); + Packet->Mdl.MappedSystemVa = Mdl->MappedSystemVa; + + Packet->__Pfn = MmGetMdlPfnArray(Mdl)[0]; Packet->Ring = Ring; @@ -219,13 +218,12 @@ ReceiverPacketDtor( ASSERT3P(Packet->Ring, ==, Ring); Packet->Ring = NULL; - Mdl = &Packet->Mdl; - - Mdl->ByteCount = PAGE_SIZE; + Mdl = Packet->SystemMdl; + Packet->SystemMdl = NULL; __FreePage(Mdl); - RtlZeroMemory(Mdl, sizeof (MDL) + sizeof (PFN_NUMBER)); + RtlZeroMemory(&Packet->Mdl, sizeof (MDL) + sizeof (PFN_NUMBER)); ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_RECEIVER_PACKET))); } @@ -263,7 +261,7 @@ __ReceiverRingPutPacket( { PXENVIF_RECEIVER Receiver; PXENVIF_FRONTEND Frontend; - PMDL Mdl = &Packet->Mdl; + PMDL Mdl = Packet->SystemMdl; Receiver = Ring->Receiver; Frontend = Receiver->Frontend; @@ -280,10 +278,13 @@ __ReceiverRingPutPacket( RtlZeroMemory(&Packet->Info, sizeof (XENVIF_PACKET_INFO)); RtlZeroMemory(&Packet->Hash, sizeof (XENVIF_PACKET_HASH)); - Mdl->MappedSystemVa = Mdl->StartVa; - Mdl->ByteOffset = 0; - Mdl->ByteCount = 0; - ASSERT3P(Mdl->Next, ==, NULL); + RtlZeroMemory(&Packet->Mdl, sizeof (MDL)); + + Packet->Mdl.Size = sizeof (MDL) + sizeof (PFN_NUMBER); + Packet->Mdl.MdlFlags = Mdl->MdlFlags; + + ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); + Packet->Mdl.MappedSystemVa = Mdl->MappedSystemVa; XENBUS_CACHE(Put, &Receiver->CacheInterface, @@ -2042,10 +2043,19 @@ ReceiverRingPoll( Extra = (extra->flags & XEN_NETIF_EXTRA_FLAG_MORE) ? TRUE : FALSE; } else { + PUCHAR StartVa; + ASSERT3U(rsp->id, ==, id); + StartVa = MmGetSystemAddressForMdlSafe(Mdl, + NormalPagePriority); + ASSERT(StartVa != NULL); + Mdl->ByteOffset = rsp->offset; - Mdl->MappedSystemVa = (PUCHAR)Mdl->StartVa + rsp->offset; + + StartVa += rsp->offset; + Mdl->MappedSystemVa = StartVa; + Mdl->ByteCount = rsp->status; if (rsp->status < 0) -- 2.5.3 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |