@@ -3955,6 +3955,7 @@ void lru_gen_look_around(struct page_vma_mapped_walk *pvmw)
3955
3955
int young = 0 ;
3956
3956
pte_t * pte = pvmw -> pte ;
3957
3957
unsigned long addr = pvmw -> address ;
3958
+ struct vm_area_struct * vma = pvmw -> vma ;
3958
3959
struct folio * folio = pfn_folio (pvmw -> pfn );
3959
3960
bool can_swap = !folio_is_file_lru (folio );
3960
3961
struct mem_cgroup * memcg = folio_memcg (folio );
@@ -3969,11 +3970,15 @@ void lru_gen_look_around(struct page_vma_mapped_walk *pvmw)
3969
3970
if (spin_is_contended (pvmw -> ptl ))
3970
3971
return ;
3971
3972
3973
+ /* exclude special VMAs containing anon pages from COW */
3974
+ if (vma -> vm_flags & VM_SPECIAL )
3975
+ return ;
3976
+
3972
3977
/* avoid taking the LRU lock under the PTL when possible */
3973
3978
walk = current -> reclaim_state ? current -> reclaim_state -> mm_walk : NULL ;
3974
3979
3975
- start = max (addr & PMD_MASK , pvmw -> vma -> vm_start );
3976
- end = min (addr | ~PMD_MASK , pvmw -> vma -> vm_end - 1 ) + 1 ;
3980
+ start = max (addr & PMD_MASK , vma -> vm_start );
3981
+ end = min (addr | ~PMD_MASK , vma -> vm_end - 1 ) + 1 ;
3977
3982
3978
3983
if (end - start > MIN_LRU_BATCH * PAGE_SIZE ) {
3979
3984
if (addr - start < MIN_LRU_BATCH * PAGE_SIZE / 2 )
@@ -3998,7 +4003,7 @@ void lru_gen_look_around(struct page_vma_mapped_walk *pvmw)
3998
4003
unsigned long pfn ;
3999
4004
pte_t ptent = ptep_get (pte + i );
4000
4005
4001
- pfn = get_pte_pfn (ptent , pvmw -> vma , addr );
4006
+ pfn = get_pte_pfn (ptent , vma , addr );
4002
4007
if (pfn == -1 )
4003
4008
continue ;
4004
4009
@@ -4009,7 +4014,7 @@ void lru_gen_look_around(struct page_vma_mapped_walk *pvmw)
4009
4014
if (!folio )
4010
4015
continue ;
4011
4016
4012
- if (!ptep_test_and_clear_young (pvmw -> vma , addr , pte + i ))
4017
+ if (!ptep_test_and_clear_young (vma , addr , pte + i ))
4013
4018
VM_WARN_ON_ONCE (true);
4014
4019
4015
4020
young ++ ;
0 commit comments