[PATCH V2 0/7] mm: Use pxdp_get() for accessing page table entries

Anshuman Khandual posted 7 patches 2 months, 1 week ago
arch/m68k/include/asm/page.h          |  2 +-
arch/x86/include/asm/pgtable-3level.h | 12 ++--
arch/x86/include/asm/pgtable_64.h     | 20 +++---
drivers/misc/sgi-gru/grufault.c       | 13 ++--
fs/proc/task_mmu.c                    | 28 +++++----
fs/userfaultfd.c                      |  6 +-
include/linux/huge_mm.h               |  6 +-
include/linux/mm.h                    |  6 +-
include/linux/pgtable.h               | 49 +++++++++------
kernel/events/core.c                  |  6 +-
mm/gup.c                              | 43 ++++++-------
mm/hmm.c                              |  2 +-
mm/huge_memory.c                      | 90 +++++++++++++++------------
mm/hugetlb.c                          | 10 +--
mm/hugetlb_vmemmap.c                  |  4 +-
mm/kasan/init.c                       | 38 +++++------
mm/kasan/shadow.c                     | 12 ++--
mm/khugepaged.c                       |  4 +-
mm/madvise.c                          |  6 +-
mm/mapping_dirty_helpers.c            |  2 +-
mm/memory-failure.c                   | 14 ++---
mm/memory.c                           | 71 +++++++++++----------
mm/mempolicy.c                        |  4 +-
mm/migrate.c                          |  4 +-
mm/migrate_device.c                   | 10 +--
mm/mlock.c                            |  6 +-
mm/mprotect.c                         |  2 +-
mm/mremap.c                           |  4 +-
mm/page_table_check.c                 |  4 +-
mm/page_vma_mapped.c                  |  6 +-
mm/pagewalk.c                         | 10 +--
mm/percpu.c                           |  8 +--
mm/pgalloc-track.h                    |  6 +-
mm/pgtable-generic.c                  | 30 ++++-----
mm/ptdump.c                           |  8 +--
mm/rmap.c                             | 10 +--
mm/sparse-vmemmap.c                   | 10 +--
mm/vmalloc.c                          | 58 +++++++++--------
mm/vmscan.c                           |  6 +-
39 files changed, 333 insertions(+), 297 deletions(-)
[PATCH V2 0/7] mm: Use pxdp_get() for accessing page table entries
Posted by Anshuman Khandual 2 months, 1 week ago
This series converts all generic page table entries direct derefences via
pxdp_get() based helpers extending the changes brought in via the commit
c33c794828f2 ("mm: ptep_get() conversion"). First it does some platform
specific changes for m68k and x86 architecture.

This series has been build tested on multiple architecture such as x86,
arm64, powerpc, powerpc64le, riscv, and m68k etc.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: "Mike Rapoport (IBM)" <rppt@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: x86@kernel.org
Cc: linux-m68k@lists.linux-m68k.org
Cc: linux-mm@kvack.org
Cc: linux-fsdevel@vger.kernel.org
Cc: kasan-dev@googlegroups.com
Cc: linux-kernel@vger.kernel.org
Cc: linux-perf-users@vger.kernel.org
Cc: kasan-dev@googlegroups.com

Changes in V2:

- Separated out PUD changes from P4D changes
- Updated the commit message for x86 patch per Dave
- Implemented local variable page table value caching when applicable
- Updated all commit messages regarding local variable caching

Changes in V1:

https://lore.kernel.org/all/20240913084433.1016256-1-anshuman.khandual@arm.com/

