On Thu, 26 Mar 2015, Kirill A. Shutemov wrote: > THP uses tail page refcounting to be able to split huge page at any > time. Tail page refcounting is not needed for rest users of compound > pages and it's harmful because of overhead. > > We try to exclude non-THP pages from tail page refcounting using > __compound_tail_refcounted() check. It excludes most common non-THP > compound pages: SL*B and hugetlb, but it doesn't catch rest of > __GFP_COMP users -- drivers. > > And it's not only about overhead. > > Drivers might want to use compound pages to get refcounting semantics > suitable for mapping high-order pages to userspace. But tail page > refcounting breaks it. > > Tail page refcounting uses ->_mapcount in tail pages to store GUP pins > on them. It means GUP pins would affect page_mapcount() for tail pages. > It's not a problem for THP, because it never maps tail pages. But unlike > THP, drivers map parts of compound pages with PTEs and it makes > page_mapcount() be called for tail pages. > > In particular, GUP pins would shift PSS up and affect /proc/kpagecount > for such pages. But, I'm not aware about anything which can lead to > crash or other serious misbehaviour. > > Since currently all THP pages are anonymous and all drivers pages are > not, we can fix the __compound_tail_refcounted() check by requiring > PageAnon() to enable tail page refcounting. > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> Acked-by: Hugh Dickins <hughd@xxxxxxxxxx> > --- > include/linux/mm.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 4a3a38522ab4..16fe322b66ea 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -456,7 +456,7 @@ static inline int page_count(struct page *page) > > static inline bool __compound_tail_refcounted(struct page *page) > { > - return !PageSlab(page) && !PageHeadHuge(page); > + return PageAnon(page) && !PageSlab(page) && !PageHeadHuge(page); > } > > /* > -- > 2.1.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>