Hey David, Maybe I spotted a bug below. [...] static inline bool folio_likely_mapped_shared(struct folio *folio) { - return page_mapcount(folio_page(folio, 0)) > 1; + int mapcount = folio_mapcount(folio); + + /* Only partially-mappable folios require more care. */ + if (!folio_test_large(folio) || unlikely(folio_test_hugetlb(folio))) + return mapcount > 1; + + /* A single mapping implies "mapped exclusively". */ + if (mapcount <= 1) + return false; + + /* If any page is mapped more than once we treat it "mapped shared". */ + if (folio_entire_mapcount(folio) || mapcount > folio_nr_pages(folio)) + return true; bug: if a PMD-mapped THP is exclusively mapped, the folio_entire_mapcount() function will return 1 (atomic_read(&folio->_entire_mapcount) + 1). IIUC, when mapping a PMD entry for the entire THP, folio->_entire_mapcount increments from -1 to 0. Thanks, Lance + + /* Let's guess based on the first subpage. */ + return atomic_read(&folio->_mapcount) > 0; } [...]