Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm: vmscan: avoid split during shrink_folio_list()

Now that swap supports storing all mTHP sizes, avoid splitting large
folios before swap-out. This benefits performance of the swap-out path by
eliding split_folio_to_list(), which is expensive, and also sets us up for
swapping in large folios in a future series.

If the folio is partially mapped, we continue to split it since we want to
avoid the extra IO overhead and storage of writing out pages
uneccessarily.

THP_SWPOUT and THP_SWPOUT_FALLBACK counters should continue to count
events only for PMD-mappable folios to avoid user confusion. THP_SWPOUT
already has the appropriate guard. Add a guard for THP_SWPOUT_FALLBACK.
It may be appropriate to add per-size counters in future.

Link: https://lkml.kernel.org/r/20240408183946.2991168-7-ryan.roberts@arm.com
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Barry Song <v-songbaohua@oppo.com>
Cc: Barry Song <21cnbao@gmail.com>
Cc: Chris Li <chrisl@kernel.org>
Cc: Gao Xiang <xiang@kernel.org>
Cc: "Huang, Ying" <ying.huang@intel.com>
Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: Lance Yang <ioworker0@gmail.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Yu Zhao <yuzhao@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Ryan Roberts and committed by
Andrew Morton
5ed890ce 845982eb

+10 -10
+10 -10
mm/vmscan.c
··· 1206 1206 if (!can_split_folio(folio, NULL)) 1207 1207 goto activate_locked; 1208 1208 /* 1209 - * Split folios without a PMD map right 1210 - * away. Chances are some or all of the 1211 - * tail pages can be freed without IO. 1209 + * Split partially mapped folios right away. 1210 + * We can free the unmapped pages without IO. 1212 1211 */ 1213 - if (!folio_entire_mapcount(folio) && 1214 - split_folio_to_list(folio, 1215 - folio_list)) 1212 + if (data_race(!list_empty(&folio->_deferred_list)) && 1213 + split_folio_to_list(folio, folio_list)) 1216 1214 goto activate_locked; 1217 1215 } 1218 1216 if (!add_to_swap(folio)) { 1219 1217 if (!folio_test_large(folio)) 1220 1218 goto activate_locked_split; 1221 1219 /* Fallback to swap normal pages */ 1222 - if (split_folio_to_list(folio, 1223 - folio_list)) 1220 + if (split_folio_to_list(folio, folio_list)) 1224 1221 goto activate_locked; 1225 1222 #ifdef CONFIG_TRANSPARENT_HUGEPAGE 1226 - count_memcg_folio_events(folio, THP_SWPOUT_FALLBACK, 1); 1227 - count_vm_event(THP_SWPOUT_FALLBACK); 1223 + if (nr_pages >= HPAGE_PMD_NR) { 1224 + count_memcg_folio_events(folio, 1225 + THP_SWPOUT_FALLBACK, 1); 1226 + count_vm_event(THP_SWPOUT_FALLBACK); 1227 + } 1228 1228 #endif 1229 1229 if (!add_to_swap(folio)) 1230 1230 goto activate_locked_split;