BACKPORT: FROMLIST: mm: multigenerational lru: aging
The aging produces young generations. Given an lruvec, the aging traverses lruvec_memcg()->mm_list and calls walk_page_range() to scan PTEs for accessed pages. Upon finding one, the aging updates its generation number to max_seq (modulo MAX_NR_GENS). After each round of traversal, the aging increments max_seq. The aging is due when both min_seq[2] have caught up with max_seq-1. The aging uses the following optimizations when walking page tables: 1) It skips page tables of processes that have been sleeping since the last walk. 2) It skips non-leaf PMD entries that have the accessed bit cleared when CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y. 3) It does not zigzag between a PGD table and the same PMD or PTE table spanning multiple VMAs. In other words, it finishes all the VMAs within the range of the same PMD or PTE table before it returns to this PGD table. This optimizes workloads that have large numbers of tiny VMAs, especially when CONFIG_PGTABLE_LEVELS=5. Signed-off-by:Yu Zhao <yuzhao@google.com> Tested-by:
Konstantin Kharlamov <Hi-Angel@yandex.ru> (am from https://lore.kernel.org/patchwork/patch/1478360/) BUG=b:123039911 TEST=Built Change-Id: I3ae8abc3100d023cecb3a699d86020ae6fc10a45 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3132024 Tested-by:
Yu Zhao <yuzhao@chromium.org> Commit-Queue: Yu Zhao <yuzhao@chromium.org> Reviewed-by:
Sergey Senozhatsky <senozhatsky@chromium.org> Reviewed-by:
Alexandre Marciano Gimenez <raging@google.com>
Loading
Please sign in to comment