| From 4420a4b2add0cadcc6e485eef4ea0dd55e0622cc Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 30 Jun 2021 18:47:57 -0700 |
| Subject: mm/huge_memory.c: don't discard hugepage if other processes are |
| mapping it |
| |
| From: Miaohe Lin <linmiaohe@huawei.com> |
| |
| [ Upstream commit babbbdd08af98a59089334eb3effbed5a7a0cf7f ] |
| |
| If other processes are mapping any other subpages of the hugepage, i.e. |
| in pte-mapped thp case, page_mapcount() will return 1 incorrectly. Then |
| we would discard the page while other processes are still mapping it. Fix |
| it by using total_mapcount() which can tell whether other processes are |
| still mapping it. |
| |
| Link: https://lkml.kernel.org/r/20210511134857.1581273-6-linmiaohe@huawei.com |
| Fixes: b8d3c4c3009d ("mm/huge_memory.c: don't split THP page when MADV_FREE syscall is called") |
| Reviewed-by: Yang Shi <shy828301@gmail.com> |
| Signed-off-by: Miaohe Lin <linmiaohe@huawei.com> |
| Cc: Alexey Dobriyan <adobriyan@gmail.com> |
| Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com> |
| Cc: Anshuman Khandual <anshuman.khandual@arm.com> |
| Cc: David Hildenbrand <david@redhat.com> |
| Cc: Hugh Dickins <hughd@google.com> |
| Cc: Johannes Weiner <hannes@cmpxchg.org> |
| Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> |
| Cc: Matthew Wilcox <willy@infradead.org> |
| Cc: Minchan Kim <minchan@kernel.org> |
| Cc: Ralph Campbell <rcampbell@nvidia.com> |
| Cc: Rik van Riel <riel@surriel.com> |
| Cc: Song Liu <songliubraving@fb.com> |
| Cc: William Kucharski <william.kucharski@oracle.com> |
| Cc: Zi Yan <ziy@nvidia.com> |
| Cc: Mike Kravetz <mike.kravetz@oracle.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| mm/huge_memory.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/mm/huge_memory.c b/mm/huge_memory.c |
| index 07c664c47a4f..9fe622ff2fc4 100644 |
| --- a/mm/huge_memory.c |
| +++ b/mm/huge_memory.c |
| @@ -1604,7 +1604,7 @@ bool madvise_free_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma, |
| * If other processes are mapping this page, we couldn't discard |
| * the page unless they all do MADV_FREE so let's skip the page. |
| */ |
| - if (page_mapcount(page) != 1) |
| + if (total_mapcount(page) != 1) |
| goto out; |
| |
| if (!trylock_page(page)) |
| -- |
| 2.30.2 |
| |