Re: [PATCH] X86-32: Allocate 256 bytes for pgd in PAE paging

From: Thomas Gleixner
Date: Wed Dec 17 2014 - 04:15:57 EST


On Tue, 16 Dec 2014, Fenghua Yu wrote:
> @@ -1,5 +1,6 @@
> #include <linux/mm.h>
> #include <linux/gfp.h>
> +#include <linux/slab.h>
> #include <asm/pgalloc.h>
> #include <asm/pgtable.h>
> #include <asm/tlb.h>
> @@ -276,7 +277,27 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
> pgd_t *pgd;
> pmd_t *pmds[PREALLOCATED_PMDS];
>
> + /*
> + * Xen paravirt assumes pgd table should be in one page. pgd in
> + * 64 bit also needs to be in one page.
> + *
> + * But PAE without Xen only needs to allocate 256 bytes for pgd.
> + *
> + * So if kernel is compiled as PAE model without Xen, we allocate
> + * 256 bytes for pgd entries to save memory space.
> + *
> + * In other cases, one page is allocated for pgd. In theory, a kernel
> + * in PAE mode not running in Xen could allocate 256 bytes for pgd
> + * as well. But that will make the allocation and free more complex
> + * but not useful in reality. To simplify the code and testing, we just
> + * allocate one page when CONFIG_XEN is enabled regardelss kernel
> + * is running in Xen or not.
> + */
> +#if defined(CONFIG_X86_PAE) && !defined(CONFIG_XEN)
> + pgd = kmalloc(sizeof(pgdval_t) * PTRS_PER_PGD, PGALLOC_GFP);
> +#else
> pgd = (pgd_t *)__get_free_page(PGALLOC_GFP);
> +#endif
>
> if (pgd == NULL)
> goto out;
> @@ -306,7 +327,11 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
> out_free_pmds:
> free_pmds(pmds);
> out_free_pgd:
> +#if defined(CONFIG_X86_PAE) && !defined(CONFIG_XEN)
> + kfree(pgd);
> +#else
> free_page((unsigned long)pgd);
> +#endif
> out:
> return NULL;
> }
> @@ -316,7 +341,12 @@ void pgd_free(struct mm_struct *mm, pgd_t *pgd)
> pgd_mop_up_pmds(mm, pgd);
> pgd_dtor(pgd);
> paravirt_pgd_free(mm, pgd);
> +#if defined(CONFIG_X86_PAE) && !defined(CONFIG_XEN)
> + kfree(pgd);
> +#else
> free_page((unsigned long)pgd);
> +#endif

Can you make that please readable with proper inline helpers? This
#ifdef maze is horrible.

Thanks,

tglx


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/