Skip to content

Commit 0e0e9bd

Browse files
fyin1akpm00
authored andcommitted
madvise:madvise_free_pte_range(): don't use mapcount() against large folio for sharing check
Commit 98b211d ("madvise: convert madvise_free_pte_range() to use a folio") replaced the page_mapcount() with folio_mapcount() to check whether the folio is shared by other mapping. It's not correct for large folios. folio_mapcount() returns the total mapcount of large folio which is not suitable to detect whether the folio is shared. Use folio_estimated_sharers() which returns a estimated number of shares. That means it's not 100% correct. It should be OK for madvise case here. User-visible effects is that the THP is skipped when user call madvise. But the correct behavior is THP should be split and processed then. NOTE: this change is a temporary fix to reduce the user-visible effects before the long term fix from David is ready. Link: https://lkml.kernel.org/r/[email protected] Fixes: 98b211d ("madvise: convert madvise_free_pte_range() to use a folio") Signed-off-by: Yin Fengwei <[email protected]> Reviewed-by: Yu Zhao <[email protected]> Reviewed-by: Ryan Roberts <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: Kefeng Wang <[email protected]> Cc: Matthew Wilcox <[email protected]> Cc: Minchan Kim <[email protected]> Cc: Vishal Moola (Oracle) <[email protected]> Cc: Yang Shi <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent 20b18aa commit 0e0e9bd

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

mm/madvise.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,7 @@ static int madvise_free_pte_range(pmd_t *pmd, unsigned long addr,
680680
if (folio_test_large(folio)) {
681681
int err;
682682

683-
if (folio_mapcount(folio) != 1)
683+
if (folio_estimated_sharers(folio) != 1)
684684
break;
685685
if (!folio_trylock(folio))
686686
break;

0 commit comments

Comments
 (0)