This code makes Lorenzo and Andrew sad every time I fix a bug in it, and there's been [1,2,3,4] bugs of various severety in a single userland reachable function in a single month.
Unfortunately this code is an unreviewable nest of... nesting. Lets fix that. The self tests are not intended to be merged en-masse, they are to ensure the implementation details have not changed during the refactor so that we may tear the refactored code apart for even more nasty stuff. The self tests originated as 28 individual commits, but it's been truncated to a single commit for the first go around to reduce noise / pressure on folks inboxes. Some of the tests may even surprise and confuse! Good! The code is confusing! [1] https://lore.kernel.org/linux-mm/[email protected]/ [2] https://lore.kernel.org/linux-mm/[email protected]/ [3] https://lore.kernel.org/linux-mm/[email protected]/ [4] https://lore.kernel.org/linux-mm/[email protected]/ === actual cover letter === MADV_COLD and MADV_PAGEOUT share a page-table walker that handles huge PMDs, PTE-mapped large folios, ordinary PTEs, folio splitting and deferred PAGEOUT reclaim in one function. The resulting control flow makes page-table lock ownership and split retries difficult to audit. This series adds 28 focused selftests before changing the implementation. They cover full and partial advice at PMD and PTE granularity, shared and pinned folios, active and unevictable folios, zero pages, swap entries, PTE holes, file-page permissions, concurrent split attempts and NUMA migration. The implementation separates huge-PMD handling, PTE batching, PTE-lock ownership and shared walk setup. The existing periodic scheduling point is preserved through the outer lock-ownership loop. Helpers shared only by MADV_COLD and MADV_PAGEOUT use the madvise_lru prefix. Some test data: All 28 selftests passed before and after the refactor. Some of the race conditions are flakey due to being race conditions. LTP madvise01 passed all 20 cases and process_madvise01 passed on both implementations. GCov data of ktests before and after refactor: executable lines branch edges taken before rewrite 179/181 (98.9%) 106/120 (88.3%) after rewrite 168/168 (100%) 112/118 (94.9%) The last 6 branch edges remain untaken: - a large anonymous COW folio in an unauthorized private-file VMA - ZONE_DEVICE folios at PTE and PMD level (note that PMD zone_device is unreachable) - the warning edge for an invalid PMD softleaf - a pending fatal signal. Gregory Price (10): selftests/mm: exercise MADV_COLD and MADV_PAGEOUT mm/madvise: name the shared LRU PMD callback mm/madvise: factor shared LRU folio handling mm/madvise: use the PMD softleaf validity helper mm/madvise: factor huge-PMD folio processing mm/madvise: separate huge PMDs from the PTE walk mm/madvise: separate PTE-batch folio processing mm/madvise: separate the PTL-held PTE scan mm/madvise: make cold and pageout PTE lock ownership explicit mm/madvise: share cold and pageout walk setup mm/madvise.c | 462 +++--- tools/testing/selftests/mm/Makefile | 2 + tools/testing/selftests/mm/ksft_madvise.sh | 4 + tools/testing/selftests/mm/madvise.c | 1673 ++++++++++++++++++++ tools/testing/selftests/mm/run_vmtests.sh | 5 + tools/testing/selftests/mm/vm_util.c | 4 +- tools/testing/selftests/mm/vm_util.h | 6 + 7 files changed, 1934 insertions(+), 222 deletions(-) create mode 100755 tools/testing/selftests/mm/ksft_madvise.sh create mode 100644 tools/testing/selftests/mm/madvise.c -- 2.53.0-Meta base-commit: 854157fc9d011b8dd5a1a86a237447e28d681eb9

