Use uffd_info as it is cleaner.
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
/* VMA userfaultfd operations */
unsigned int uffd_page_shift(struct vm_area_struct *vma);
int uffd_writeprotect(struct uffd_info *info);
-ssize_t uffd_failed_do_unlock(struct userfaultfd_ctx *ctx,
- struct vm_area_struct *dst, struct folio *folio,
- unsigned long src_addr);
+ssize_t uffd_failed_do_unlock(struct uffd_info *info);
struct vm_uffd_ops {
int (*copy)(struct uffd_info *info);
ssize_t (*is_dst_valid)(struct vm_area_struct *dst_vma,
unsigned long dst_start, unsigned long len);
unsigned long (*increment)(struct vm_area_struct *vma);
- ssize_t (*failed_do_unlock)(struct userfaultfd_ctx *ctx,
- struct vm_area_struct *dst, struct folio *folio,
- unsigned long src_addr);
+ ssize_t (*failed_do_unlock)(struct uffd_info *info);
unsigned int (*page_shift)(struct vm_area_struct *src_vma);
void (*complete_register)(struct vm_area_struct *vma);
};
static ssize_t hugetlb_is_dst_valid(struct vm_area_struct *dst_vma,
unsigned long dst_start, unsigned long len);
-static ssize_t hugetlb_failed_do_unlock(struct userfaultfd_ctx *ctx,
- struct vm_area_struct *dst, struct folio *folio,
- unsigned long src_addr)
+static ssize_t hugetlb_failed_do_unlock(struct uffd_info *info)
{
- up_read(&ctx->map_changing_lock);
+ up_read(&info->ctx->map_changing_lock);
#ifdef CONFIG_PER_VMA_LOCK
- vma_end_read(dst);
+ vma_end_read(info->dst_vma);
#else
- mmap_read_unlock(dst->vm_mm);
+ mmap_read_unlock(info->dst_vma->vm_mm);
#endif
- VM_WARN_ON_ONCE(!folio);
+ VM_WARN_ON_ONCE(!info->foliop);
- return copy_folio_from_user(folio,(const void __user *)src_addr, true);
+ return copy_folio_from_user(info->foliop,
+ (const void __user *)info->src_addr, true);
}
static inline unsigned int hugetlb_page_shift(struct vm_area_struct *vma)
}
inline ssize_t
-uffd_failed_do_unlock(struct userfaultfd_ctx *ctx, struct vm_area_struct *dst,
- struct folio *folio, unsigned long src_addr)
+uffd_failed_do_unlock(struct uffd_info *info)
{
ssize_t err;
void *kaddr;
- up_read(&ctx->map_changing_lock);
- uffd_mfill_unlock(dst);
- VM_WARN_ON_ONCE(!folio);
+ up_read(&info->ctx->map_changing_lock);
+ uffd_mfill_unlock(info->dst_vma);
+ VM_WARN_ON_ONCE(!info->foliop);
- kaddr = kmap_local_folio(folio, 0);
- err = copy_from_user(kaddr, (const void __user *) src_addr, PAGE_SIZE);
+ kaddr = kmap_local_folio(info->foliop, 0);
+ err = copy_from_user(kaddr, (const void __user *) info->src_addr,
+ PAGE_SIZE);
kunmap_local(kaddr);
if (unlikely(err))
return -EFAULT;
- flush_dcache_folio(folio);
+ flush_dcache_folio(info->foliop);
return 0;
}
err = info.op(&info);
cond_resched();
if (unlikely(err == -ENOENT)) {
- err = info.uffd_ops->failed_do_unlock(ctx, info.dst_vma,
- info.foliop, info.src_addr);
+ err = info.uffd_ops->failed_do_unlock(&info);
if (unlikely(err))
goto out;