[RFC] powerpc/mm: Enable gigantic HugeTLB page support for powernv

Aneesh Kumar K.V aneesh.kumar at linux.vnet.ibm.com
Wed Jul 5 13:42:08 AEST 2017



On Tuesday 04 July 2017 04:16 PM, Anshuman Khandual wrote:
> All the functionality for memblock allocation during boot was
> already present in Book3e and embeded platforms. This change
> just moves around some code under config conditions to make
> the function happen on powernv platforms.
> 
> Signed-off-by: Anshuman Khandual <khandual at linux.vnet.ibm.com>
> ---
> Tested lightly on both powernv and pseries platforms with two
> 16GB pages. Will appreciate comments and suggestions on the
> approach.
> 
> On PowerNV while asking for 16GB pages through kernel command
> line, we need to be careful not to starve the system of memory
> which can make it unable to boot.

I have a patch series that does this here. How is this different ?

http://mid.gmane.org/1496327441-7368-1-git-send-email- 
aneesh.kumar at linux.vnet.ibm.com




> 
>   arch/powerpc/include/asm/hugetlb.h |  2 +-
>   arch/powerpc/mm/hash_utils_64.c    |  8 ++---
>   arch/powerpc/mm/hugetlbpage.c      | 66 ++++++++++++++++++++------------------
>   3 files changed, 39 insertions(+), 37 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/hugetlb.h b/arch/powerpc/include/asm/hugetlb.h
> index 7f4025a..b0c1464 100644
> --- a/arch/powerpc/include/asm/hugetlb.h
> +++ b/arch/powerpc/include/asm/hugetlb.h
> @@ -224,7 +224,7 @@ static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
>    * the .dts as on IBM platforms.
>    */
>   #if defined(CONFIG_HUGETLB_PAGE) && (defined(CONFIG_PPC_FSL_BOOK3E) || \
> -    defined(CONFIG_PPC_8xx))
> +    defined(CONFIG_PPC_8xx) || defined(CONFIG_PPC_POWERNV))
>   extern void __init reserve_hugetlb_gpages(void);
>   #else
>   static inline void reserve_hugetlb_gpages(void)
> diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
> index a3f1e7d..7862fdb 100644
> --- a/arch/powerpc/mm/hash_utils_64.c
> +++ b/arch/powerpc/mm/hash_utils_64.c
> @@ -473,7 +473,7 @@ static int __init htab_dt_scan_page_sizes(unsigned long node,
>   	return 1;
>   }
> 
> -#ifdef CONFIG_HUGETLB_PAGE
> +#if defined(CONFIG_HUGETLB_PAGE) && !defined(CONFIG_PPC_POWERNV)
>   /* Scan for 16G memory blocks that have been set aside for huge pages
>    * and reserve those blocks for 16G huge pages.
>    */
> @@ -513,7 +513,7 @@ static int __init htab_dt_scan_hugepage_blocks(unsigned long node,
>   	}
>   	return 0;
>   }
> -#endif /* CONFIG_HUGETLB_PAGE */
> +#endif /* CONFIG_HUGETLB_PAGE && !CONFIG_PPC_POWERNV*/
> 
>   static void mmu_psize_set_default_penc(void)
>   {
> @@ -566,10 +566,10 @@ static void __init htab_scan_page_sizes(void)
>   		       sizeof(mmu_psize_defaults_gp));
>   	}
> 
> -#ifdef CONFIG_HUGETLB_PAGE
> +#if defined(CONFIG_HUGETLB_PAGE) && !defined(CONFIG_PPC_POWERNV)
>   	/* Reserve 16G huge page memory sections for huge pages */
>   	of_scan_flat_dt(htab_dt_scan_hugepage_blocks, NULL);
> -#endif /* CONFIG_HUGETLB_PAGE */
> +#endif /* CONFIG_HUGETLB_PAGE && !CONFIG_PPC_POWERNV */
>   }
> 
>   /*
> diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c
> index a4f33de..be0be5d 100644
> --- a/arch/powerpc/mm/hugetlbpage.c
> +++ b/arch/powerpc/mm/hugetlbpage.c
> @@ -258,6 +258,40 @@ int alloc_bootmem_huge_page(struct hstate *hstate)
> 
>   	return 1;
>   }
> +#else /* !PPC_FSL_BOOK3E */
> +
> +/* Build list of addresses of gigantic pages.  This function is used in early
> + * boot before the buddy allocator is setup.
> + */
> +void add_gpage(u64 addr, u64 page_size, unsigned long number_of_pages)
> +{
> +	if (!addr)
> +		return;
> +	while (number_of_pages > 0) {
> +		gpage_freearray[nr_gpages] = addr;
> +		nr_gpages++;
> +		number_of_pages--;
> +		addr += page_size;
> +	}
> +}
> +
> +/* Moves the gigantic page addresses from the temporary list to the
> + * huge_boot_pages list.
> + */
> +int alloc_bootmem_huge_page(struct hstate *hstate)
> +{
> +	struct huge_bootmem_page *m;
> +	if (nr_gpages == 0)
> +		return 0;
> +	m = phys_to_virt(gpage_freearray[--nr_gpages]);
> +	gpage_freearray[nr_gpages] = 0;
> +	list_add(&m->list, &huge_boot_pages);
> +	m->hstate = hstate;
> +	return 1;
> +}
> +#endif
> +
> +#if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_8xx) || defined(CONFIG_PPC_POWERNV)
>   /*
>    * Scan the command line hugepagesz= options for gigantic pages; store those in
>    * a list that we use to allocate the memory once all options are parsed.
> @@ -339,38 +373,6 @@ void __init reserve_hugetlb_gpages(void)
>   		add_gpage(base, size, gpage_npages[i]);
>   	}
>   }
> -
> -#else /* !PPC_FSL_BOOK3E */
> -
> -/* Build list of addresses of gigantic pages.  This function is used in early
> - * boot before the buddy allocator is setup.
> - */
> -void add_gpage(u64 addr, u64 page_size, unsigned long number_of_pages)
> -{
> -	if (!addr)
> -		return;
> -	while (number_of_pages > 0) {
> -		gpage_freearray[nr_gpages] = addr;
> -		nr_gpages++;
> -		number_of_pages--;
> -		addr += page_size;
> -	}
> -}
> -
> -/* Moves the gigantic page addresses from the temporary list to the
> - * huge_boot_pages list.
> - */
> -int alloc_bootmem_huge_page(struct hstate *hstate)
> -{
> -	struct huge_bootmem_page *m;
> -	if (nr_gpages == 0)
> -		return 0;
> -	m = phys_to_virt(gpage_freearray[--nr_gpages]);
> -	gpage_freearray[nr_gpages] = 0;
> -	list_add(&m->list, &huge_boot_pages);
> -	m->hstate = hstate;
> -	return 1;
> -}
>   #endif
> 
>   #if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_8xx)
> 



More information about the Linuxppc-dev mailing list