linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/13] mm/gup: Unify hugetlb, part 2
@ 2023-12-19  7:55 peterx
  2023-12-19  7:55 ` [PATCH 01/13] mm/Kconfig: CONFIG_PGTABLE_HAS_HUGE_LEAVES peterx
                   ` (13 more replies)
  0 siblings, 14 replies; 22+ messages in thread
From: peterx @ 2023-12-19  7:55 UTC (permalink / raw)
  To: linux-kernel, linux-mm
  Cc: Matthew Wilcox, Christophe Leroy, Lorenzo Stoakes,
	David Hildenbrand, Vlastimil Babka, Mike Kravetz, Mike Rapoport,
	Christoph Hellwig, John Hubbard, Andrew Jones, linux-arm-kernel,
	Michael Ellerman, Kirill A . Shutemov, linuxppc-dev,
	Rik van Riel, linux-riscv, Yang Shi, James Houghton,
	Aneesh Kumar K . V, Andrew Morton, Jason Gunthorpe,
	Andrea Arcangeli, peterx, Axel Rasmussen

From: Peter Xu <peterx@redhat.com>

This is v1 of the series.  The series removes the hugetlb slow gup path
after a previous refactor work [1], so that slow gup now uses the exact
same path to handle all kinds of memory including hugetlb.

It's based on latest mm-unstalbe (c13bdc82ada9).

