mm: Fix for negative counter: nr_file_hugepages
Subsystems (3)
PATCH v3 1/1 mm: Fix for negative counter: nr_file_hugepages
While qualifiying the 6.4 release, the following warning was detected in messages:
vmstat_refresh: nr_file_hugepages -15664
The warning is caused by the incorrect updating of the NR_FILE_THPS counter in the function split_huge_page_to_list. The if case is checking for folio_test_swapbacked, but the else case is missing the check for folio_test_pmd_mappable. The other functions that manipulate the counter like __filemap_add_folio and filemap_unaccount_folio have the corresponding check.
I have a test case, which reproduces the problem. It can be found here:
https://github.com/sroeschus/testcase/blob/main/vmstat_refresh/madv.c
The test case reproduces on an XFS filesystem. Running the same test case on a BTRFS filesystem does not reproduce the problem.
AFAIK version 6.1 until 6.6 are affected by this problem.
--- mm/huge_memory.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
mm/huge_memory.c +9 -7
@@ -2737,13 +2737,15 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)int nr =folio_nr_pages (folio);xas_split (&xas, folio,folio_order (folio)); -if (folio_test_swapbacked (folio)) { -__lruvec_stat_mod_folio (folio,NR_SHMEM_THPS , - -nr); - }else { -__lruvec_stat_mod_folio (folio,NR_FILE_THPS , - -nr); -filemap_nr_thps_dec (mapping); +if (folio_test_pmd_mappable (folio)) { +if (folio_test_swapbacked (folio)) { +__lruvec_stat_mod_folio (folio, +NR_SHMEM_THPS , -nr); + }else { +__lruvec_stat_mod_folio (folio, +NR_FILE_THPS , -nr); +filemap_nr_thps_dec (mapping); + } } }
base-commit: ffc253263a1375a65fa6c9f62a893e9767fbebfa
Signature · 1 line
2.39.3
Quoted 18 lines · Stefan Roesch
While qualifiying the 6.4 release, the following warning was detected in messages:
vmstat_refresh:nr_file_hugepages-15664The warning is caused by the incorrect updating of the
NR_FILE_THPScounter in the functionsplit_huge_page_to_list. The if case is checking forfolio_test_swapbacked, but the else case is missing the check forfolio_test_pmd_mappable. The other functions that manipulate the counter like__filemap_add_folioandfilemap_unaccount_foliohave the corresponding check.I have a test case, which reproduces the problem. It can be found here:
https://github.com/sroeschus/testcase/blob/main/vmstat_refresh/madv.cThe test case reproduces on an XFS filesystem. Running the same test case on a BTRFS filesystem does not reproduce the problem.
Quoted 6 lines
AFAIK version 6.1 until 6.6 are affected by this problem.
Signed-off-by Stefan Roesch <[email protected]>Co-debugged-by Johannes Weiner <[email protected]>Acked-by Johannes Weiner <[email protected]>
Quoted 42 lines · Stefan Roesch
While qualifiying the 6.4 release, the following warning was detected in messages:
vmstat_refresh:nr_file_hugepages-15664The warning is caused by the incorrect updating of the
NR_FILE_THPScounter in the functionsplit_huge_page_to_list. The if case is checking forfolio_test_swapbacked, but the else case is missing the check forfolio_test_pmd_mappable. The other functions that manipulate the counter like__filemap_add_folioandfilemap_unaccount_foliohave the corresponding check.I have a test case, which reproduces the problem. It can be found here:
https://github.com/sroeschus/testcase/blob/main/vmstat_refresh/madv.cThe test case reproduces on an XFS filesystem. Running the same test case on a BTRFS filesystem does not reproduce the problem.
AFAIK version 6.1 until 6.6 are affected by this problem.
Signed-off-by Stefan Roesch <[email protected]>Co-debugged-by Johannes Weiner <[email protected]>Acked-by Johannes Weiner <[email protected]>--- mm/huge_memory.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)mm/huge_memory.c +0
-6@@ -2737,13 +2737,15 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)int nr =folio_nr_pages (folio);xas_split (&xas, folio,folio_order (folio)); -if (folio_test_swapbacked (folio)) { -__lruvec_stat_mod_folio (folio,NR_SHMEM_THPS , - -nr); - }else { -__lruvec_stat_mod_folio (folio,NR_FILE_THPS , - -nr);
mm/huge_memory.c int split_huge_page_to_list(struct page *page, struct list_head *list) · line 2748
Quoted 10 lines
mm/huge_memory.c +9
-1-filemap_nr_thps_dec (mapping); +if (folio_test_pmd_mappable (folio)) { +if (folio_test_swapbacked (folio)) { +__lruvec_stat_mod_folio (folio, +NR_SHMEM_THPS , -nr); + }else { +__lruvec_stat_mod_folio (folio, +NR_FILE_THPS , -nr); +filemap_nr_thps_dec (mapping); + }
Yes, that's the current state: update these counters only for (traditional, IOW PMD-sized) THP. What we'll do with non-pmd-sized THP remains to be discussed (Ryan had some ideas).
Signature · 3 lines
Cheers, David / dhildenb
Quoted 19 lines · Stefan Roesch
While qualifiying the 6.4 release, the following warning was detected in messages:
vmstat_refresh:nr_file_hugepages-15664The warning is caused by the incorrect updating of the
NR_FILE_THPScounter in the functionsplit_huge_page_to_list. The if case is checking forfolio_test_swapbacked, but the else case is missing the check forfolio_test_pmd_mappable. The other functions that manipulate the counter like__filemap_add_folioandfilemap_unaccount_foliohave the corresponding check.I have a test case, which reproduces the problem. It can be found here:
https://github.com/sroeschus/testcase/blob/main/vmstat_refresh/madv.cThe test case reproduces on an XFS filesystem. Running the same test case on a BTRFS filesystem does not reproduce the problem.
Quoted 6 lines
AFAIK version 6.1 until 6.6 are affected by this problem.
Signed-off-by Stefan Roesch <[email protected]>Co-debugged-by Johannes Weiner <[email protected]>Acked-by Johannes Weiner <[email protected]>
Quoted 37 lines
--- mm/huge_memory.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)mm/huge_memory.c +9
-7@@ -2737,13 +2737,15 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)int nr =folio_nr_pages (folio);xas_split (&xas, folio,folio_order (folio)); -if (folio_test_swapbacked (folio)) { -__lruvec_stat_mod_folio (folio,NR_SHMEM_THPS , - -nr); - }else { -__lruvec_stat_mod_folio (folio,NR_FILE_THPS , - -nr); -filemap_nr_thps_dec (mapping); +if (folio_test_pmd_mappable (folio)) { +if (folio_test_swapbacked (folio)) { +__lruvec_stat_mod_folio (folio, +NR_SHMEM_THPS , -nr); + }else { +__lruvec_stat_mod_folio (folio, +NR_FILE_THPS , -nr); +filemap_nr_thps_dec (mapping); + } } }base-commit:
ffc253263a1375a65fa6c9f62a893e9767fbebfa--
2.39.3