a patch from the multi gen lru patch series author (yu zhao) to fix some problems i saw on armv7l and some compile problems i saw on aarch64 with CONFIG_CC_OPTIMIZE_FOR_SIZE enabled "Thanks for the report. Please try the attached patch -- it should fix both of the problems. We routinely test the MGLRU patchset on both 32-bit and 64-bit ARM CPUs. Our configs and compiler are different. The build error smells like a gcc bug. It doesn't happen with clang. The crash on 32-bit happens when CONFIG_PGTABLE_LEVELS=2. Mine is unfortunately set to 3. Please feel free to let me know if there is anything else I can do to help." diff --git a/mm/Kconfig b/mm/Kconfig index 05291697055a..e2e0be0d2e33 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -915,6 +915,7 @@ config LRU_GEN depends on MMU # make sure folio->flags has enough spare bits depends on 64BIT || !SPARSEMEM || SPARSEMEM_VMEMMAP + default y help A high performance LRU implementation to overcommit memory. See Documentation/admin-guide/mm/multigen_lru.rst for details. @@ -922,6 +923,7 @@ config LRU_GEN config LRU_GEN_ENABLED bool "Enable by default" depends on LRU_GEN + default y help This option enables the multi-gen LRU by default. diff --git a/mm/vmscan.c b/mm/vmscan.c index 479cf221b59d..fe0c6475a6b4 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2993,8 +2993,10 @@ static bool can_age_anon_pages(struct pglist_data *pgdat, #ifdef CONFIG_LRU_GEN_ENABLED DEFINE_STATIC_KEY_ARRAY_TRUE(lru_gen_caps, NR_LRU_GEN_CAPS); +#define get_cap(cap) static_branch_likely(&lru_gen_caps[cap]) #else DEFINE_STATIC_KEY_ARRAY_FALSE(lru_gen_caps, NR_LRU_GEN_CAPS); +#define get_cap(cap) static_branch_unlikely(&lru_gen_caps[cap]) #endif /****************************************************************************** @@ -3017,15 +3019,6 @@ DEFINE_STATIC_KEY_ARRAY_FALSE(lru_gen_caps, NR_LRU_GEN_CAPS); for ((type) = 0; (type) < ANON_AND_FILE; (type)++) \ for ((zone) = 0; (zone) < MAX_NR_ZONES; (zone)++) -static bool get_cap(int cap) -{ -#ifdef CONFIG_LRU_GEN_ENABLED - return static_branch_likely(&lru_gen_caps[cap]); -#else - return static_branch_unlikely(&lru_gen_caps[cap]); -#endif -} - static struct lruvec *get_lruvec(struct mem_cgroup *memcg, int nid) { struct pglist_data *pgdat = NODE_DATA(nid); @@ -4442,7 +4435,7 @@ void lru_gen_look_around(struct page_vma_mapped_walk *pvmw) return; start = max(pvmw->address & PMD_MASK, pvmw->vma->vm_start); - end = pmd_addr_end(pvmw->address, pvmw->vma->vm_end); + end = min(pvmw->address | ~PMD_MASK, pvmw->vma->vm_end - 1) + 1; if (end - start > MIN_LRU_BATCH * PAGE_SIZE) { if (pvmw->address - start < MIN_LRU_BATCH * PAGE_SIZE / 2)