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;
 }
[...]

Reply via email to