Anshuman Khandual (7):
  m68k/mm: Change pmd_val()
  x86/mm: Drop page table entry address output from pxd_ERROR()
  mm: Use ptep_get() for accessing PTE entries
  mm: Use pmdp_get() for accessing PMD entries
  mm: Use pudp_get() for accessing PUD entries
  mm: Use p4dp_get() for accessing P4D entries
  mm: Use pgdp_get() for accessing PGD entries

 arch/m68k/include/asm/page.h          |  2 +-
 arch/x86/include/asm/pgtable-3level.h | 12 ++--
 arch/x86/include/asm/pgtable_64.h     | 20 +++---
 drivers/misc/sgi-gru/grufault.c       | 13 ++--
 fs/proc/task_mmu.c                    | 28 +++++----
 fs/userfaultfd.c                      |  6 +-
 include/linux/huge_mm.h               |  6 +-
 include/linux/mm.h                    |  6 +-
 include/linux/pgtable.h               | 49 +++++++++------
 kernel/events/core.c                  |  6 +-
 mm/gup.c                              | 43 ++++++-------
 mm/hmm.c                              |  2 +-
 mm/huge_memory.c                      | 90 +++++++++++++++------------
 mm/hugetlb.c                          | 10 +--
 mm/hugetlb_vmemmap.c                  |  4 +-
 mm/kasan/init.c                       | 38 +++++------
 mm/kasan/shadow.c                     | 12 ++--
 mm/khugepaged.c                       |  4 +-
 mm/madvise.c                          |  6 +-
 mm/mapping_dirty_helpers.c            |  2 +-
 mm/memory-failure.c                   | 14 ++---
 mm/memory.c                           | 71 +++++++++++----------
 mm/mempolicy.c                        |  4 +-
 mm/migrate.c                          |  4 +-
 mm/migrate_device.c                   | 10 +--
 mm/mlock.c                            |  6 +-
 mm/mprotect.c                         |  2 +-
 mm/mremap.c                           |  4 +-
 mm/page_table_check.c                 |  4 +-
 mm/page_vma_mapped.c                  |  6 +-
 mm/pagewalk.c                         | 10 +--
 mm/percpu.c                           |  8 +--
 mm/pgalloc-track.h                    |  6 +-
 mm/pgtable-generic.c                  | 30 ++++-----
 mm/ptdump.c                           |  8 +--
 mm/rmap.c                             | 10 +--
 mm/sparse-vmemmap.c                   | 10 +--
 mm/vmalloc.c                          | 58 +++++++++--------
 mm/vmscan.c                           |  6 +-
 39 files changed, 333 insertions(+), 297 deletions(-)

-- 
2.25.1
Re: [PATCH V2 0/7] mm: Use pxdp_get() for accessing page table entries
Posted by Christophe Leroy 2 months ago

Le 17/09/2024 à 09:31, Anshuman Khandual a écrit :
> This series converts all generic page table entries direct derefences via
> pxdp_get() based helpers extending the changes brought in via the commit
> c33c794828f2 ("mm: ptep_get() conversion"). First it does some platform
> specific changes for m68k and x86 architecture.
> 
> This series has been build tested on multiple architecture such as x86,
> arm64, powerpc, powerpc64le, riscv, and m68k etc.

Seems like this series imply sub-optimal code with unnecessary reads.

Lets take a simple exemple : function mm_find_pmd() in mm/rmap.c

On a PPC32 platform (2 level pagetables):

Before the patch:

00001b54 <mm_find_pmd>:
     1b54:	80 63 00 18 	lwz     r3,24(r3)
     1b58:	54 84 65 3a 	rlwinm  r4,r4,12,20,29
     1b5c:	7c 63 22 14 	add     r3,r3,r4
     1b60:	4e 80 00 20 	blr

Here, the function reads mm->pgd, then calculates and returns a pointer 
to the PMD entry corresponding to the address.

After the patch:

00001b54 <mm_find_pmd>:
     1b54:	81 23 00 18 	lwz     r9,24(r3)
     1b58:	54 84 65 3a 	rlwinm  r4,r4,12,20,29
     1b5c:	7d 49 20 2e 	lwzx    r10,r9,r4	<= useless read
     1b60:	7c 69 22 14 	add     r3,r9,r4
     1b64:	7d 49 20 2e 	lwzx    r10,r9,r4	<= useless read
     1b68:	7d 29 20 2e 	lwzx    r9,r9,r4	<= useless read
     1b6c:	4e 80 00 20 	blr

Here, the function also reads mm->pgd and still calculates and returns a 
pointer to the PMD entry corresponding to the address. But in addition 
to that it reads three times that entry while doing nothing at all with 
the value read.

On PPC32, PMD/PUD/P4D are single entry tables folded into the 
corresponding PGD entry, it is therefore pointless to read the 
intermediate entries.

Christophe