On Wed, Dec 19, 2007 at 04:35:47PM -0600, Jon Tollefson wrote:
> Paul, please include this in 2.6.25 if there are no objections.
> 
> This patch adds the hugepagesz boot-time parameter for ppc64.  It lets
> one pick the size for huge pages. The choices available are 64K and 16M
> when the base page size is 4k. It defaults to 16M (previously the only
> only choice) if nothing or an invalid choice is specified.
> 
> Tested 64K huge pages successfully with the libhugetlbfs 1.2.
> 
> Changes from v1:
>     disallow 64K huge pages when base page size is 64K since we can't
> distinguish between
>         base and huge pages when doing a hash_page()
>     collapsed pmd_offset and pmd_alloc to inline calls to simplify the
> main code
>     removed printing of the huge page size in mm/hugetlb.c since this
> information is already
>        available in /proc/meminfo and leaves the remaining changes all
> powerpc specific

[snip]
> @@ -82,11 +81,31 @@ static int __hugepte_alloc(struct mm_struct *mm, hugepd_t 
> *hpdp,
>       return 0;
>  }
>  
> +#ifndef CONFIG_PPC_64K_PAGES
> +static inline
> +pmd_t *hpmd_offset(pud_t *pud, unsigned long addr)
> +{
> +     if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
> +             return pmd_offset(pud, addr);
> +     else
> +             return (pmd_t *) pud;
> +}
> +static inline
> +pmd_t *hpmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long addr)
> +{
> +     if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
> +             return pmd_alloc(mm, pud, addr);
> +     else
> +             return (pmd_t *) pud;
> +}
> +#endif
> +

I'm baffled by this section of code; I can't see how it can work
properly with 64k base page size.  hpmd_offset() and hpmd_alloc() are
only defined if the base page size is 4k, but they appear to be used
unconditionally in huge_pte_offset() and huge_pte_alloc() (since you
remove the #ifdef that was there).

>  /* Modelled after find_linux_pte() */
>  pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
>  {
>       pgd_t *pg;
>       pud_t *pu;
> +     pmd_t *pm;
>  
>       BUG_ON(get_slice_psize(mm, addr) != mmu_huge_psize);
>  
> @@ -96,14 +115,9 @@ pte_t *huge_pte_offset(struct mm_struct *mm, unsigned 
> long addr)
>       if (!pgd_none(*pg)) {
>               pu = pud_offset(pg, addr);
>               if (!pud_none(*pu)) {
> -#ifdef CONFIG_PPC_64K_PAGES
> -                     pmd_t *pm;
> -                     pm = pmd_offset(pu, addr);
> +                     pm = hpmd_offset(pu, addr);
>                       if (!pmd_none(*pm))
>                               return hugepte_offset((hugepd_t *)pm, addr);
> -#else
> -                     return hugepte_offset((hugepd_t *)pu, addr);
> -#endif
>               }
>       }
>  
> @@ -114,6 +128,7 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long 
> addr)
>  {
>       pgd_t *pg;
>       pud_t *pu;
> +     pmd_t *pm;
>       hugepd_t *hpdp = NULL;
>  
>       BUG_ON(get_slice_psize(mm, addr) != mmu_huge_psize);
> @@ -124,14 +139,9 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned 
> long addr)
>       pu = pud_alloc(mm, pg, addr);
>  
>       if (pu) {
> -#ifdef CONFIG_PPC_64K_PAGES
> -             pmd_t *pm;
> -             pm = pmd_alloc(mm, pu, addr);
> +             pm = hpmd_alloc(mm, pu, addr);
>               if (pm)
>                       hpdp = (hugepd_t *)pm;
> -#else
> -             hpdp = (hugepd_t *)pu;
> -#endif
>       }
>  
>       if (! hpdp)

[snip]
> diff --git a/include/asm-powerpc/pgtable.h b/include/asm-powerpc/pgtable.h
> index d18ffe7..66ff7e5 100644
> --- a/include/asm-powerpc/pgtable.h
> +++ b/include/asm-powerpc/pgtable.h
> @@ -37,6 +37,12 @@ extern void paging_init(void);
>  #define io_remap_pfn_range(vma, vaddr, pfn, size, prot)              \
>               remap_pfn_range(vma, vaddr, pfn, size, prot)
>  
> +/* Base page size affects how we walk hugetlb page tables */
> +#ifdef CONFIG_PPC_64K_PAGES
> +#define hpmd_offset(pud, addr)               pmd_offset(pud, addr)
> +#define hpmd_alloc(mm, pud, addr)    pmd_alloc(mm, pud, addr)
> +#endif

These functions are only used in hugetlbpage.c, I don't see any reason
they should go in the header file.

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to