--- x/include/linux/rmap.h +++ y/include/linux/rmap.h @@ -327,6 +327,7 @@ static __always_inline void __folio_dup_ switch (level) { case RMAP_LEVEL_PTE: + BUG_ON(atomic_read(&page->_mapcount) < 0); if (!folio_test_large(folio)) { atomic_inc(&page->_mapcount); break; @@ -419,6 +420,7 @@ static __always_inline int __folio_try_d return -EBUSY; } + BUG_ON(atomic_read(&page->_mapcount) < 0); if (!folio_test_large(folio)) { if (PageAnonExclusive(page)) ClearPageAnonExclusive(page); --- x/mm/rmap.c +++ y/mm/rmap.c @@ -1149,6 +1149,7 @@ static __always_inline unsigned int __fo switch (level) { case RMAP_LEVEL_PTE: + BUG_ON(atomic_read(&page->_mapcount) < -1); if (!folio_test_large(folio)) { nr = atomic_inc_and_test(&page->_mapcount); break; @@ -1503,6 +1504,7 @@ static __always_inline void __folio_remo switch (level) { case RMAP_LEVEL_PTE: + BUG_ON(atomic_read(&page->_mapcount) < 0); if (!folio_test_large(folio)) { nr = atomic_add_negative(-1, &page->_mapcount); break;