mm: userfaultfd: add new UFFDIO_POISON ioctl
[platform/kernel/linux-starfive.git] / mm / userfaultfd.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  mm/userfaultfd.c
4  *
5  *  Copyright (C) 2015  Red Hat, Inc.
6  */
7
8 #include <linux/mm.h>
9 #include <linux/sched/signal.h>
10 #include <linux/pagemap.h>
11 #include <linux/rmap.h>
12 #include <linux/swap.h>
13 #include <linux/swapops.h>
14 #include <linux/userfaultfd_k.h>
15 #include <linux/mmu_notifier.h>
16 #include <linux/hugetlb.h>
17 #include <linux/shmem_fs.h>
18 #include <asm/tlbflush.h>
19 #include <asm/tlb.h>
20 #include "internal.h"
21
22 static __always_inline
23 struct vm_area_struct *find_dst_vma(struct mm_struct *dst_mm,
24                                     unsigned long dst_start,
25                                     unsigned long len)
26 {
27         /*
28          * Make sure that the dst range is both valid and fully within a
29          * single existing vma.
30          */
31         struct vm_area_struct *dst_vma;
32
33         dst_vma = find_vma(dst_mm, dst_start);
34         if (!range_in_vma(dst_vma, dst_start, dst_start + len))
35                 return NULL;
36
37         /*
38          * Check the vma is registered in uffd, this is required to
39          * enforce the VM_MAYWRITE check done at uffd registration
40          * time.
41          */
42         if (!dst_vma->vm_userfaultfd_ctx.ctx)
43                 return NULL;
44
45         return dst_vma;
46 }
47
48 /* Check if dst_addr is outside of file's size. Must be called with ptl held. */
49 static bool mfill_file_over_size(struct vm_area_struct *dst_vma,
50                                  unsigned long dst_addr)
51 {
52         struct inode *inode;
53         pgoff_t offset, max_off;
54
55         if (!dst_vma->vm_file)
56                 return false;
57
58         inode = dst_vma->vm_file->f_inode;
59         offset = linear_page_index(dst_vma, dst_addr);
60         max_off = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
61         return offset >= max_off;
62 }
63
64 /*
65  * Install PTEs, to map dst_addr (within dst_vma) to page.
66  *
67  * This function handles both MCOPY_ATOMIC_NORMAL and _CONTINUE for both shmem
68  * and anon, and for both shared and private VMAs.
69  */
70 int mfill_atomic_install_pte(pmd_t *dst_pmd,
71                              struct vm_area_struct *dst_vma,
72                              unsigned long dst_addr, struct page *page,
73                              bool newly_allocated, uffd_flags_t flags)
74 {
75         int ret;
76         struct mm_struct *dst_mm = dst_vma->vm_mm;
77         pte_t _dst_pte, *dst_pte;
78         bool writable = dst_vma->vm_flags & VM_WRITE;
79         bool vm_shared = dst_vma->vm_flags & VM_SHARED;
80         bool page_in_cache = page_mapping(page);
81         spinlock_t *ptl;
82         struct folio *folio;
83
84         _dst_pte = mk_pte(page, dst_vma->vm_page_prot);
85         _dst_pte = pte_mkdirty(_dst_pte);
86         if (page_in_cache && !vm_shared)
87                 writable = false;
88         if (writable)
89                 _dst_pte = pte_mkwrite(_dst_pte);
90         if (flags & MFILL_ATOMIC_WP)
91                 _dst_pte = pte_mkuffd_wp(_dst_pte);
92
93         ret = -EAGAIN;
94         dst_pte = pte_offset_map_lock(dst_mm, dst_pmd, dst_addr, &ptl);
95         if (!dst_pte)
96                 goto out;
97
98         if (mfill_file_over_size(dst_vma, dst_addr)) {
99                 ret = -EFAULT;
100                 goto out_unlock;
101         }
102
103         ret = -EEXIST;
104         /*
105          * We allow to overwrite a pte marker: consider when both MISSING|WP
106          * registered, we firstly wr-protect a none pte which has no page cache
107          * page backing it, then access the page.
108          */
109         if (!pte_none_mostly(ptep_get(dst_pte)))
110                 goto out_unlock;
111
112         folio = page_folio(page);
113         if (page_in_cache) {
114                 /* Usually, cache pages are already added to LRU */
115                 if (newly_allocated)
116                         folio_add_lru(folio);
117                 page_add_file_rmap(page, dst_vma, false);
118         } else {
119                 page_add_new_anon_rmap(page, dst_vma, dst_addr);
120                 folio_add_lru_vma(folio, dst_vma);
121         }
122
123         /*
124          * Must happen after rmap, as mm_counter() checks mapping (via
125          * PageAnon()), which is set by __page_set_anon_rmap().
126          */
127         inc_mm_counter(dst_mm, mm_counter(page));
128
129         set_pte_at(dst_mm, dst_addr, dst_pte, _dst_pte);
130
131         /* No need to invalidate - it was non-present before */
132         update_mmu_cache(dst_vma, dst_addr, dst_pte);
133         ret = 0;
134 out_unlock:
135         pte_unmap_unlock(dst_pte, ptl);
136 out:
137         return ret;
138 }
139
140 static int mfill_atomic_pte_copy(pmd_t *dst_pmd,
141                                  struct vm_area_struct *dst_vma,
142                                  unsigned long dst_addr,
143                                  unsigned long src_addr,
144                                  uffd_flags_t flags,
145                                  struct folio **foliop)
146 {
147         void *kaddr;
148         int ret;
149         struct folio *folio;
150
151         if (!*foliop) {
152                 ret = -ENOMEM;
153                 folio = vma_alloc_folio(GFP_HIGHUSER_MOVABLE, 0, dst_vma,
154                                         dst_addr, false);
155                 if (!folio)
156                         goto out;
157
158                 kaddr = kmap_local_folio(folio, 0);
159                 /*
160                  * The read mmap_lock is held here.  Despite the
161                  * mmap_lock being read recursive a deadlock is still
162                  * possible if a writer has taken a lock.  For example:
163                  *
164                  * process A thread 1 takes read lock on own mmap_lock
165                  * process A thread 2 calls mmap, blocks taking write lock
166                  * process B thread 1 takes page fault, read lock on own mmap lock
167                  * process B thread 2 calls mmap, blocks taking write lock
168                  * process A thread 1 blocks taking read lock on process B
169                  * process B thread 1 blocks taking read lock on process A
170                  *
171                  * Disable page faults to prevent potential deadlock
172                  * and retry the copy outside the mmap_lock.
173                  */
174                 pagefault_disable();
175                 ret = copy_from_user(kaddr, (const void __user *) src_addr,
176                                      PAGE_SIZE);
177                 pagefault_enable();
178                 kunmap_local(kaddr);
179
180                 /* fallback to copy_from_user outside mmap_lock */
181                 if (unlikely(ret)) {
182                         ret = -ENOENT;
183                         *foliop = folio;
184                         /* don't free the page */
185                         goto out;
186                 }
187
188                 flush_dcache_folio(folio);
189         } else {
190                 folio = *foliop;
191                 *foliop = NULL;
192         }
193
194         /*
195          * The memory barrier inside __folio_mark_uptodate makes sure that
196          * preceding stores to the page contents become visible before
197          * the set_pte_at() write.
198          */
199         __folio_mark_uptodate(folio);
200
201         ret = -ENOMEM;
202         if (mem_cgroup_charge(folio, dst_vma->vm_mm, GFP_KERNEL))
203                 goto out_release;
204
205         ret = mfill_atomic_install_pte(dst_pmd, dst_vma, dst_addr,
206                                        &folio->page, true, flags);
207         if (ret)
208                 goto out_release;
209 out:
210         return ret;
211 out_release:
212         folio_put(folio);
213         goto out;
214 }
215
216 static int mfill_atomic_pte_zeropage(pmd_t *dst_pmd,
217                                      struct vm_area_struct *dst_vma,
218                                      unsigned long dst_addr)
219 {
220         pte_t _dst_pte, *dst_pte;
221         spinlock_t *ptl;
222         int ret;
223
224         _dst_pte = pte_mkspecial(pfn_pte(my_zero_pfn(dst_addr),
225                                          dst_vma->vm_page_prot));
226         ret = -EAGAIN;
227         dst_pte = pte_offset_map_lock(dst_vma->vm_mm, dst_pmd, dst_addr, &ptl);
228         if (!dst_pte)
229                 goto out;
230         if (mfill_file_over_size(dst_vma, dst_addr)) {
231                 ret = -EFAULT;
232                 goto out_unlock;
233         }
234         ret = -EEXIST;
235         if (!pte_none(ptep_get(dst_pte)))
236                 goto out_unlock;
237         set_pte_at(dst_vma->vm_mm, dst_addr, dst_pte, _dst_pte);
238         /* No need to invalidate - it was non-present before */
239         update_mmu_cache(dst_vma, dst_addr, dst_pte);
240         ret = 0;
241 out_unlock:
242         pte_unmap_unlock(dst_pte, ptl);
243 out:
244         return ret;
245 }
246
247 /* Handles UFFDIO_CONTINUE for all shmem VMAs (shared or private). */
248 static int mfill_atomic_pte_continue(pmd_t *dst_pmd,
249                                      struct vm_area_struct *dst_vma,
250                                      unsigned long dst_addr,
251                                      uffd_flags_t flags)
252 {
253         struct inode *inode = file_inode(dst_vma->vm_file);
254         pgoff_t pgoff = linear_page_index(dst_vma, dst_addr);
255         struct folio *folio;
256         struct page *page;
257         int ret;
258
259         ret = shmem_get_folio(inode, pgoff, &folio, SGP_NOALLOC);
260         /* Our caller expects us to return -EFAULT if we failed to find folio */
261         if (ret == -ENOENT)
262                 ret = -EFAULT;
263         if (ret)
264                 goto out;
265         if (!folio) {
266                 ret = -EFAULT;
267                 goto out;
268         }
269
270         page = folio_file_page(folio, pgoff);
271         if (PageHWPoison(page)) {
272                 ret = -EIO;
273                 goto out_release;
274         }
275
276         ret = mfill_atomic_install_pte(dst_pmd, dst_vma, dst_addr,
277                                        page, false, flags);
278         if (ret)
279                 goto out_release;
280
281         folio_unlock(folio);
282         ret = 0;
283 out:
284         return ret;
285 out_release:
286         folio_unlock(folio);
287         folio_put(folio);
288         goto out;
289 }
290
291 /* Handles UFFDIO_POISON for all non-hugetlb VMAs. */
292 static int mfill_atomic_pte_poison(pmd_t *dst_pmd,
293                                    struct vm_area_struct *dst_vma,
294                                    unsigned long dst_addr,
295                                    uffd_flags_t flags)
296 {
297         int ret;
298         struct mm_struct *dst_mm = dst_vma->vm_mm;
299         pte_t _dst_pte, *dst_pte;
300         spinlock_t *ptl;
301
302         _dst_pte = make_pte_marker(PTE_MARKER_POISONED);
303         dst_pte = pte_offset_map_lock(dst_mm, dst_pmd, dst_addr, &ptl);
304
305         if (mfill_file_over_size(dst_vma, dst_addr)) {
306                 ret = -EFAULT;
307                 goto out_unlock;
308         }
309
310         ret = -EEXIST;
311         /* Refuse to overwrite any PTE, even a PTE marker (e.g. UFFD WP). */
312         if (!pte_none(*dst_pte))
313                 goto out_unlock;
314
315         set_pte_at(dst_mm, dst_addr, dst_pte, _dst_pte);
316
317         /* No need to invalidate - it was non-present before */
318         update_mmu_cache(dst_vma, dst_addr, dst_pte);
319         ret = 0;
320 out_unlock:
321         pte_unmap_unlock(dst_pte, ptl);
322         return ret;
323 }
324
325 static pmd_t *mm_alloc_pmd(struct mm_struct *mm, unsigned long address)
326 {
327         pgd_t *pgd;
328         p4d_t *p4d;
329         pud_t *pud;
330
331         pgd = pgd_offset(mm, address);
332         p4d = p4d_alloc(mm, pgd, address);
333         if (!p4d)
334                 return NULL;
335         pud = pud_alloc(mm, p4d, address);
336         if (!pud)
337                 return NULL;
338         /*
339          * Note that we didn't run this because the pmd was
340          * missing, the *pmd may be already established and in
341          * turn it may also be a trans_huge_pmd.
342          */
343         return pmd_alloc(mm, pud, address);
344 }
345
346 #ifdef CONFIG_HUGETLB_PAGE
347 /*
348  * mfill_atomic processing for HUGETLB vmas.  Note that this routine is
349  * called with mmap_lock held, it will release mmap_lock before returning.
350  */
351 static __always_inline ssize_t mfill_atomic_hugetlb(
352                                               struct vm_area_struct *dst_vma,
353                                               unsigned long dst_start,
354                                               unsigned long src_start,
355                                               unsigned long len,
356                                               uffd_flags_t flags)
357 {
358         struct mm_struct *dst_mm = dst_vma->vm_mm;
359         int vm_shared = dst_vma->vm_flags & VM_SHARED;
360         ssize_t err;
361         pte_t *dst_pte;
362         unsigned long src_addr, dst_addr;
363         long copied;
364         struct folio *folio;
365         unsigned long vma_hpagesize;
366         pgoff_t idx;
367         u32 hash;
368         struct address_space *mapping;
369
370         /*
371          * There is no default zero huge page for all huge page sizes as
372          * supported by hugetlb.  A PMD_SIZE huge pages may exist as used
373          * by THP.  Since we can not reliably insert a zero page, this
374          * feature is not supported.
375          */
376         if (uffd_flags_mode_is(flags, MFILL_ATOMIC_ZEROPAGE) ||
377             uffd_flags_mode_is(flags, MFILL_ATOMIC_POISON)) {
378                 mmap_read_unlock(dst_mm);
379                 return -EINVAL;
380         }
381
382         src_addr = src_start;
383         dst_addr = dst_start;
384         copied = 0;
385         folio = NULL;
386         vma_hpagesize = vma_kernel_pagesize(dst_vma);
387
388         /*
389          * Validate alignment based on huge page size
390          */
391         err = -EINVAL;
392         if (dst_start & (vma_hpagesize - 1) || len & (vma_hpagesize - 1))
393                 goto out_unlock;
394
395 retry:
396         /*
397          * On routine entry dst_vma is set.  If we had to drop mmap_lock and
398          * retry, dst_vma will be set to NULL and we must lookup again.
399          */
400         if (!dst_vma) {
401                 err = -ENOENT;
402                 dst_vma = find_dst_vma(dst_mm, dst_start, len);
403                 if (!dst_vma || !is_vm_hugetlb_page(dst_vma))
404                         goto out_unlock;
405
406                 err = -EINVAL;
407                 if (vma_hpagesize != vma_kernel_pagesize(dst_vma))
408                         goto out_unlock;
409
410                 vm_shared = dst_vma->vm_flags & VM_SHARED;
411         }
412
413         /*
414          * If not shared, ensure the dst_vma has a anon_vma.
415          */
416         err = -ENOMEM;
417         if (!vm_shared) {
418                 if (unlikely(anon_vma_prepare(dst_vma)))
419                         goto out_unlock;
420         }
421
422         while (src_addr < src_start + len) {
423                 BUG_ON(dst_addr >= dst_start + len);
424
425                 /*
426                  * Serialize via vma_lock and hugetlb_fault_mutex.
427                  * vma_lock ensures the dst_pte remains valid even
428                  * in the case of shared pmds.  fault mutex prevents
429                  * races with other faulting threads.
430                  */
431                 idx = linear_page_index(dst_vma, dst_addr);
432                 mapping = dst_vma->vm_file->f_mapping;
433                 hash = hugetlb_fault_mutex_hash(mapping, idx);
434                 mutex_lock(&hugetlb_fault_mutex_table[hash]);
435                 hugetlb_vma_lock_read(dst_vma);
436
437                 err = -ENOMEM;
438                 dst_pte = huge_pte_alloc(dst_mm, dst_vma, dst_addr, vma_hpagesize);
439                 if (!dst_pte) {
440                         hugetlb_vma_unlock_read(dst_vma);
441                         mutex_unlock(&hugetlb_fault_mutex_table[hash]);
442                         goto out_unlock;
443                 }
444
445                 if (!uffd_flags_mode_is(flags, MFILL_ATOMIC_CONTINUE) &&
446                     !huge_pte_none_mostly(huge_ptep_get(dst_pte))) {
447                         err = -EEXIST;
448                         hugetlb_vma_unlock_read(dst_vma);
449                         mutex_unlock(&hugetlb_fault_mutex_table[hash]);
450                         goto out_unlock;
451                 }
452
453                 err = hugetlb_mfill_atomic_pte(dst_pte, dst_vma, dst_addr,
454                                                src_addr, flags, &folio);
455
456                 hugetlb_vma_unlock_read(dst_vma);
457                 mutex_unlock(&hugetlb_fault_mutex_table[hash]);
458
459                 cond_resched();
460
461                 if (unlikely(err == -ENOENT)) {
462                         mmap_read_unlock(dst_mm);
463                         BUG_ON(!folio);
464
465                         err = copy_folio_from_user(folio,
466                                                    (const void __user *)src_addr, true);
467                         if (unlikely(err)) {
468                                 err = -EFAULT;
469                                 goto out;
470                         }
471                         mmap_read_lock(dst_mm);
472
473                         dst_vma = NULL;
474                         goto retry;
475                 } else
476                         BUG_ON(folio);
477
478                 if (!err) {
479                         dst_addr += vma_hpagesize;
480                         src_addr += vma_hpagesize;
481                         copied += vma_hpagesize;
482
483                         if (fatal_signal_pending(current))
484                                 err = -EINTR;
485                 }
486                 if (err)
487                         break;
488         }
489
490 out_unlock:
491         mmap_read_unlock(dst_mm);
492 out:
493         if (folio)
494                 folio_put(folio);
495         BUG_ON(copied < 0);
496         BUG_ON(err > 0);
497         BUG_ON(!copied && !err);
498         return copied ? copied : err;
499 }
500 #else /* !CONFIG_HUGETLB_PAGE */
501 /* fail at build time if gcc attempts to use this */
502 extern ssize_t mfill_atomic_hugetlb(struct vm_area_struct *dst_vma,
503                                     unsigned long dst_start,
504                                     unsigned long src_start,
505                                     unsigned long len,
506                                     uffd_flags_t flags);
507 #endif /* CONFIG_HUGETLB_PAGE */
508
509 static __always_inline ssize_t mfill_atomic_pte(pmd_t *dst_pmd,
510                                                 struct vm_area_struct *dst_vma,
511                                                 unsigned long dst_addr,
512                                                 unsigned long src_addr,
513                                                 uffd_flags_t flags,
514                                                 struct folio **foliop)
515 {
516         ssize_t err;
517
518         if (uffd_flags_mode_is(flags, MFILL_ATOMIC_CONTINUE)) {
519                 return mfill_atomic_pte_continue(dst_pmd, dst_vma,
520                                                  dst_addr, flags);
521         } else if (uffd_flags_mode_is(flags, MFILL_ATOMIC_POISON)) {
522                 return mfill_atomic_pte_poison(dst_pmd, dst_vma,
523                                                dst_addr, flags);
524         }
525
526         /*
527          * The normal page fault path for a shmem will invoke the
528          * fault, fill the hole in the file and COW it right away. The
529          * result generates plain anonymous memory. So when we are
530          * asked to fill an hole in a MAP_PRIVATE shmem mapping, we'll
531          * generate anonymous memory directly without actually filling
532          * the hole. For the MAP_PRIVATE case the robustness check
533          * only happens in the pagetable (to verify it's still none)
534          * and not in the radix tree.
535          */
536         if (!(dst_vma->vm_flags & VM_SHARED)) {
537                 if (uffd_flags_mode_is(flags, MFILL_ATOMIC_COPY))
538                         err = mfill_atomic_pte_copy(dst_pmd, dst_vma,
539                                                     dst_addr, src_addr,
540                                                     flags, foliop);
541                 else
542                         err = mfill_atomic_pte_zeropage(dst_pmd,
543                                                  dst_vma, dst_addr);
544         } else {
545                 err = shmem_mfill_atomic_pte(dst_pmd, dst_vma,
546                                              dst_addr, src_addr,
547                                              flags, foliop);
548         }
549
550         return err;
551 }
552
553 static __always_inline ssize_t mfill_atomic(struct mm_struct *dst_mm,
554                                             unsigned long dst_start,
555                                             unsigned long src_start,
556                                             unsigned long len,
557                                             atomic_t *mmap_changing,
558                                             uffd_flags_t flags)
559 {
560         struct vm_area_struct *dst_vma;
561         ssize_t err;
562         pmd_t *dst_pmd;
563         unsigned long src_addr, dst_addr;
564         long copied;
565         struct folio *folio;
566
567         /*
568          * Sanitize the command parameters:
569          */
570         BUG_ON(dst_start & ~PAGE_MASK);
571         BUG_ON(len & ~PAGE_MASK);
572
573         /* Does the address range wrap, or is the span zero-sized? */
574         BUG_ON(src_start + len <= src_start);
575         BUG_ON(dst_start + len <= dst_start);
576
577         src_addr = src_start;
578         dst_addr = dst_start;
579         copied = 0;
580         folio = NULL;
581 retry:
582         mmap_read_lock(dst_mm);
583
584         /*
585          * If memory mappings are changing because of non-cooperative
586          * operation (e.g. mremap) running in parallel, bail out and
587          * request the user to retry later
588          */
589         err = -EAGAIN;
590         if (mmap_changing && atomic_read(mmap_changing))
591                 goto out_unlock;
592
593         /*
594          * Make sure the vma is not shared, that the dst range is
595          * both valid and fully within a single existing vma.
596          */
597         err = -ENOENT;
598         dst_vma = find_dst_vma(dst_mm, dst_start, len);
599         if (!dst_vma)
600                 goto out_unlock;
601
602         err = -EINVAL;
603         /*
604          * shmem_zero_setup is invoked in mmap for MAP_ANONYMOUS|MAP_SHARED but
605          * it will overwrite vm_ops, so vma_is_anonymous must return false.
606          */
607         if (WARN_ON_ONCE(vma_is_anonymous(dst_vma) &&
608             dst_vma->vm_flags & VM_SHARED))
609                 goto out_unlock;
610
611         /*
612          * validate 'mode' now that we know the dst_vma: don't allow
613          * a wrprotect copy if the userfaultfd didn't register as WP.
614          */
615         if ((flags & MFILL_ATOMIC_WP) && !(dst_vma->vm_flags & VM_UFFD_WP))
616                 goto out_unlock;
617
618         /*
619          * If this is a HUGETLB vma, pass off to appropriate routine
620          */
621         if (is_vm_hugetlb_page(dst_vma))
622                 return  mfill_atomic_hugetlb(dst_vma, dst_start,
623                                              src_start, len, flags);
624
625         if (!vma_is_anonymous(dst_vma) && !vma_is_shmem(dst_vma))
626                 goto out_unlock;
627         if (!vma_is_shmem(dst_vma) &&
628             uffd_flags_mode_is(flags, MFILL_ATOMIC_CONTINUE))
629                 goto out_unlock;
630
631         /*
632          * Ensure the dst_vma has a anon_vma or this page
633          * would get a NULL anon_vma when moved in the
634          * dst_vma.
635          */
636         err = -ENOMEM;
637         if (!(dst_vma->vm_flags & VM_SHARED) &&
638             unlikely(anon_vma_prepare(dst_vma)))
639                 goto out_unlock;
640
641         while (src_addr < src_start + len) {
642                 pmd_t dst_pmdval;
643
644                 BUG_ON(dst_addr >= dst_start + len);
645
646                 dst_pmd = mm_alloc_pmd(dst_mm, dst_addr);
647                 if (unlikely(!dst_pmd)) {
648                         err = -ENOMEM;
649                         break;
650                 }
651
652                 dst_pmdval = pmdp_get_lockless(dst_pmd);
653                 /*
654                  * If the dst_pmd is mapped as THP don't
655                  * override it and just be strict.
656                  */
657                 if (unlikely(pmd_trans_huge(dst_pmdval))) {
658                         err = -EEXIST;
659                         break;
660                 }
661                 if (unlikely(pmd_none(dst_pmdval)) &&
662                     unlikely(__pte_alloc(dst_mm, dst_pmd))) {
663                         err = -ENOMEM;
664                         break;
665                 }
666                 /* If an huge pmd materialized from under us fail */
667                 if (unlikely(pmd_trans_huge(*dst_pmd))) {
668                         err = -EFAULT;
669                         break;
670                 }
671
672                 BUG_ON(pmd_none(*dst_pmd));
673                 BUG_ON(pmd_trans_huge(*dst_pmd));
674
675                 err = mfill_atomic_pte(dst_pmd, dst_vma, dst_addr,
676                                        src_addr, flags, &folio);
677                 cond_resched();
678
679                 if (unlikely(err == -ENOENT)) {
680                         void *kaddr;
681
682                         mmap_read_unlock(dst_mm);
683                         BUG_ON(!folio);
684
685                         kaddr = kmap_local_folio(folio, 0);
686                         err = copy_from_user(kaddr,
687                                              (const void __user *) src_addr,
688                                              PAGE_SIZE);
689                         kunmap_local(kaddr);
690                         if (unlikely(err)) {
691                                 err = -EFAULT;
692                                 goto out;
693                         }
694                         flush_dcache_folio(folio);
695                         goto retry;
696                 } else
697                         BUG_ON(folio);
698
699                 if (!err) {
700                         dst_addr += PAGE_SIZE;
701                         src_addr += PAGE_SIZE;
702                         copied += PAGE_SIZE;
703
704                         if (fatal_signal_pending(current))
705                                 err = -EINTR;
706                 }
707                 if (err)
708                         break;
709         }
710
711 out_unlock:
712         mmap_read_unlock(dst_mm);
713 out:
714         if (folio)
715                 folio_put(folio);
716         BUG_ON(copied < 0);
717         BUG_ON(err > 0);
718         BUG_ON(!copied && !err);
719         return copied ? copied : err;
720 }
721
722 ssize_t mfill_atomic_copy(struct mm_struct *dst_mm, unsigned long dst_start,
723                           unsigned long src_start, unsigned long len,
724                           atomic_t *mmap_changing, uffd_flags_t flags)
725 {
726         return mfill_atomic(dst_mm, dst_start, src_start, len, mmap_changing,
727                             uffd_flags_set_mode(flags, MFILL_ATOMIC_COPY));
728 }
729
730 ssize_t mfill_atomic_zeropage(struct mm_struct *dst_mm, unsigned long start,
731                               unsigned long len, atomic_t *mmap_changing)
732 {
733         return mfill_atomic(dst_mm, start, 0, len, mmap_changing,
734                             uffd_flags_set_mode(0, MFILL_ATOMIC_ZEROPAGE));
735 }
736
737 ssize_t mfill_atomic_continue(struct mm_struct *dst_mm, unsigned long start,
738                               unsigned long len, atomic_t *mmap_changing,
739                               uffd_flags_t flags)
740 {
741         return mfill_atomic(dst_mm, start, 0, len, mmap_changing,
742                             uffd_flags_set_mode(flags, MFILL_ATOMIC_CONTINUE));
743 }
744
745 ssize_t mfill_atomic_poison(struct mm_struct *dst_mm, unsigned long start,
746                             unsigned long len, atomic_t *mmap_changing,
747                             uffd_flags_t flags)
748 {
749         return mfill_atomic(dst_mm, start, 0, len, mmap_changing,
750                             uffd_flags_set_mode(flags, MFILL_ATOMIC_POISON));
751 }
752
753 long uffd_wp_range(struct vm_area_struct *dst_vma,
754                    unsigned long start, unsigned long len, bool enable_wp)
755 {
756         unsigned int mm_cp_flags;
757         struct mmu_gather tlb;
758         long ret;
759
760         VM_WARN_ONCE(start < dst_vma->vm_start || start + len > dst_vma->vm_end,
761                         "The address range exceeds VMA boundary.\n");
762         if (enable_wp)
763                 mm_cp_flags = MM_CP_UFFD_WP;
764         else
765                 mm_cp_flags = MM_CP_UFFD_WP_RESOLVE;
766
767         /*
768          * vma->vm_page_prot already reflects that uffd-wp is enabled for this
769          * VMA (see userfaultfd_set_vm_flags()) and that all PTEs are supposed
770          * to be write-protected as default whenever protection changes.
771          * Try upgrading write permissions manually.
772          */
773         if (!enable_wp && vma_wants_manual_pte_write_upgrade(dst_vma))
774                 mm_cp_flags |= MM_CP_TRY_CHANGE_WRITABLE;
775         tlb_gather_mmu(&tlb, dst_vma->vm_mm);
776         ret = change_protection(&tlb, dst_vma, start, start + len, mm_cp_flags);
777         tlb_finish_mmu(&tlb);
778
779         return ret;
780 }
781
782 int mwriteprotect_range(struct mm_struct *dst_mm, unsigned long start,
783                         unsigned long len, bool enable_wp,
784                         atomic_t *mmap_changing)
785 {
786         unsigned long end = start + len;
787         unsigned long _start, _end;
788         struct vm_area_struct *dst_vma;
789         unsigned long page_mask;
790         long err;
791         VMA_ITERATOR(vmi, dst_mm, start);
792
793         /*
794          * Sanitize the command parameters:
795          */
796         BUG_ON(start & ~PAGE_MASK);
797         BUG_ON(len & ~PAGE_MASK);
798
799         /* Does the address range wrap, or is the span zero-sized? */
800         BUG_ON(start + len <= start);
801
802         mmap_read_lock(dst_mm);
803
804         /*
805          * If memory mappings are changing because of non-cooperative
806          * operation (e.g. mremap) running in parallel, bail out and
807          * request the user to retry later
808          */
809         err = -EAGAIN;
810         if (mmap_changing && atomic_read(mmap_changing))
811                 goto out_unlock;
812
813         err = -ENOENT;
814         for_each_vma_range(vmi, dst_vma, end) {
815
816                 if (!userfaultfd_wp(dst_vma)) {
817                         err = -ENOENT;
818                         break;
819                 }
820
821                 if (is_vm_hugetlb_page(dst_vma)) {
822                         err = -EINVAL;
823                         page_mask = vma_kernel_pagesize(dst_vma) - 1;
824                         if ((start & page_mask) || (len & page_mask))
825                                 break;
826                 }
827
828                 _start = max(dst_vma->vm_start, start);
829                 _end = min(dst_vma->vm_end, end);
830
831                 err = uffd_wp_range(dst_vma, _start, _end - _start, enable_wp);
832
833                 /* Return 0 on success, <0 on failures */
834                 if (err < 0)
835                         break;
836                 err = 0;
837         }
838 out_unlock:
839         mmap_read_unlock(dst_mm);
840         return err;
841 }