|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENBUS PATCH 3/4] balloon: Stop using fake MDL to store PFN array
The mapping sanity check has only ever been done in checked builds.
Remove the check, which also lets us stop using/messing with fake MDLs.
Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
src/xenbus/balloon.c | 128 +++++++------------------------------------
1 file changed, 20 insertions(+), 108 deletions(-)
diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
index 2b657ce..029fff5 100644
--- a/src/xenbus/balloon.c
+++ b/src/xenbus/balloon.c
@@ -41,10 +41,7 @@
#include "assert.h"
#include "util.h"
-#define MDL_SIZE_MAX ((1 << (RTL_FIELD_SIZE(MDL, Size) * 8)) - 1)
-#define MAX_PAGES_PER_MDL ((MDL_SIZE_MAX - sizeof(MDL)) / sizeof(PFN_NUMBER))
-
-#define XENBUS_BALLOON_PFN_ARRAY_SIZE (MAX_PAGES_PER_MDL)
+#define XENBUS_BALLOON_PFN_ARRAY_SIZE 8192
typedef struct _XENBUS_BALLOON_FIST {
BOOLEAN Inflation;
@@ -58,7 +55,6 @@ struct _XENBUS_BALLOON_CONTEXT {
PKEVENT LowMemoryEvent;
HANDLE LowMemoryHandle;
ULONGLONG Size;
- MDL Mdl;
PFN_NUMBER PfnArray[XENBUS_BALLOON_PFN_ARRAY_SIZE];
XENBUS_RANGE_SET_INTERFACE RangeSetInterface;
PXENBUS_RANGE_SET RangeSet;
@@ -204,7 +200,6 @@ BalloonAllocatePagesForMdl(
LARGE_INTEGER HighAddress;
LARGE_INTEGER SkipBytes;
SIZE_T TotalBytes;
- PMDL Mdl;
ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
@@ -213,90 +208,31 @@ BalloonAllocatePagesForMdl(
SkipBytes.QuadPart = 0ull;
TotalBytes = (SIZE_T)Count << PAGE_SHIFT;
- Mdl = MmAllocatePagesForMdlEx(LowAddress,
- HighAddress,
- SkipBytes,
- TotalBytes,
- MmCached,
- MM_DONT_ZERO_ALLOCATION |
- MM_ALLOCATE_PREFER_CONTIGUOUS |
- MM_ALLOCATE_AND_HOT_REMOVE);
- if (Mdl == NULL)
- goto done;
-
- 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)) == 0);
-
-done:
- return Mdl;
+ return MmAllocatePagesForMdlEx(LowAddress,
+ HighAddress,
+ SkipBytes,
+ TotalBytes,
+ MmCached,
+ MM_DONT_ZERO_ALLOCATION |
+ MM_ALLOCATE_PREFER_CONTIGUOUS |
+ MM_ALLOCATE_AND_HOT_REMOVE);
}
static VOID
-BalloonFreePagesFromMdl(
- _In_ PMDL Mdl,
- _In_ BOOLEAN Check
+BalloonFreePages(
+ _In_ PPFN_NUMBER Pfn,
+ _In_ ULONG Count
)
{
- volatile UCHAR *Mapping;
- ULONG Index;
- PPFN_NUMBER Pfn;
- PFN_NUMBER RangeStart, RangeEnd;
- NTSTATUS Status;
-
- if (!Check)
- goto done;
-
- // Sanity check:
- //
- // Make sure that things written to the page really do stick.
- // If the page is still ballooned out at the hypervisor level
- // then writes will be discarded and reads will give back
- // all 1s.
-
- Mapping = MmMapLockedPagesSpecifyCache(Mdl,
- KernelMode,
- MmCached,
- NULL,
- FALSE,
- LowPagePriority);
- if (Mapping == NULL)
- // Windows couldn't map the memory. That's kind of sad, but not
- // really an error: it might be that we're very low on kernel
- // virtual address space.
- goto done;
-
- // Write and read the first byte in each page to make sure it's backed
- // by RAM.
- ASSERT((Mdl->ByteCount & (PAGE_SIZE - 1)) == 0);
-
- for (Index = 0; Index < (Mdl->ByteCount >> PAGE_SHIFT); Index++) {
- UCHAR Byte;
-
- ASSERT3U(Index << PAGE_SHIFT, <, Mdl->ByteCount);
- Mapping[Index << PAGE_SHIFT] = (UCHAR)Index;
-
- KeMemoryBarrier();
- Byte = Mapping[Index << PAGE_SHIFT];
-
- ASSERT3U(Byte, ==, (UCHAR)Index);
- }
-
- MmUnmapLockedPages((PVOID)Mapping, Mdl);
-
-done:
- Pfn = MmGetMdlPfnArray(Mdl);
+ PFN_NUMBER RangeStart, RangeEnd;
+ NTSTATUS Status;
RangeStart = 0;
- while (RangeStart < (MmGetMdlByteCount(Mdl) >> PAGE_SHIFT)) {
+ while (RangeStart < Count) {
PHYSICAL_ADDRESS StartAddress;
LARGE_INTEGER NumberOfBytes;
- for (RangeEnd = RangeStart;
- RangeEnd < (MmGetMdlByteCount(Mdl) >> PAGE_SHIFT);
- RangeEnd++) {
+ for (RangeEnd = RangeStart; RangeEnd < Count; RangeEnd++) {
if (Pfn[RangeEnd] != Pfn[RangeStart] + (RangeEnd - RangeStart))
break;
}
@@ -345,8 +281,6 @@ BalloonAllocatePfnArray(
if (Mdl == NULL)
goto done;
- ASSERT(Mdl->ByteOffset == 0);
- ASSERT((Mdl->ByteCount & (PAGE_SIZE - 1)) == 0);
ASSERT(Mdl->MdlFlags & MDL_PAGES_LOCKED);
Count = Mdl->ByteCount >> PAGE_SHIFT;
@@ -501,8 +435,7 @@ done:
static ULONG
BalloonFreePfnArray(
_In_ PXENBUS_BALLOON_CONTEXT Context,
- _In_ ULONG Requested,
- _In_ BOOLEAN Check
+ _In_ ULONG Requested
)
{
LARGE_INTEGER Start;
@@ -511,7 +444,6 @@ BalloonFreePfnArray(
ULONGLONG Rate;
ULONG Index;
ULONG Count;
- PMDL Mdl;
ASSERT3U(Requested, <=, XENBUS_BALLOON_PFN_ARRAY_SIZE);
@@ -521,32 +453,12 @@ BalloonFreePfnArray(
if (Requested == 0)
goto done;
- ASSERT(IsZeroMemory(&Context->Mdl, sizeof (MDL)));
-
for (Index = 0; Index < Requested; Index++)
ASSERT(Context->PfnArray[Index] != 0);
- Mdl = &Context->Mdl;
-
-#pragma warning(push)
-#pragma warning(disable:28145) // The opaque MDL structure should not be
modified by a driver
-
- Mdl->Next = NULL;
- Mdl->Size = (SHORT)(sizeof(MDL) + (sizeof(PFN_NUMBER) * Requested));
- Mdl->MdlFlags = MDL_PAGES_LOCKED | MDL_IO_SPACE;
- Mdl->Process = NULL;
- Mdl->MappedSystemVa = NULL;
- Mdl->StartVa = NULL;
- Mdl->ByteCount = Requested << PAGE_SHIFT;
- Mdl->ByteOffset = 0;
-
-#pragma warning(pop)
-
- BalloonFreePagesFromMdl(Mdl, Check);
+ BalloonFreePages(Context->PfnArray, Requested);
Count = Requested;
- RtlZeroMemory(&Context->Mdl, sizeof (MDL));
-
RtlZeroMemory(Context->PfnArray, Count * sizeof (PFN_NUMBER));
done:
@@ -612,7 +524,7 @@ BalloonDeflate(
if (Populated < ThisTime)
status = STATUS_RETRY;
- Freed = BalloonFreePfnArray(Context, Populated, TRUE);
+ Freed = BalloonFreePfnArray(Context, Populated);
ASSERT(Freed == Populated);
Count += Freed;
@@ -675,7 +587,7 @@ BalloonInflate(
&(Context->PfnArray[Released]),
(Allocated - Released) * sizeof (PFN_NUMBER));
- Freed = BalloonFreePfnArray(Context, Allocated - Released, FALSE);
+ Freed = BalloonFreePfnArray(Context, Allocated - Released);
ASSERT3U(Freed, ==, Allocated - Released);
}
--
2.50.1.windows.1
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |