* [PATCH] mm: bail out when the PMD has been set in bloom filter @ 2026-02-27 7:52 zhaoyang.huang 2026-02-27 11:42 ` kernel test robot 0 siblings, 1 reply; 3+ messages in thread From: zhaoyang.huang @ 2026-02-27 7:52 UTC (permalink / raw) To: Andrew Morton, Yu Zhao, linux-mm, linux-kernel, Zhaoyang Huang, steve.kang From: Zhaoyang Huang <zhaoyang.huang@unisoc.com> There are two reasons to have the recorded PMD bail out from doing the following iteration 1. It is worth of doing such a trade off thing in terms of reclaiming efficiency as test_bloom_filter only consume 20~30 instructions in modern processors(25 instructions in ARM64). 2. The PMD needs to accumulate young pages until aging happens while the new arrived folio reference checking under current max_seq refuse to do so which will affect carrying hot PMDs to new generation. Signed-off-by: Zhaoyang Huang <zhaoyang.huang@unisoc.com> --- mm/vmscan.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mm/vmscan.c b/mm/vmscan.c index 9d900be478ea..e50e98291d0d 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4227,6 +4227,10 @@ bool lru_gen_look_around(struct page_vma_mapped_walk *pvmw) /* avoid taking the LRU lock under the PTL when possible */ walk = current->reclaim_state ? current->reclaim_state->mm_walk : NULL; + /* may the pmd has been set in bloom filter */ + if (test_bloom_filter(mm_state, max_seq, pvmw->pmd)) + return true; + start = max(addr & PMD_MASK, vma->vm_start); end = min(addr | ~PMD_MASK, vma->vm_end - 1) + 1; -- 2.25.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] mm: bail out when the PMD has been set in bloom filter 2026-02-27 7:52 [PATCH] mm: bail out when the PMD has been set in bloom filter zhaoyang.huang @ 2026-02-27 11:42 ` kernel test robot 2026-02-28 0:50 ` Zhaoyang Huang 0 siblings, 1 reply; 3+ messages in thread From: kernel test robot @ 2026-02-27 11:42 UTC (permalink / raw) To: zhaoyang.huang, Andrew Morton, Yu Zhao, linux-kernel, Zhaoyang Huang, steve.kang Cc: llvm, oe-kbuild-all, Linux Memory Management List Hi zhaoyang.huang, kernel test robot noticed the following build warnings: [auto build test WARNING on akpm-mm/mm-everything] url: https://github.com/intel-lab-lkp/linux/commits/zhaoyang-huang/mm-bail-out-when-the-PMD-has-been-set-in-bloom-filter/20260227-155729 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20260227075250.1128175-1-zhaoyang.huang%40unisoc.com patch subject: [PATCH] mm: bail out when the PMD has been set in bloom filter config: sparc64-randconfig-002-20260227 (https://download.01.org/0day-ci/archive/20260227/202602271916.OBNa34QU-lkp@intel.com/config) compiler: clang version 23.0.0git (https://github.com/llvm/llvm-project 9a109fbb6e184ec9bcce10615949f598f4c974a9) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260227/202602271916.OBNa34QU-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202602271916.OBNa34QU-lkp@intel.com/ All warnings (new ones prefixed by >>): >> mm/vmscan.c:4206:24: warning: variable 'mm_state' is uninitialized when used here [-Wuninitialized] 4206 | if (test_bloom_filter(mm_state, max_seq, pvmw->pmd)) | ^~~~~~~~ mm/vmscan.c:4185:35: note: initialize the variable 'mm_state' to silence this warning 4185 | struct lru_gen_mm_state *mm_state; | ^ | = NULL >> mm/vmscan.c:4206:34: warning: variable 'max_seq' is uninitialized when used here [-Wuninitialized] 4206 | if (test_bloom_filter(mm_state, max_seq, pvmw->pmd)) | ^~~~~~~ mm/vmscan.c:4186:23: note: initialize the variable 'max_seq' to silence this warning 4186 | unsigned long max_seq; | ^ | = 0 2 warnings generated. vim +/mm_state +4206 mm/vmscan.c 4157 4158 /****************************************************************************** 4159 * rmap/PT walk feedback 4160 ******************************************************************************/ 4161 4162 /* 4163 * This function exploits spatial locality when shrink_folio_list() walks the 4164 * rmap. It scans the adjacent PTEs of a young PTE and promotes hot pages. If 4165 * the scan was done cacheline efficiently, it adds the PMD entry pointing to 4166 * the PTE table to the Bloom filter. This forms a feedback loop between the 4167 * eviction and the aging. 4168 */ 4169 bool lru_gen_look_around(struct page_vma_mapped_walk *pvmw) 4170 { 4171 int i; 4172 bool dirty; 4173 unsigned long start; 4174 unsigned long end; 4175 struct lru_gen_mm_walk *walk; 4176 struct folio *last = NULL; 4177 int young = 1; 4178 pte_t *pte = pvmw->pte; 4179 unsigned long addr = pvmw->address; 4180 struct vm_area_struct *vma = pvmw->vma; 4181 struct folio *folio = pfn_folio(pvmw->pfn); 4182 struct mem_cgroup *memcg; 4183 struct pglist_data *pgdat = folio_pgdat(folio); 4184 struct lruvec *lruvec; 4185 struct lru_gen_mm_state *mm_state; 4186 unsigned long max_seq; 4187 int gen; 4188 4189 lockdep_assert_held(pvmw->ptl); 4190 VM_WARN_ON_ONCE_FOLIO(folio_test_lru(folio), folio); 4191 4192 if (!ptep_clear_young_notify(vma, addr, pte)) 4193 return false; 4194 4195 if (spin_is_contended(pvmw->ptl)) 4196 return true; 4197 4198 /* exclude special VMAs containing anon pages from COW */ 4199 if (vma->vm_flags & VM_SPECIAL) 4200 return true; 4201 4202 /* avoid taking the LRU lock under the PTL when possible */ 4203 walk = current->reclaim_state ? current->reclaim_state->mm_walk : NULL; 4204 4205 /* may the pmd has been set in bloom filter */ > 4206 if (test_bloom_filter(mm_state, max_seq, pvmw->pmd)) 4207 return true; 4208 4209 start = max(addr & PMD_MASK, vma->vm_start); 4210 end = min(addr | ~PMD_MASK, vma->vm_end - 1) + 1; 4211 4212 if (end - start == PAGE_SIZE) 4213 return true; 4214 4215 if (end - start > MIN_LRU_BATCH * PAGE_SIZE) { 4216 if (addr - start < MIN_LRU_BATCH * PAGE_SIZE / 2) 4217 end = start + MIN_LRU_BATCH * PAGE_SIZE; 4218 else if (end - addr < MIN_LRU_BATCH * PAGE_SIZE / 2) 4219 start = end - MIN_LRU_BATCH * PAGE_SIZE; 4220 else { 4221 start = addr - MIN_LRU_BATCH * PAGE_SIZE / 2; 4222 end = addr + MIN_LRU_BATCH * PAGE_SIZE / 2; 4223 } 4224 } 4225 4226 memcg = get_mem_cgroup_from_folio(folio); 4227 lruvec = mem_cgroup_lruvec(memcg, pgdat); 4228 max_seq = READ_ONCE((lruvec)->lrugen.max_seq); 4229 gen = lru_gen_from_seq(max_seq); 4230 mm_state = get_mm_state(lruvec); 4231 4232 lazy_mmu_mode_enable(); 4233 4234 pte -= (addr - start) / PAGE_SIZE; 4235 4236 for (i = 0, addr = start; addr != end; i++, addr += PAGE_SIZE) { 4237 unsigned long pfn; 4238 pte_t ptent = ptep_get(pte + i); 4239 4240 pfn = get_pte_pfn(ptent, vma, addr, pgdat); 4241 if (pfn == -1) 4242 continue; 4243 4244 folio = get_pfn_folio(pfn, memcg, pgdat); 4245 if (!folio) 4246 continue; 4247 4248 if (!ptep_clear_young_notify(vma, addr, pte + i)) 4249 continue; 4250 4251 if (last != folio) { 4252 walk_update_folio(walk, last, gen, dirty); 4253 4254 last = folio; 4255 dirty = false; 4256 } 4257 4258 if (pte_dirty(ptent)) 4259 dirty = true; 4260 4261 young++; 4262 } 4263 4264 walk_update_folio(walk, last, gen, dirty); 4265 4266 lazy_mmu_mode_disable(); 4267 4268 /* feedback from rmap walkers to page table walkers */ 4269 if (mm_state && suitable_to_scan(i, young)) 4270 update_bloom_filter(mm_state, max_seq, pvmw->pmd); 4271 4272 mem_cgroup_put(memcg); 4273 4274 return true; 4275 } 4276 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] mm: bail out when the PMD has been set in bloom filter 2026-02-27 11:42 ` kernel test robot @ 2026-02-28 0:50 ` Zhaoyang Huang 0 siblings, 0 replies; 3+ messages in thread From: Zhaoyang Huang @ 2026-02-28 0:50 UTC (permalink / raw) To: kernel test robot Cc: zhaoyang.huang, Andrew Morton, Yu Zhao, linux-kernel, steve.kang, llvm, oe-kbuild-all, Linux Memory Management List On Fri, Feb 27, 2026 at 7:43 PM kernel test robot <lkp@intel.com> wrote: > > Hi zhaoyang.huang, > > kernel test robot noticed the following build warnings: > > [auto build test WARNING on akpm-mm/mm-everything] > > url: https://github.com/intel-lab-lkp/linux/commits/zhaoyang-huang/mm-bail-out-when-the-PMD-has-been-set-in-bloom-filter/20260227-155729 > base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything > patch link: https://lore.kernel.org/r/20260227075250.1128175-1-zhaoyang.huang%40unisoc.com > patch subject: [PATCH] mm: bail out when the PMD has been set in bloom filter > config: sparc64-randconfig-002-20260227 (https://download.01.org/0day-ci/archive/20260227/202602271916.OBNa34QU-lkp@intel.com/config) > compiler: clang version 23.0.0git (https://github.com/llvm/llvm-project 9a109fbb6e184ec9bcce10615949f598f4c974a9) > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260227/202602271916.OBNa34QU-lkp@intel.com/reproduce) > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202602271916.OBNa34QU-lkp@intel.com/ > > All warnings (new ones prefixed by >>): > > >> mm/vmscan.c:4206:24: warning: variable 'mm_state' is uninitialized when used here [-Wuninitialized] > 4206 | if (test_bloom_filter(mm_state, max_seq, pvmw->pmd)) > | ^~~~~~~~ > mm/vmscan.c:4185:35: note: initialize the variable 'mm_state' to silence this warning > 4185 | struct lru_gen_mm_state *mm_state; > | ^ > | = NULL > >> mm/vmscan.c:4206:34: warning: variable 'max_seq' is uninitialized when used here [-Wuninitialized] > 4206 | if (test_bloom_filter(mm_state, max_seq, pvmw->pmd)) > | ^~~~~~~ > mm/vmscan.c:4186:23: note: initialize the variable 'max_seq' to silence this warning > 4186 | unsigned long max_seq; > | ^ > | = 0 > 2 warnings generated. > > > vim +/mm_state +4206 mm/vmscan.c > > 4157 > 4158 /****************************************************************************** > 4159 * rmap/PT walk feedback > 4160 ******************************************************************************/ > 4161 > 4162 /* > 4163 * This function exploits spatial locality when shrink_folio_list() walks the > 4164 * rmap. It scans the adjacent PTEs of a young PTE and promotes hot pages. If > 4165 * the scan was done cacheline efficiently, it adds the PMD entry pointing to > 4166 * the PTE table to the Bloom filter. This forms a feedback loop between the > 4167 * eviction and the aging. > 4168 */ > 4169 bool lru_gen_look_around(struct page_vma_mapped_walk *pvmw) > 4170 { > 4171 int i; > 4172 bool dirty; > 4173 unsigned long start; > 4174 unsigned long end; > 4175 struct lru_gen_mm_walk *walk; > 4176 struct folio *last = NULL; > 4177 int young = 1; > 4178 pte_t *pte = pvmw->pte; > 4179 unsigned long addr = pvmw->address; > 4180 struct vm_area_struct *vma = pvmw->vma; > 4181 struct folio *folio = pfn_folio(pvmw->pfn); > 4182 struct mem_cgroup *memcg; > 4183 struct pglist_data *pgdat = folio_pgdat(folio); > 4184 struct lruvec *lruvec; > 4185 struct lru_gen_mm_state *mm_state; > 4186 unsigned long max_seq; > 4187 int gen; > 4188 > 4189 lockdep_assert_held(pvmw->ptl); > 4190 VM_WARN_ON_ONCE_FOLIO(folio_test_lru(folio), folio); > 4191 > 4192 if (!ptep_clear_young_notify(vma, addr, pte)) > 4193 return false; > 4194 > 4195 if (spin_is_contended(pvmw->ptl)) > 4196 return true; > 4197 > 4198 /* exclude special VMAs containing anon pages from COW */ > 4199 if (vma->vm_flags & VM_SPECIAL) > 4200 return true; > 4201 > 4202 /* avoid taking the LRU lock under the PTL when possible */ > 4203 walk = current->reclaim_state ? current->reclaim_state->mm_walk : NULL; > 4204 > 4205 /* may the pmd has been set in bloom filter */ > > 4206 if (test_bloom_filter(mm_state, max_seq, pvmw->pmd)) > 4207 return true; > 4208 > 4209 start = max(addr & PMD_MASK, vma->vm_start); > 4210 end = min(addr | ~PMD_MASK, vma->vm_end - 1) + 1; > 4211 > 4212 if (end - start == PAGE_SIZE) > 4213 return true; > 4214 > 4215 if (end - start > MIN_LRU_BATCH * PAGE_SIZE) { > 4216 if (addr - start < MIN_LRU_BATCH * PAGE_SIZE / 2) > 4217 end = start + MIN_LRU_BATCH * PAGE_SIZE; > 4218 else if (end - addr < MIN_LRU_BATCH * PAGE_SIZE / 2) > 4219 start = end - MIN_LRU_BATCH * PAGE_SIZE; > 4220 else { > 4221 start = addr - MIN_LRU_BATCH * PAGE_SIZE / 2; > 4222 end = addr + MIN_LRU_BATCH * PAGE_SIZE / 2; > 4223 } > 4224 } > 4225 > 4226 memcg = get_mem_cgroup_from_folio(folio); > 4227 lruvec = mem_cgroup_lruvec(memcg, pgdat); > 4228 max_seq = READ_ONCE((lruvec)->lrugen.max_seq); > 4229 gen = lru_gen_from_seq(max_seq); > 4230 mm_state = get_mm_state(lruvec); I am confused about the code base which this test is based on. By checking the base that listed above and linux-next and 7.1-rc1, I can't find above merged result or I miss anything? > 4231 > 4232 lazy_mmu_mode_enable(); > 4233 > 4234 pte -= (addr - start) / PAGE_SIZE; > 4235 > 4236 for (i = 0, addr = start; addr != end; i++, addr += PAGE_SIZE) { > 4237 unsigned long pfn; > 4238 pte_t ptent = ptep_get(pte + i); > 4239 > 4240 pfn = get_pte_pfn(ptent, vma, addr, pgdat); > 4241 if (pfn == -1) > 4242 continue; > 4243 > 4244 folio = get_pfn_folio(pfn, memcg, pgdat); > 4245 if (!folio) > 4246 continue; > 4247 > 4248 if (!ptep_clear_young_notify(vma, addr, pte + i)) > 4249 continue; > 4250 > 4251 if (last != folio) { > 4252 walk_update_folio(walk, last, gen, dirty); > 4253 > 4254 last = folio; > 4255 dirty = false; > 4256 } > 4257 > 4258 if (pte_dirty(ptent)) > 4259 dirty = true; > 4260 > 4261 young++; > 4262 } > 4263 > 4264 walk_update_folio(walk, last, gen, dirty); > 4265 > 4266 lazy_mmu_mode_disable(); > 4267 > 4268 /* feedback from rmap walkers to page table walkers */ > 4269 if (mm_state && suitable_to_scan(i, young)) > 4270 update_bloom_filter(mm_state, max_seq, pvmw->pmd); > 4271 > 4272 mem_cgroup_put(memcg); > 4273 > 4274 return true; > 4275 } > 4276 > > -- > 0-DAY CI Kernel Test Service > https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-02-28 0:50 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-02-27 7:52 [PATCH] mm: bail out when the PMD has been set in bloom filter zhaoyang.huang 2026-02-27 11:42 ` kernel test robot 2026-02-28 0:50 ` Zhaoyang Huang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox