unsigned long src_addr);
struct vm_uffd_ops {
+ int (*poison)(struct vm_area_struct *dst_vma,
+ unsigned long dst_addr, unsigned long increment);
+
/* Required features below */
ssize_t (*is_dst_valid)(struct vm_area_struct *dst_vma,
unsigned long dst_start, unsigned long len);
{
return PAGE_SIZE;
}
+int mfill_atomic_pte_poison(struct vm_area_struct *dst_vma,
+ unsigned long dst_addr, unsigned long increment);
static inline bool vma_can_userfault(struct vm_area_struct *vma,
vm_flags_t vm_flags,
return copy_folio_from_user(folio,(const void __user *)src_addr, true);
}
+static int hugetlb_mfill_pte_poison(struct vm_area_struct *dst_vma,
+ unsigned long dst_addr, unsigned long increment);
+
static const struct vm_uffd_ops hugetlb_uffd_ops = {
+ .poison = hugetlb_mfill_pte_poison,
.is_dst_valid = hugetlb_is_dst_valid,
.increment = hugetlb_mfill_size,
.failed_do_unlock = hugetlb_failed_do_unlock,
#ifdef CONFIG_USERFAULTFD
static const struct vm_uffd_ops shmem_uffd_ops = {
+ .poison = mfill_atomic_pte_poison,
.is_dst_valid = shmem_is_dst_valid,
.increment = mfill_size,
.failed_do_unlock = uffd_failed_do_unlock,
}
/* Handles UFFDIO_POISON for all non-hugetlb VMAs. */
-static int mfill_atomic_pte_poison(struct vm_area_struct *dst_vma,
- unsigned long dst_addr,
- uffd_flags_t flags)
+int mfill_atomic_pte_poison(struct vm_area_struct *dst_vma,
+ unsigned long dst_addr, unsigned long increment)
{
int ret;
struct mm_struct *dst_mm = dst_vma->vm_mm;
/* Anon vma ops */
static const struct vm_uffd_ops default_uffd_ops = {
+ .poison = mfill_atomic_pte_poison,
.is_dst_valid = uffd_def_is_dst_valid,
.increment = mfill_size,
.failed_do_unlock = uffd_failed_do_unlock,