lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 085/862] mm/uffd: fix warning without PTE_MARKER_UFFD_WP compiled in
    Date
    From: Peter Xu <peterx@redhat.com>

    commit 515778e2d790652a38a24554fdb7f21420d91efc upstream.

    When PTE_MARKER_UFFD_WP not configured, it's still possible to reach pte
    marker code and trigger an warning. Add a few CONFIG_PTE_MARKER_UFFD_WP
    ifdefs to make sure the code won't be reached when not compiled in.

    Link: https://lkml.kernel.org/r/YzeR+R6b4bwBlBHh@x1n
    Fixes: b1f9e876862d ("mm/uffd: enable write protection for shmem & hugetlbfs")
    Signed-off-by: Peter Xu <peterx@redhat.com>
    Reported-by: <syzbot+2b9b4f0895be09a6dec3@syzkaller.appspotmail.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Brian Geffon <bgeffon@google.com>
    Cc: Edward Liaw <edliaw@google.com>
    Cc: Liu Shixin <liushixin2@huawei.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    mm/hugetlb.c | 4 ++++
    mm/memory.c | 2 ++
    mm/mprotect.c | 2 ++
    3 files changed, 8 insertions(+)

    --- a/mm/hugetlb.c
    +++ b/mm/hugetlb.c
    @@ -5059,6 +5059,7 @@ static void __unmap_hugepage_range(struc
    * unmapped and its refcount is dropped, so just clear pte here.
    */
    if (unlikely(!pte_present(pte))) {
    +#ifdef CONFIG_PTE_MARKER_UFFD_WP
    /*
    * If the pte was wr-protected by uffd-wp in any of the
    * swap forms, meanwhile the caller does not want to
    @@ -5070,6 +5071,7 @@ static void __unmap_hugepage_range(struc
    set_huge_pte_at(mm, address, ptep,
    make_pte_marker(PTE_MARKER_UFFD_WP));
    else
    +#endif
    huge_pte_clear(mm, address, ptep, sz);
    spin_unlock(ptl);
    continue;
    @@ -5098,11 +5100,13 @@ static void __unmap_hugepage_range(struc
    tlb_remove_huge_tlb_entry(h, tlb, ptep, address);
    if (huge_pte_dirty(pte))
    set_page_dirty(page);
    +#ifdef CONFIG_PTE_MARKER_UFFD_WP
    /* Leave a uffd-wp pte marker if needed */
    if (huge_pte_uffd_wp(pte) &&
    !(zap_flags & ZAP_FLAG_DROP_MARKER))
    set_huge_pte_at(mm, address, ptep,
    make_pte_marker(PTE_MARKER_UFFD_WP));
    +#endif
    hugetlb_count_sub(pages_per_huge_page(h), mm);
    page_remove_rmap(page, vma, true);

    --- a/mm/memory.c
    +++ b/mm/memory.c
    @@ -1393,10 +1393,12 @@ zap_install_uffd_wp_if_needed(struct vm_
    unsigned long addr, pte_t *pte,
    struct zap_details *details, pte_t pteval)
    {
    +#ifdef CONFIG_PTE_MARKER_UFFD_WP
    if (zap_drop_file_uffd_wp(details))
    return;

    pte_install_uffd_wp_if_needed(vma, addr, pte, pteval);
    +#endif
    }

    static unsigned long zap_pte_range(struct mmu_gather *tlb,
    --- a/mm/mprotect.c
    +++ b/mm/mprotect.c
    @@ -260,6 +260,7 @@ static unsigned long change_pte_range(st
    } else {
    /* It must be an none page, or what else?.. */
    WARN_ON_ONCE(!pte_none(oldpte));
    +#ifdef CONFIG_PTE_MARKER_UFFD_WP
    if (unlikely(uffd_wp && !vma_is_anonymous(vma))) {
    /*
    * For file-backed mem, we need to be able to
    @@ -271,6 +272,7 @@ static unsigned long change_pte_range(st
    make_pte_marker(PTE_MARKER_UFFD_WP));
    pages++;
    }
    +#endif
    }
    } while (pte++, addr += PAGE_SIZE, addr != end);
    arch_leave_lazy_mmu_mode();

    \
     
     \ /
      Last update: 2022-10-19 11:01    [W:4.030 / U:0.488 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site