LKML Archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/32] mm: allow pte_offset_map[_lock]() to fail
@ 2023-06-09  0:54 Hugh Dickins
  2023-06-09  1:06 ` [PATCH v2 01/32] mm: use pmdp_get_lockless() without surplus barrier() Hugh Dickins
                   ` (32 more replies)
  0 siblings, 33 replies; 67+ messages in thread
From: Hugh Dickins @ 2023-06-09  0:54 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Mike Kravetz, Mike Rapoport, Kirill A. Shutemov, Matthew Wilcox,
	David Hildenbrand, Suren Baghdasaryan, Qi Zheng, Yang Shi,
	Mel Gorman, Peter Xu, Peter Zijlstra, Will Deacon, Yu Zhao,
	Alistair Popple, Ralph Campbell, Ira Weiny, Steven Price,
	SeongJae Park, Lorenzo Stoakes, Huang Ying, Naoya Horiguchi,
	Christophe Leroy, Zack Rusin, Jason Gunthorpe, Axel Rasmussen,
	Anshuman Khandual, Pasha Tatashin, Miaohe Lin, Minchan Kim,
	Christoph Hellwig, Song Liu, Thomas Hellstrom, Ryan Roberts,
	linux-kernel, linux-mm

Here is v2 series of patches to mm, based on v6.4-rc5: preparing for
v2 effective changes to follow, probably next week (when I hope s390
will be sorted), affecting pte_offset_map() and pte_offset_map_lock().
There are very few differences from v1: noted patch by patch below.

This follows on from the v2 "arch: allow pte_offset_map[_lock]() to fail"
https://lore.kernel.org/linux-mm/a4963be9-7aa6-350-66d0-2ba843e1af44@google.com/
series of 23 posted on 2023-06-08,
replaces the v1 "mm: allow pte_offset_map[_lock]() to fail"
https://lore.kernel.org/linux-mm/68a97fbe-5c1e-7ac6-72c-7b9c6290b370@google.com/
series of 31 posted on 2023-05-21,
which was followed by the v1 "mm: free retracted page table by RCU"
https://lore.kernel.org/linux-mm/35e983f5-7ed3-b310-d949-9ae8b130cdab@google.com/
series of 12 posted on 2023-05-28.

The first two series are "independent":
neither depends for build or correctness on the other, but both series
must in before the third series is added to make the effective changes
(and it may be preferred to hold that one until the following release).

What is it all about?  Some mmap_lock avoidance i.e. latency reduction.
Initially just for the case of collapsing shmem or file pages to THPs;
but likely to be relied upon later in other contexts e.g. freeing of
empty page tables (but that's not work I'm doing).  mmap_write_lock
avoidance when collapsing to anon THPs?  Perhaps, but again that's not
work I've done: a quick attempt was not as easy as the shmem/file case.

I would much prefer not to have to make these small but wide-ranging
changes for such a niche case; but failed to find another way, and
have heard that shmem MADV_COLLAPSE's usefulness is being limited by
that mmap_write_lock it currently requires.

These changes (though of course not these exact patches) have been in
Google's data centre kernel for three years now: we do rely upon them.

What is this preparatory series about?

The current mmap locking will not be enough to guard against that
tricky transition between pmd entry pointing to page table, and empty
pmd entry, and pmd entry pointing to huge page: pte_offset_map() will
have to validate the pmd entry for itself, returning NULL if no page
table is there.  What to do about that varies: sometimes nearby error
handling indicates just to skip it; but in many cases an ACTION_AGAIN or
"goto again" is appropriate (and if that risks an infinite loop, then
there must have been an oops, or pfn 0 mistaken for page table, before).

Given the likely extension to freeing empty page tables, I have not
limited this set of changes to a THP config; and it has been easier,
and sets a better example, if each site is given appropriate handling:
even where deeper study might prove that failure could only happen if
the pmd table were corrupted.

Several of the patches are, or include, cleanup on the way; and by the
end, pmd_trans_unstable() and suchlike are deleted: pte_offset_map() and
pte_offset_map_lock() then handle those original races and more.  Most
uses of pte_lockptr() are deprecated, with pte_offset_map_nolock()
taking its place.

This posting is based on v6.4-rc5, but good for any v6.4-rc; and good
for current mm-everything and linux-next, except for one minor clash in
mm/memory.c do_swap_page(), where Ryan Roberts and I fixed the same goto.

