Introduce movable pages for Hyper-V guests
From: | Stanislav Kinsburskii <skinsburskii-AT-linux.microsoft.com> | |
To: | kys-AT-microsoft.com, haiyangz-AT-microsoft.com, wei.liu-AT-kernel.org, decui-AT-microsoft.com | |
Subject: | [PATCH 0/3] Introduce movable pages for Hyper-V guests | |
Date: | Wed, 24 Sep 2025 21:30:56 +0000 | |
Message-ID: | <175874669044.157998.15064894246017794777.stgit@skinsburskii-cloud-desktop.internal.cloudapp.net> | |
Cc: | linux-hyperv-AT-vger.kernel.org, linux-kernel-AT-vger.kernel.org | |
Archive-link: | Article |
From the start, the root-partition driver allocates, pins, and maps all guest memory into the hypervisor at guest creation. This is simple: Linux cannot move the pages, so the guest’s view in Linux and in Microsoft Hypervisor never diverges. However, this approach has major drawbacks: - NUMA: affinity can’t be changed at runtime, so you can’t migrate guest memory closer to the CPUs running it → performance hit. - Memory management: unused guest memory can’t be swapped out, compacted, or merged. - Provisioning time: upfront allocation/pinning slows guest create/destroy. - Overcommit: no memory overcommit on hosts with pinned-guest memory. This series adds movable memory pages for Hyper-V child partitions. Guest pages are no longer allocated upfront; they’re allocated and mapped into the hypervisor on demand (i.e., when the guest touches a GFN that isn’t yet backed by a host PFN). When a page is moved, Linux no longer holds it and it is unmapped from the hypervisor. As a result, Hyper-V guests behave like regular Linux processes, enabling standard Linux memory features to apply to guests. Exceptions (still pinned): 1. Encrypted guests (explicit). 2 Guests with passthrough devices (implicitly pinned by the VFIO framework). --- Stanislav Kinsburskii (3): Drivers: hv: Rename a few memory region related functions for clarity Drivers: hv: Centralize guest memory region destruction in helper Drivers: hv: Add support for movable memory regions drivers/hv/Kconfig | 1 drivers/hv/mshv_root.h | 8 + drivers/hv/mshv_root_main.c | 448 +++++++++++++++++++++++++++++++++++++------ 3 files changed, 397 insertions(+), 60 deletions(-)