• N
    hugetlbfs: flush TLBs correctly after huge_pmd_unshare · 09e1590f
    Nadav Amit 提交于
    stable inclusion
    from linux-v4.19.219
    commit b0313bc7f5fbb6beee327af39d818ffdc921821a
    category: bugfix
    bugzilla: 185854
    CVE: CVE-2021-4002
    
    -----------------------------------------------
    
    commit a4a118f2 upstream.
    
    When __unmap_hugepage_range() calls to huge_pmd_unshare() succeed, a TLB
    flush is missing.  This TLB flush must be performed before releasing the
    i_mmap_rwsem, in order to prevent an unshared PMDs page from being
    released and reused before the TLB flush took place.
    
    Arguably, a comprehensive solution would use mmu_gather interface to
    batch the TLB flushes and the PMDs page release, however it is not an
    easy solution: (1) try_to_unmap_one() and try_to_migrate_one() also call
    huge_pmd_unshare() and they cannot use the mmu_gather interface; and (2)
    deferring the release of the page reference for the PMDs page until
    after i_mmap_rwsem is dropeed can confuse huge_pmd_unshare() into
    thinking PMDs are shared when they are not.
    
    Fix __unmap_hugepage_range() by adding the missing TLB flush, and
    forcing a flush when unshare is successful.
    
    Fixes: 24669e58 ("hugetlb: use mmu_gather instead of a temporary linked list for accumulating pages)" # 3.6
    Signed-off-by: NNadav Amit <namit@vmware.com>
    Reviewed-by: NMike Kravetz <mike.kravetz@oracle.com>
    Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Conflicts:
    	include/asm-generic/tlb.h
    	mm/mmu_gather.c
    Signed-off-by: NLiu Shixin <liushixin2@huawei.com>
    Reviewed-by: Ntong tiangen <tongtiangen@huawei.com>
    Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
    09e1590f
tlb.h 5.7 KB