RFC->v1 (use old verion's patch index):
- Fix build for !THP and/or !HUGETLB
- Fix a bug in the hugepd path that can cause a loop
- patch 3:
  - Rename to "Make HPAGE_PXD_* macros visible even if !THP" [Christoph, MikeR]
- patch 5:
  - Posted separately as a devmap bugfix
- patch 6:
  - Add a comment above gup_huge_pd() explaining the file folio writeback
    issue, with references when anyone would extend hugepd to other types
    of file memories [Christoph]
- patch 7:
  - Keep parameter name as "page" in record_subpages(), modify the
    commit message by removing any assumption on head page. [Matthew]
- patch 12:
  - Rename to: "mm/gup: handle hugetlb in the generic follow_page_mask
    code" [Christoph]
- Added patch:
  - "mm/Kconfig: CONFIG_PGTABLE_HAS_HUGE_LEAVES", this helps to fix build
    for !THP and/or !HUGETLB
- Added patch
  - "mm/gup: Cache *pudp in follow_pud_mask()", as suggested by Christoph

For the long term, this is one small step towards merging hugetlb specific
codes into generic mm paths.  From that POV, this series removes one
reference to huge_pte_offset() out of many others.

To make it work, the generic code will need to at least understand hugepd,
which is already done like so in fast-gup.  Fortunately it seems that's the
only major thing I need to teach slow GUP to share the common path for now
besides normal huge PxD entries.  Non-gup can be more challenging, but
that's a question for later.

There's one major difference for slow-gup on cont_pte / cont_pmd handling,
currently supported on three architectures (aarch64, riscv, ppc).  Before
the series, slow gup will be able to recognize cont entries with the help
of huge_pte_offset().  Now it's gone but still working, by looking up
pgtable entries one by one.  It's not ideal, but hopefully this change
should not affect yet on major workloads.  There's some more information in
the commit message of the last patch.  If this would be a concern, we can
consider teaching slow gup to recognize cont pte/pmd entries, and that
should recover the lost performance.  But I doubt its necessity for now, so
I kept it as simple as it can be.

Test Done
=========

This v1 went through the normal GUP smoke tests over different memory
types on archs (using VM instances): x86_64, aarch64, ppc64le.  For
aarch64, tested over 64KB cont_pte huge pages.  For ppc64le, tested over
16MB hugepd entries (Power8 hash MMU on 4K base page size).

Patch layout
=============

Patch 1-7:    Preparation works, or cleanups in relevant code paths
Patch 8-12:   Teach slow gup with all kinds of huge entries (pXd, hugepd)
Patch 13:     Drop hugetlb_follow_page_mask()

More information can be found in the commit messages of each patch.  Any
comment will be welcomed.  Thanks.

[1] https://lore.kernel.org/all/20230628215310.73782-1-peterx@redhat.com

Peter Xu (13):
  mm/Kconfig: CONFIG_PGTABLE_HAS_HUGE_LEAVES
  mm/hugetlb: Declare hugetlbfs_pagecache_present() non-static
  mm: Provide generic pmd_thp_or_huge()
  mm: Make HPAGE_PXD_* macros even if !THP
  mm: Introduce vma_pgtable_walk_{begin|end}()
  mm/gup: Drop folio_fast_pin_allowed() in hugepd processing
  mm/gup: Refactor record_subpages() to find 1st small page
  mm/gup: Handle hugetlb for no_page_table()
  mm/gup: Cache *pudp in follow_pud_mask()
  mm/gup: Handle huge pud for follow_pud_mask()
  mm/gup: Handle huge pmd for follow_pmd_mask()
  mm/gup: Handle hugepd for follow_page()
  mm/gup: Handle hugetlb in the generic follow_page_mask code

 include/linux/huge_mm.h |  25 +--
 include/linux/hugetlb.h |  16 +-
 include/linux/mm.h      |   3 +
 include/linux/pgtable.h |   4 +
 mm/Kconfig              |   3 +
 mm/gup.c                | 362 ++++++++++++++++++++++++++++++++--------
 mm/huge_memory.c        | 133 +--------------
 mm/hugetlb.c            |  75 +--------
 mm/internal.h           |   7 +-
 mm/memory.c             |  12 ++
 10 files changed, 342 insertions(+), 298 deletions(-)

-- 
2.41.0



^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2024-01-02  6:31 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-19  7:55 [PATCH 00/13] mm/gup: Unify hugetlb, part 2 peterx
2023-12-19  7:55 ` [PATCH 01/13] mm/Kconfig: CONFIG_PGTABLE_HAS_HUGE_LEAVES peterx
2023-12-19  7:55 ` [PATCH 02/13] mm/hugetlb: Declare hugetlbfs_pagecache_present() non-static peterx
2023-12-19  7:55 ` [PATCH 03/13] mm: Provide generic pmd_thp_or_huge() peterx
2023-12-25  6:29   ` Muchun Song
2024-01-02  5:37     ` Peter Xu
2024-01-02  6:30       ` Muchun Song
2023-12-19  7:55 ` [PATCH 04/13] mm: Make HPAGE_PXD_* macros even if !THP peterx
2023-12-19  7:55 ` [PATCH 05/13] mm: Introduce vma_pgtable_walk_{begin|end}() peterx
2023-12-25  6:34   ` Muchun Song
     [not found]     ` <ZZOhlB-KK4hF3PgY@x1n>
2024-01-02  6:29       ` Muchun Song
2023-12-19  7:55 ` [PATCH 06/13] mm/gup: Drop folio_fast_pin_allowed() in hugepd processing peterx
2023-12-19  7:55 ` [PATCH 07/13] mm/gup: Refactor record_subpages() to find 1st small page peterx
2023-12-19  7:55 ` [PATCH 08/13] mm/gup: Handle hugetlb for no_page_table() peterx
2023-12-19  7:55 ` [PATCH 09/13] mm/gup: Cache *pudp in follow_pud_mask() peterx
2023-12-19 16:28   ` James Houghton
2023-12-20  1:43     ` Peter Xu
2023-12-19  7:55 ` [PATCH 10/13] mm/gup: Handle huge pud for follow_pud_mask() peterx
2023-12-19  7:55 ` [PATCH 11/13] mm/gup: Handle huge pmd for follow_pmd_mask() peterx
2023-12-19  7:55 ` [PATCH 12/13] mm/gup: Handle hugepd for follow_page() peterx
2023-12-19  7:55 ` [PATCH 13/13] mm/gup: Handle hugetlb in the generic follow_page_mask code peterx
2023-12-22  1:35 ` [PATCH 00/13] mm/gup: Unify hugetlb, part 2 Peter Xu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox