userfaultfd: convert copy_huge_page_from_user() to copy_folio_from_user()
Replace copy_huge_page_from_user() with copy_folio_from_user(). copy_folio_from_user() does the same as copy_huge_page_from_user(), but takes in a folio instead of a page. Convert page_kaddr to kaddr in copy_folio_from_user() to do indenting cleanup. Link: https://lkml.kernel.org/r/20230410133932.32288-4-zhangpeng362@huawei.com Signed-off-by: ZhangPeng <zhangpeng362@huawei.com> Reviewed-by: Sidhartha Kumar <sidhartha.kumar@oracle.com> Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com> Cc: Kefeng Wang <wangkefeng.wang@huawei.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Muchun Song <muchun.song@linux.dev> Cc: Nanyong Sun <sunnanyong@huawei.com> Cc: Vishal Moola (Oracle) <vishal.moola@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Родитель
0d508c1f0e
Коммит
e87340ca5c
|
@ -3681,10 +3681,9 @@ extern void copy_user_huge_page(struct page *dst, struct page *src,
|
|||
unsigned long addr_hint,
|
||||
struct vm_area_struct *vma,
|
||||
unsigned int pages_per_huge_page);
|
||||
extern long copy_huge_page_from_user(struct page *dst_page,
|
||||
const void __user *usr_src,
|
||||
unsigned int pages_per_huge_page,
|
||||
bool allow_pagefault);
|
||||
long copy_folio_from_user(struct folio *dst_folio,
|
||||
const void __user *usr_src,
|
||||
bool allow_pagefault);
|
||||
|
||||
/**
|
||||
* vma_is_special_huge - Are transhuge page-table entries considered special?
|
||||
|
|
|
@ -6217,9 +6217,8 @@ int hugetlb_mfill_atomic_pte(pte_t *dst_pte,
|
|||
goto out;
|
||||
}
|
||||
|
||||
ret = copy_huge_page_from_user(&folio->page,
|
||||
(const void __user *) src_addr,
|
||||
pages_per_huge_page(h), false);
|
||||
ret = copy_folio_from_user(folio, (const void __user *) src_addr,
|
||||
false);
|
||||
|
||||
/* fallback to copy_from_user outside mmap_lock */
|
||||
if (unlikely(ret)) {
|
||||
|
|
23
mm/memory.c
23
mm/memory.c
|
@ -5868,26 +5868,25 @@ void copy_user_huge_page(struct page *dst, struct page *src,
|
|||
process_huge_page(addr_hint, pages_per_huge_page, copy_subpage, &arg);
|
||||
}
|
||||
|
||||
long copy_huge_page_from_user(struct page *dst_page,
|
||||
const void __user *usr_src,
|
||||
unsigned int pages_per_huge_page,
|
||||
bool allow_pagefault)
|
||||
long copy_folio_from_user(struct folio *dst_folio,
|
||||
const void __user *usr_src,
|
||||
bool allow_pagefault)
|
||||
{
|
||||
void *page_kaddr;
|
||||
void *kaddr;
|
||||
unsigned long i, rc = 0;
|
||||
unsigned long ret_val = pages_per_huge_page * PAGE_SIZE;
|
||||
unsigned int nr_pages = folio_nr_pages(dst_folio);
|
||||
unsigned long ret_val = nr_pages * PAGE_SIZE;
|
||||
struct page *subpage;
|
||||
|
||||
for (i = 0; i < pages_per_huge_page; i++) {
|
||||
subpage = nth_page(dst_page, i);
|
||||
page_kaddr = kmap_local_page(subpage);
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
subpage = folio_page(dst_folio, i);
|
||||
kaddr = kmap_local_page(subpage);
|
||||
if (!allow_pagefault)
|
||||
pagefault_disable();
|
||||
rc = copy_from_user(page_kaddr,
|
||||
usr_src + i * PAGE_SIZE, PAGE_SIZE);
|
||||
rc = copy_from_user(kaddr, usr_src + i * PAGE_SIZE, PAGE_SIZE);
|
||||
if (!allow_pagefault)
|
||||
pagefault_enable();
|
||||
kunmap_local(page_kaddr);
|
||||
kunmap_local(kaddr);
|
||||
|
||||
ret_val -= (PAGE_SIZE - rc);
|
||||
if (rc)
|
||||
|
|
|
@ -421,10 +421,8 @@ retry:
|
|||
mmap_read_unlock(dst_mm);
|
||||
BUG_ON(!page);
|
||||
|
||||
err = copy_huge_page_from_user(page,
|
||||
(const void __user *)src_addr,
|
||||
vma_hpagesize / PAGE_SIZE,
|
||||
true);
|
||||
err = copy_folio_from_user(page_folio(page),
|
||||
(const void __user *)src_addr, true);
|
||||
if (unlikely(err)) {
|
||||
err = -EFAULT;
|
||||
goto out;
|
||||
|
|
Загрузка…
Ссылка в новой задаче