lkml.org 
[lkml]   [2021]   [Jun]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 079/101] mm/thp: fix page_address_in_vma() on file THP tails
    Date
    From: Jue Wang <juew@google.com>

    commit 31657170deaf1d8d2f6a1955fbc6fa9d228be036 upstream.

    Anon THP tails were already supported, but memory-failure may need to
    use page_address_in_vma() on file THP tails, which its page->mapping
    check did not permit: fix it.

    hughd adds: no current usage is known to hit the issue, but this does
    fix a subtle trap in a general helper: best fixed in stable sooner than
    later.

    Link: https://lkml.kernel.org/r/a0d9b53-bf5d-8bab-ac5-759dc61819c1@google.com
    Fixes: 800d8c63b2e9 ("shmem: add huge pages support")
    Signed-off-by: Jue Wang <juew@google.com>
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Reviewed-by: Yang Shi <shy828301@gmail.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    mm/rmap.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/mm/rmap.c b/mm/rmap.c
    index 62cd108bb2bd..14f84f70c557 100644
    --- a/mm/rmap.c
    +++ b/mm/rmap.c
    @@ -709,11 +709,11 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)
    if (!vma->anon_vma || !page__anon_vma ||
    vma->anon_vma->root != page__anon_vma->root)
    return -EFAULT;
    - } else if (page->mapping) {
    - if (!vma->vm_file || vma->vm_file->f_mapping != page->mapping)
    - return -EFAULT;
    - } else
    + } else if (!vma->vm_file) {
    + return -EFAULT;
    + } else if (vma->vm_file->f_mapping != compound_head(page)->mapping) {
    return -EFAULT;
    + }

    return vma_address(page, vma);
    }
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-06-28 16:39    [W:4.096 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site