在 2025/12/16 14:34, Anshuman Khandual 写道: > > On 15/12/25 8:16 AM, Weilin Tong wrote: >> Currently, when shmem mTHPs are split and swapped out via shmem_writeout(), >> there are no unified statistics to trace these mTHP swpout fallback events. >> This makes it difficult to analyze the prevalence of mTHP splitting and >> fallback during swap operations, which is important for memory diagnostics. >> >> Here we add statistics counting for mTHP fallback to small pages >> when splitting and swapping out in shmem_writeout(). >> >> Signed-off-by: Weilin Tong >> Reviewed-by: Baolin Wang >> --- >> mm/shmem.c | 12 ++++++++++++ >> 1 file changed, 12 insertions(+) >> >> diff --git a/mm/shmem.c b/mm/shmem.c >> index 3f194c9842a8..aa624c447358 100644 >> --- a/mm/shmem.c >> +++ b/mm/shmem.c >> @@ -1593,11 +1593,23 @@ int shmem_writeout(struct folio *folio, struct swap_iocb **plug, >> } >> >> if (split) { >> + int order; >> + > Could this be moved up near the 'nr_pages' declaration instead ? Thanks for your reviewing. IIUC, this|order|variable is only used inside the|"if (split)"|code block, so it's best to define it here. This keeps its scope limited. >> try_split: >> + order = folio_order(folio); >> /* Ensure the subpages are still dirty */ >> folio_test_set_dirty(folio); >> if (split_folio_to_list(folio, folio_list)) >> goto redirty; >> + >> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >> + if (order >= HPAGE_PMD_ORDER) { >> + count_memcg_folio_events(folio, THP_SWPOUT_FALLBACK, 1); >> + count_vm_event(THP_SWPOUT_FALLBACK); >> + } >> +#endif >> + count_mthp_stat(order, MTHP_STAT_SWPOUT_FALLBACK); >> + >> folio_clear_dirty(folio); >> } >> > Otherwise LGTM.