mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
mm: make folio_mapcount() return 0 for small typed folios
We already handle it properly for large folios. Let's also return "0" for small typed folios, like page_mapcount() currently would. Consequently, folio_mapcount() will never return negative values for typed folios, but may return negative values for underflows. [david@redhat.com: make folio_mapcount() slightly more efficient] Link: https://lkml.kernel.org/r/c30fcda1-ed87-46f5-8297-cdedbddac009@redhat.com Link: https://lkml.kernel.org/r/20240409192301.907377-7-david@redhat.com Signed-off-by: David Hildenbrand <david@redhat.com> Cc: Chris Zankel <chris@zankel.net> Cc: Hugh Dickins <hughd@google.com> Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Max Filippov <jcmvbkbc@gmail.com> Cc: Miaohe Lin <linmiaohe@huawei.com> Cc: Muchun Song <muchun.song@linux.dev> Cc: Naoya Horiguchi <nao.horiguchi@gmail.com> Cc: Peter Xu <peterx@redhat.com> Cc: Richard Chang <richardycc@google.com> Cc: Rich Felker <dalias@libc.org> Cc: Ryan Roberts <ryan.roberts@arm.com> Cc: Yang Shi <shy828301@gmail.com> Cc: Yin Fengwei <fengwei.yin@intel.com> Cc: Yoshinori Sato <ysato@users.sourceforge.jp> Cc: Zi Yan <ziy@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
eefb9b2725
commit
4103b93b07
@ -1261,12 +1261,22 @@ static inline int folio_large_mapcount(const struct folio *folio)
|
||||
* references the entire folio counts exactly once, even when such special
|
||||
* page table entries are comprised of multiple ordinary page table entries.
|
||||
*
|
||||
* Will report 0 for pages which cannot be mapped into userspace, such as
|
||||
* slab, page tables and similar.
|
||||
*
|
||||
* Return: The number of times this folio is mapped.
|
||||
*/
|
||||
static inline int folio_mapcount(const struct folio *folio)
|
||||
{
|
||||
if (likely(!folio_test_large(folio)))
|
||||
return atomic_read(&folio->_mapcount) + 1;
|
||||
int mapcount;
|
||||
|
||||
if (likely(!folio_test_large(folio))) {
|
||||
mapcount = atomic_read(&folio->_mapcount) + 1;
|
||||
/* Handle page_has_type() pages */
|
||||
if (mapcount < PAGE_MAPCOUNT_RESERVE + 1)
|
||||
mapcount = 0;
|
||||
return mapcount;
|
||||
}
|
||||
return folio_large_mapcount(folio);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user