@@ -426,7 +426,10 @@ int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages)
order = 31 - __builtin_clz(num_pages);
while (1) {
- pages[i] = alloc_pages_node(node, GFP_KERNEL, order);
+ if (paritition_id == hv_current_partition_id)
+ pages[i] = pmpool_alloc(1 << order);
+ else
+ pages[i] = alloc_pages_node(node, GFP_KERNEL, order);
if (pages[i])
break;
if (!order) {
@@ -471,8 +474,12 @@ int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages)
err_free_allocations:
for (i = 0; i < num_allocations; ++i) {
base_pfn = page_to_pfn(pages[i]);
- for (j = 0; j < counts[i]; ++j)
- __free_page(pfn_to_page(base_pfn + j));
+ for (j = 0; j < counts[i]; ++j) {
+ if (paritition_id == hv_current_partition_id)
+ pmpool_release(pages[i], counts[i]);
+ else
+ __free_page(pfn_to_page(base_pfn + j));
+ }
}
free_buf:
Deposited pages are owned by the hypervisor. Accessing them can trigger a kernel panic due to a general protection fault. This patch ensures that pages for the root partition are allocated from the persistent memory pool. This allocation guarantees stability post-kexec, protecting hypervisor-deposited pages from unintended reuse by the new kernel. Signed-off-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com> --- drivers/hv/hv_common.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)