01/32 mm: use pmdp_get_lockless() without surplus barrier()
      v2: add acks from Yu Zhao and PeterX
02/32 mm/migrate: remove cruft from migration_entry_wait()s
      v2: add review from Alistair
03/32 mm/pgtable: kmap_local_page() instead of kmap_atomic()
      v2: same as v1
04/32 mm/pgtable: allow pte_offset_map[_lock]() to fail
      v2: same as v1
05/32 mm/filemap: allow pte_offset_map_lock() to fail
      v2: same as v1
06/32 mm/page_vma_mapped: delete bogosity in page_vma_mapped_walk()
      v2: same as v1
07/32 mm/page_vma_mapped: reformat map_pte() with less indentation
      v2: same as v1
08/32 mm/page_vma_mapped: pte_offset_map_nolock() not pte_lockptr()
      v2: same as v1
09/32 mm/pagewalkers: ACTION_AGAIN if pte_offset_map_lock() fails
      v2: add review from SeongJae for mm/damon part
10/32 mm/pagewalk: walk_pte_range() allow for pte_offset_map()
      v2: same as v1
11/32 mm/vmwgfx: simplify pmd & pud mapping dirty helpers
      v2: same as v1
12/32 mm/vmalloc: vmalloc_to_page() use pte_offset_kernel()
      v2: add review from Lorenzo
13/32 mm/hmm: retry if pte_offset_map() fails
      v2: add review from Alistair
14/32 fs/userfaultfd: retry if pte_offset_map() fails
      v2: add ack from PeterX
15/32 mm/userfaultfd: allow pte_offset_map_lock() to fail
      v2: use -EAGAIN instead of -EFAULT from PeterX
16/32 mm/debug_vm_pgtable,page_table_check: warn pte map fails
      v2: same as v1
17/32 mm/various: give up if pte_offset_map[_lock]() fails
      v2: removed mm/swap_state.c mod to a separate patch 31/32
18/32 mm/mprotect: delete pmd_none_or_clear_bad_unless_transhuge()
      v2: same as v1
19/32 mm/mremap: retry if either pte_offset_map_*lock() fails
      v2: same as v1
20/32 mm/madvise: clean up pte_offset_map_lock() scans
      v2: same as v1
21/32 mm/madvise: clean up force_shm_swapin_readahead()
      v2: same as v1
22/32 mm/swapoff: allow pte_offset_map[_lock]() to fail
      v2: same as v1
23/32 mm/mglru: allow pte_offset_map_nolock() to fail
      v2: add ack from Yu Zhao
24/32 mm/migrate_device: allow pte_offset_map_lock() to fail
      v2: add review from Alistair
25/32 mm/gup: remove FOLL_SPLIT_PMD use of pmd_trans_unstable()
      v2: add comment on -EBUSY from Yang Shi
26/32 mm/huge_memory: split huge pmd under one pte_offset_map()
      v2: add review from Yang Shi
27/32 mm/khugepaged: allow pte_offset_map[_lock]() to fail
      v2: add review from Yang Shi
28/32 mm/memory: allow pte_offset_map[_lock]() to fail
      v2: same as v1
29/32 mm/memory: handle_pte_fault() use pte_offset_map_nolock()
      v2: same as v1
30/32 mm/pgtable: delete pmd_trans_unstable() and friends
      v2: same as v1
31/32 mm/swap: swap_vma_readahead() do the pte_offset_map()
      v2: new patch replacing last part of v1 17/31
