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@xxxxxxxxxxxxxxxxxxx> --- drivers/hv/hv_common.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c index 335aec5ec504..a81c5613e745 100644 --- a/drivers/hv/hv_common.c +++ b/drivers/hv/hv_common.c @@ -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: _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec