[RFC][PATCH v2 11/21] kvm: allocate page table pages from DRAM

From: Fengguang Wu
Date: Wed Dec 26 2018 - 08:39:06 EST


From: Yao Yuan <yuan.yao@xxxxxxxxx>

Signed-off-by: Yao Yuan <yuan.yao@xxxxxxxxx>
Signed-off-by: Fengguang Wu <fengguang.wu@xxxxxxxxx>
---
arch/x86/kvm/mmu.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

--- linux.orig/arch/x86/kvm/mmu.c 2018-12-26 20:54:48.846720344 +0800
+++ linux/arch/x86/kvm/mmu.c 2018-12-26 20:54:48.842719614 +0800
@@ -950,6 +950,16 @@ static void mmu_free_memory_cache(struct
kmem_cache_free(cache, mc->objects[--mc->nobjs]);
}

+static unsigned long __get_dram_free_pages(gfp_t gfp_mask)
+{
+ struct page *page;
+
+ page = __alloc_pages(GFP_KERNEL_ACCOUNT, 0, numa_node_id());
+ if (!page)
+ return 0;
+ return (unsigned long) page_address(page);
+}
+
static int mmu_topup_memory_cache_page(struct kvm_mmu_memory_cache *cache,
int min)
{
@@ -958,7 +968,7 @@ static int mmu_topup_memory_cache_page(s
if (cache->nobjs >= min)
return 0;
while (cache->nobjs < ARRAY_SIZE(cache->objects)) {
- page = (void *)__get_free_page(GFP_KERNEL_ACCOUNT);
+ page = (void *)__get_dram_free_pages(GFP_KERNEL_ACCOUNT);
if (!page)
return cache->nobjs >= min ? 0 : -ENOMEM;
cache->objects[cache->nobjs++] = page;