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 majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/