32/32 perf/core: Allow pte_offset_map() to fail
      v2: same as v1 31/31

 Documentation/mm/split_page_table_lock.rst |  17 ++-
 fs/proc/task_mmu.c                         |  32 ++---
 fs/userfaultfd.c                           |  21 +--
 include/linux/migrate.h                    |   4 +-
 include/linux/mm.h                         |  27 ++--
 include/linux/pgtable.h                    | 142 +++---------------
 include/linux/swap.h                       |  19 ---
 include/linux/swapops.h                    |  17 +--
 kernel/events/core.c                       |   4 +
 mm/damon/vaddr.c                           |  12 +-
 mm/debug_vm_pgtable.c                      |   9 +-
 mm/filemap.c                               |  25 ++--
 mm/gup.c                                   |  34 ++---
 mm/hmm.c                                   |   4 +-
 mm/huge_memory.c                           |  33 +++--
 mm/khugepaged.c                            |  83 ++++++-----
 mm/ksm.c                                   |  10 +-
 mm/madvise.c                               | 146 ++++++++++---------
 mm/mapping_dirty_helpers.c                 |  34 ++---
 mm/memcontrol.c                            |   8 +-
 mm/memory-failure.c                        |   8 +-
 mm/memory.c                                | 224 +++++++++++++----------------
 mm/mempolicy.c                             |   7 +-
 mm/migrate.c                               |  40 +++---
 mm/migrate_device.c                        |  31 +---
 mm/mincore.c                               |   9 +-
 mm/mlock.c                                 |   4 +
 mm/mprotect.c                              |  79 +++-------
 mm/mremap.c                                |  28 ++--
 mm/page_table_check.c                      |   2 +
 mm/page_vma_mapped.c                       |  97 +++++++------
 mm/pagewalk.c                              |  33 +++--
 mm/pgtable-generic.c                       |  56 ++++++++
 mm/swap_state.c                            |  45 +++---
 mm/swapfile.c                              |  38 ++---
 mm/userfaultfd.c                           |   8 ++
 mm/vmalloc.c                               |   3 +-
 mm/vmscan.c                                |  16 +--
 38 files changed, 662 insertions(+), 747 deletions(-)

Hugh

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

end of thread, other threads:[~2023-08-11  8:01 UTC | newest]

