• Ralph Campbell's avatar
    mm/thp: fix __split_huge_pmd_locked() for migration PMD · ec0abae6
    Ralph Campbell authored
    A migrating transparent huge page has to already be unmapped.  Otherwise,
    the page could be modified while it is being copied to a new page and data
    could be lost.  The function __split_huge_pmd() checks for a PMD migration
    entry before calling __split_huge_pmd_locked() leading one to think that
    __split_huge_pmd_locked() can handle splitting a migrating PMD.
    
    However, the code always increments the page->_mapcount and adjusts the
    memory control group accounting assuming the page is mapped.
    
    Also, if the PMD entry is a migration PMD entry, the call to
    is_huge_zero_pmd(*pmd) is incorrect because it calls pmd_pfn(pmd) instead
    of migration_entry_to_pfn(pmd_to_swp_entry(pmd)).  Fix these problems by
    checking for a PMD migration entry.
    
    Fixes: 84c3fc4e ("mm: thp: check pmd migration entry in common path")
    Signed-off-by: default avatarRalph Campbell <rcampbell@nvidia.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Reviewed-by: default avatarYang Shi <shy828301@gmail.com>
    Reviewed-by: default avatarZi Yan <ziy@nvidia.com>
    Cc: Jerome Glisse <jglisse@redhat.com>
    Cc: John Hubbard <jhubbard@nvidia.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Jason Gunthorpe <jgg@nvidia.com>
    Cc: Bharata B Rao <bharata@linux.ibm.com>
    Cc: Ben Skeggs <bskeggs@redhat.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: <stable@vger.kernel.org>	[4.14+]
    Link: https://lkml.kernel.org/r/20200903183140.19055-1-rcampbell@nvidia.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ec0abae6
huge_memory.c 81 KB