Message ID | 20210511214735.1836149-17-willy@infradead.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Memory folios | expand |
On 5/11/21 11:47 PM, Matthew Wilcox (Oracle) wrote: > This is the folio equivalent of page_mapcount(). > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> > Reviewed-by: Christoph Hellwig <hch@lst.de> > Acked-by: Jeff Layton <jlayton@kernel.org> Acked-by: Vlastimil Babka <vbabka@suse.cz>
On Tue, May 11, 2021 at 10:47:18PM +0100, Matthew Wilcox (Oracle) wrote: > This is the folio equivalent of page_mapcount(). [...] > > +/** > + * folio_mapcount - The number of mappings of this folio. > + * @folio: The folio. > + * > + * The result includes the number of times any of the pages in the > + * folio are mapped to userspace. I thought it did, but it doesn't. It returns the number of times the head/base page of this folio is mapped into userspace, which is not a terribly useful concept. I suspect this should call total_mapcount() instead. Looking through the complete set of patches, it's only used in debugging code (unaccount_page_cache_page() and dump_page()). I'm going to withdraw this patch from the next submission until I've had the chance to think about it some more.
diff --git a/include/linux/mm.h b/include/linux/mm.h index dca39daf3495..6e3dde81ecc9 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -883,6 +883,22 @@ static inline int page_mapcount(struct page *page) return atomic_read(&page->_mapcount) + 1; } +/** + * folio_mapcount - The number of mappings of this folio. + * @folio: The folio. + * + * The result includes the number of times any of the pages in the + * folio are mapped to userspace. + * + * Return: The number of page table entries which refer to this folio. + */ +static inline int folio_mapcount(struct folio *folio) +{ + if (unlikely(folio_multi(folio))) + return __page_mapcount(&folio->page); + return atomic_read(&folio->_mapcount) + 1; +} + #ifdef CONFIG_TRANSPARENT_HUGEPAGE int total_mapcount(struct page *page); int page_trans_huge_mapcount(struct page *page, int *total_mapcount);