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

From: Aneesh Kumar K.V
Date: Tue Jan 01 2019 - 04:23:54 EST


Fengguang Wu <fengguang.wu@xxxxxxxxx> writes:

> 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);
> +}
> +

May be it is explained in other patches. What is preventing the
allocation from pmem here? Is it that we are not using the memory
policy prefered node id and hence the zone list we built won't have the
PMEM node?


> 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;

-aneesh