lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 4 Mar 2022 13:16:57 +0800 From: Peter Xu <peterx@...hat.com> To: linux-mm@...ck.org, linux-kernel@...r.kernel.org Cc: peterx@...hat.com, Nadav Amit <nadav.amit@...il.com>, Hugh Dickins <hughd@...gle.com>, David Hildenbrand <david@...hat.com>, Axel Rasmussen <axelrasmussen@...gle.com>, Matthew Wilcox <willy@...radead.org>, Alistair Popple <apopple@...dia.com>, Mike Rapoport <rppt@...ux.vnet.ibm.com>, Andrew Morton <akpm@...ux-foundation.org>, Jerome Glisse <jglisse@...hat.com>, Mike Kravetz <mike.kravetz@...cle.com>, "Kirill A . Shutemov" <kirill@...temov.name>, Andrea Arcangeli <aarcange@...hat.com> Subject: [PATCH v7 12/23] mm/hugetlb: Hook page faults for uffd write protection Hook up hugetlbfs_fault() with the capability to handle userfaultfd-wp faults. We do this slightly earlier than hugetlb_cow() so that we can avoid taking some extra locks that we definitely don't need. Reviewed-by: Mike Kravetz <mike.kravetz@...cle.com> Signed-off-by: Peter Xu <peterx@...hat.com> --- mm/hugetlb.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/mm/hugetlb.c b/mm/hugetlb.c index b34f50156f7e..d2539e2fe066 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -5680,6 +5680,26 @@ vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, if (unlikely(!pte_same(entry, huge_ptep_get(ptep)))) goto out_ptl; + /* Handle userfault-wp first, before trying to lock more pages */ + if (userfaultfd_wp(vma) && huge_pte_uffd_wp(huge_ptep_get(ptep)) && + (flags & FAULT_FLAG_WRITE) && !huge_pte_write(entry)) { + struct vm_fault vmf = { + .vma = vma, + .address = haddr, + .real_address = address, + .flags = flags, + }; + + spin_unlock(ptl); + if (pagecache_page) { + unlock_page(pagecache_page); + put_page(pagecache_page); + } + mutex_unlock(&hugetlb_fault_mutex_table[hash]); + i_mmap_unlock_read(mapping); + return handle_userfault(&vmf, VM_UFFD_WP); + } + /* * hugetlb_cow() requires page locks of pte_page(entry) and * pagecache_page, so here we need take the former one -- 2.32.0
Powered by blists - more mailing lists