[PATCH V2] powerpc/mm: Initialize kernel pagetable memory for PTE fragments
Aneesh Kumar K.V
aneesh.kumar at linux.ibm.com
Wed Jun 20 19:30:46 AEST 2018
On 06/20/2018 02:52 PM, Anshuman Khandual wrote:
> Kernel pagetable pages for PTE fragments never go through the standard init
> sequence which can cause inaccuracies in utilization statistics reported at
> places like /proc and /sysfs interfaces etc. Also the allocated page misses
> out on pagetable lock and page flag init as well. Fix it by making sure all
> pages allocated for either user process or kernel PTE fragments go through
> same initialization.
>
> Signed-off-by: Anshuman Khandual <khandual at linux.vnet.ibm.com>
> ---
> Changes in V2:
>
> - Call the destructor function during free for all cases
>
> arch/powerpc/mm/pgtable-book3s64.c | 27 ++++++++++++---------------
> 1 file changed, 12 insertions(+), 15 deletions(-)
>
> diff --git a/arch/powerpc/mm/pgtable-book3s64.c b/arch/powerpc/mm/pgtable-book3s64.c
> index c1f4ca4..a820ee6 100644
> --- a/arch/powerpc/mm/pgtable-book3s64.c
> +++ b/arch/powerpc/mm/pgtable-book3s64.c
> @@ -335,23 +335,21 @@ static pte_t *get_pte_from_cache(struct mm_struct *mm)
>
> static pte_t *__alloc_for_ptecache(struct mm_struct *mm, int kernel)
> {
> + gfp_t gfp_mask = PGALLOC_GFP;
> void *ret = NULL;
> struct page *page;
>
> - if (!kernel) {
> - page = alloc_page(PGALLOC_GFP | __GFP_ACCOUNT);
> - if (!page)
> - return NULL;
> - if (!pgtable_page_ctor(page)) {
> - __free_page(page);
> - return NULL;
> - }
> - } else {
> - page = alloc_page(PGALLOC_GFP);
> - if (!page)
> - return NULL;
> - }
> + if (!kernel)
> + gfp_mask |= __GFP_ACCOUNT;
>
> + page = alloc_page(gfp_mask);
> + if (!page)
> + return NULL;
> +
> + if (!pgtable_page_ctor(page)) {
> + __free_page(page);
> + return NULL;
> + }
>
> ret = page_address(page);
> /*
> @@ -391,8 +389,7 @@ void pte_fragment_free(unsigned long *table, int kernel)
> struct page *page = virt_to_page(table);
>
> if (put_page_testzero(page)) {
> - if (!kernel)
> - pgtable_page_dtor(page);
> + pgtable_page_dtor(page);
> free_unref_page(page);
> }
> }
>
If we really are going to do this, may be we can do it as
alloc_for_pmdcache, kill the kernel arg and compare against init_mm?
-aneesh
More information about the Linuxppc-dev
mailing list