Re: [PATCH V2] mm: Introduce GFP_PGTABLE

From: Christophe Leroy
Date: Wed Jan 16 2019 - 08:47:26 EST




Le 16/01/2019 Ã 14:18, Matthew Wilcox a ÃcritÂ:
On Wed, Jan 16, 2019 at 06:42:22PM +0530, Anshuman Khandual wrote:
On 01/16/2019 06:00 PM, Matthew Wilcox wrote:
On Wed, Jan 16, 2019 at 07:57:03AM +0100, Michal Hocko wrote:
On Wed 16-01-19 11:51:32, Anshuman Khandual wrote:
All architectures have been defining their own PGALLOC_GFP as (GFP_KERNEL |
__GFP_ZERO) and using it for allocating page table pages. This causes some
code duplication which can be easily avoided. GFP_KERNEL allocated and
cleared out pages (__GFP_ZERO) are required for page tables on any given
architecture. This creates a new generic GFP flag flag which can be used
for any page table page allocation. Does not cause any functional change.

GFP_PGTABLE is being added into include/asm-generic/pgtable.h which is the
generic page tabe header just to prevent it's potential misuse as a general
allocation flag if included in include/linux/gfp.h.

I haven't reviewed the patch yet but I am wondering whether this is
really worth it without going all the way down to unify the common code
and remove much more code duplication. Or is this not possible for some
reason?

Exactly what I suggested doing in response to v1.

Also, the approach taken here is crazy. x86 has a feature that no other
architecture has bothered to implement yet -- accounting page tables
to the process. Yet instead of spreading that goodness to all other
architectures, Anshuman has gone to more effort to avoid doing that.

The basic objective for this patch is to create a common minimum allocation
flag that can be used by architectures but that still allows archs to add
on additional constraints if they see fit. This patch does not intend to
change functionality for any arch.

I disagree with your objective. Making more code common is a great idea,
but this patch is too unambitious. We should be heading towards one or
two page table allocation functions instead of having every architecture do
its own thing.

So start there. Move the x86 function into common code and convert one
other architecture to use it too.

Are we talking about pte_alloc_one_kernel() and pte_alloc_one() ?

I'm not sure x86 function is the best common one, as it seems to allocate a multiple of PAGE_SIZE only.

Some arches like powerpc use pagetables which are smaller than a page, for instance powerpc 8xx uses 4k pagetables even with 16k pages, which means a single page can be used by 4 pagetables.

Therefore, I would suggest to start with powerpc functions.

Christophe