| From: David Hildenbrand <david@redhat.com> |
| Subject: mm-rmap-simplify-pageanonexclusive-sanity-checks-when-adding-anon-rmap-fix |
| Date: Mon, 18 Sep 2023 11:16:57 +0200 |
| |
| While PTE-mapping a THP, we temporarily have an exclusive page of a THP |
| mapped by both, a PMD and a PTE at the same time. Update our check to |
| allow for that combination. |
| |
| Link: https://lkml.kernel.org/r/d8e5a093-2e22-c14b-7e64-6da280398d9f@redhat.com |
| Signed-off-by: David Hildenbrand <david@redhat.com> |
| Reported-by: syzbot+6e4f59235036c3c2e296@syzkaller.appspotmail.com |
| Cc: Matthew Wilcox <willy@infradead.org> |
| Cc: Mike Kravetz <mike.kravetz@oracle.com> |
| Cc: Muchun Song <muchun.song@linux.dev> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/rmap.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/mm/rmap.c~mm-rmap-simplify-pageanonexclusive-sanity-checks-when-adding-anon-rmap-fix |
| +++ a/mm/rmap.c |
| @@ -1249,8 +1249,10 @@ void page_add_anon_rmap(struct page *pag |
| } |
| if (flags & RMAP_EXCLUSIVE) |
| SetPageAnonExclusive(page); |
| - VM_WARN_ON_FOLIO(page_mapcount(page) > 1 && PageAnonExclusive(page), |
| - folio); |
| + /* While PTE-mapping a THP we have a PMD and a PTE mapping. */ |
| + VM_WARN_ON_FOLIO((atomic_read(&page->_mapcount) > 0 || |
| + (folio_test_large(folio) && folio_entire_mapcount(folio) > 1)) && |
| + PageAnonExclusive(page), folio); |
| |
| mlock_vma_folio(folio, vma, compound); |
| } |
| _ |