[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENBUS PATCH 1/2] Use Windows 10 APIs to inflate/deflate balloon.
Windows 10 provides MM_ALLOCATE_AND_HOT_REMOVE to remove pages from the physical memory pool. The removed pages can be added back with MmAddPhysicalMemory. Implement balloon inflation using calls to MmAddPhysicalMemory on contiguous PFN ranges. Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx> --- src/xenbus/balloon.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c index 8d7e2c2..690e45f 100644 --- a/src/xenbus/balloon.c +++ b/src/xenbus/balloon.c @@ -194,6 +194,7 @@ BalloonSort( ASSERT3U(PfnArray[Index], <, PfnArray[Index + 1]); } +__drv_requiresIRQL(PASSIVE_LEVEL) static PMDL BalloonAllocatePagesForMdl( IN ULONG Count @@ -205,6 +206,8 @@ BalloonAllocatePagesForMdl( SIZE_T TotalBytes; PMDL Mdl; + ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL); + LowAddress.QuadPart = 0ull; HighAddress.QuadPart = ~0ull; SkipBytes.QuadPart = 0ull; @@ -215,7 +218,8 @@ BalloonAllocatePagesForMdl( SkipBytes, TotalBytes, MmCached, - MM_DONT_ZERO_ALLOCATION); + MM_DONT_ZERO_ALLOCATION | + MM_ALLOCATE_AND_HOT_REMOVE); if (Mdl == NULL) goto done; @@ -238,6 +242,9 @@ BalloonFreePagesFromMdl( { volatile UCHAR *Mapping; ULONG Index; + PPFN_NUMBER Pfn; + PFN_NUMBER RangeStart, RangeEnd; + NTSTATUS Status; if (!Check) goto done; @@ -280,7 +287,34 @@ BalloonFreePagesFromMdl( MmUnmapLockedPages((PVOID)Mapping, Mdl); done: - MmFreePagesFromMdl(Mdl); + Pfn = MmGetMdlPfnArray(Mdl); + + RangeStart = 0; + while (RangeStart < (MmGetMdlByteCount(Mdl) >> PAGE_SHIFT)) { + PHYSICAL_ADDRESS StartAddress; + LARGE_INTEGER NumberOfBytes; + + for (RangeEnd = RangeStart; + RangeEnd < (MmGetMdlByteCount(Mdl) >> PAGE_SHIFT); + RangeEnd++) { + if (Pfn[RangeEnd] != Pfn[RangeStart] + (RangeEnd - RangeStart)) + break; + } + + StartAddress.QuadPart = Pfn[RangeStart] << PAGE_SHIFT; + NumberOfBytes.QuadPart = (RangeEnd - RangeStart) << PAGE_SHIFT; + + Status = MmAddPhysicalMemory(&StartAddress, &NumberOfBytes); + if (!NT_SUCCESS(Status)) { + Error("MmAddPhysicalMemory failed: %08x (PFN %llx + %llx pages)\n", + Status, + Pfn[RangeStart], + RangeEnd - RangeStart); + break; + } + + RangeStart = RangeEnd; + } } #define XENBUS_BALLOON_MIN_PAGES_PER_S 1000ull -- 2.49.0.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 |