Thread overview: 67+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-09  0:54 [PATCH v2 00/32] mm: allow pte_offset_map[_lock]() to fail Hugh Dickins
2023-06-09  1:06 ` [PATCH v2 01/32] mm: use pmdp_get_lockless() without surplus barrier() Hugh Dickins
2023-06-09  1:08 ` [PATCH v2 02/32] mm/migrate: remove cruft from migration_entry_wait()s Hugh Dickins
2023-06-09  1:09 ` [PATCH v2 03/32] mm/pgtable: kmap_local_page() instead of kmap_atomic() Hugh Dickins
2023-06-09  1:10 ` [PATCH v2 04/32] mm/pgtable: allow pte_offset_map[_lock]() to fail Hugh Dickins
2023-07-11  1:23   ` Zi Yan
2023-07-28 13:53   ` Yongqin Liu
2023-07-28 14:05     ` Matthew Wilcox
2023-07-28 16:58       ` Hugh Dickins
2023-08-05 16:06         ` Yongqin Liu
2023-08-05 17:07           ` Matthew Wilcox
2023-08-08  0:29             ` John Hubbard
2023-06-09  1:11 ` [PATCH v2 05/32] mm/filemap: allow pte_offset_map_lock() " Hugh Dickins
2023-07-11  1:34   ` Zi Yan
2023-07-11  5:21     ` Hugh Dickins
2023-06-09  1:12 ` [PATCH v2 06/32] mm/page_vma_mapped: delete bogosity in page_vma_mapped_walk() Hugh Dickins
2023-07-11  1:47   ` Zi Yan
2023-06-09  1:14 ` [PATCH v2 07/32] mm/page_vma_mapped: reformat map_pte() with less indentation Hugh Dickins
2023-07-11  1:56   ` Zi Yan
2023-06-09  1:15 ` [PATCH v2 08/32] mm/page_vma_mapped: pte_offset_map_nolock() not pte_lockptr() Hugh Dickins
2023-06-09  1:17 ` [PATCH v2 09/32] mm/pagewalkers: ACTION_AGAIN if pte_offset_map_lock() fails Hugh Dickins
2023-06-09  1:18 ` [PATCH v2 10/32] mm/pagewalk: walk_pte_range() allow for pte_offset_map() Hugh Dickins
2023-06-09  1:20 ` [PATCH v2 11/32] mm/vmwgfx: simplify pmd & pud mapping dirty helpers Hugh Dickins
2023-06-09  1:21 ` [PATCH v2 12/32] mm/vmalloc: vmalloc_to_page() use pte_offset_kernel() Hugh Dickins
2023-07-10 14:42   ` Mark Brown
2023-07-10 17:18     ` Lorenzo Stoakes
2023-07-10 17:33       ` Mark Brown
2023-07-11  4:34         ` Hugh Dickins
2023-07-11 15:34           ` Mark Brown
2023-07-11 16:13             ` Hugh Dickins
2023-07-11 16:34               ` Mark Brown
2023-07-11 17:57               ` Mark Brown
2023-07-13 11:19                 ` Linux regression tracking #update (Thorsten Leemhuis)
2023-07-20 10:32                 ` Will Deacon
2023-07-20 12:06                   ` Mark Brown
2023-08-08  5:52                     ` Linux regression tracking (Thorsten Leemhuis)
2023-08-08 11:09                       ` Mark Brown
2023-08-11  8:00                         ` Linux regression tracking #update (Thorsten Leemhuis)
2023-07-11 14:48     ` Linux regression tracking #adding (Thorsten Leemhuis)
2023-06-09  1:23 ` [PATCH v2 13/32] mm/hmm: retry if pte_offset_map() fails Hugh Dickins
2023-06-09  1:24 ` [PATCH v2 14/32] mm/userfaultfd: " Hugh Dickins
2023-06-09  1:26 ` [PATCH v2 15/32] mm/userfaultfd: allow pte_offset_map_lock() to fail Hugh Dickins
2023-06-09  1:27 ` [PATCH v2 16/32] mm/debug_vm_pgtable,page_table_check: warn pte map fails Hugh Dickins
2023-06-09  1:29 ` [PATCH v2 17/32] mm/various: give up if pte_offset_map[_lock]() fails Hugh Dickins
2023-06-09  1:30 ` [PATCH v2 18/32] mm/mprotect: delete pmd_none_or_clear_bad_unless_trans_huge() Hugh Dickins
2023-06-09  1:32 ` [PATCH v2 19/32] mm/mremap: retry if either pte_offset_map_*lock() fails Hugh Dickins
2023-06-09  1:34 ` [PATCH v2 20/32] mm/madvise: clean up pte_offset_map_lock() scans Hugh Dickins
2023-06-09  1:35 ` [PATCH v2 21/32] mm/madvise: clean up force_shm_swapin_readahead() Hugh Dickins
2023-06-09  1:36 ` [PATCH v2 22/32] mm/swapoff: allow pte_offset_map[_lock]() to fail Hugh Dickins
2023-06-09  1:37 ` [PATCH v2 23/32] mm/mglru: allow pte_offset_map_nolock() " Hugh Dickins
2023-06-09  1:38 ` [PATCH v2 24/32] mm/migrate_device: allow pte_offset_map_lock() " Hugh Dickins
2023-06-09  1:39 ` [PATCH v2 25/32] mm/gup: remove FOLL_SPLIT_PMD use of pmd_trans_unstable() Hugh Dickins
2023-06-09 18:24   ` Yang Shi
2023-06-09  1:41 ` [PATCH v2 26/32] mm/huge_memory: split huge pmd under one pte_offset_map() Hugh Dickins
2023-06-09  1:42 ` [PATCH v2 27/32] mm/khugepaged: allow pte_offset_map[_lock]() to fail Hugh Dickins
2023-06-09  1:43 ` [PATCH v2 28/32] mm/memory: " Hugh Dickins
2023-06-09 20:06   ` Andrew Morton
2023-06-09 20:11     ` Hugh Dickins
2023-06-12  9:10       ` Ryan Roberts
2023-06-15 23:10   ` [PATCH v2 28/32 fix] mm/memory: allow pte_offset_map[_lock]() to fail: fix Hugh Dickins
2023-06-09  1:45 ` [PATCH v2 29/32] mm/memory: handle_pte_fault() use pte_offset_map_nolock() Hugh Dickins
2023-06-09  1:50 ` [PATCH v2 30/32] mm/pgtable: delete pmd_trans_unstable() and friends Hugh Dickins
2023-06-09  1:52 ` [PATCH v2 31/32] mm/swap: swap_vma_readahead() do the pte_offset_map() Hugh Dickins
2023-06-12  8:03   ` Huang, Ying
2023-06-14  3:58     ` Hugh Dickins
2023-06-09  1:53 ` [PATCH v2 32/32] perf/core: Allow pte_offset_map() to fail Hugh Dickins
2023-06-20  6:50 ` [PATCH] mm/swapfile: delete outdated pte_offset_map() comment Hugh Dickins

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).