未验证 提交 7170574a 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!1126 [sync] PR-1115: userswap bugfix

Merge Pull Request from: @openeuler-sync-bot 
 

Origin pull request: 
https://gitee.com/openeuler/kernel/pulls/1115 
 
PR sync from:  Peng Zhang <zhangpeng362@huawei.com>
 https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/thread/GRJWIT22G2QJFYJL64FIBD6E7V5TTDY5/ 
From: ZhangPeng <zhangpeng362@huawei.com>

Fix Fuzz test BUG_ON and failure to swap out large memory. Two userswap
bugfixes synchronized from hulk5.10.

ZhangPeng (2):
  userswap: fix BUG_ON in userfaultfd_release()
  userswap: fix kmalloc ENOMEM failed for a large memory


-- 
2.25.1
 
 
Link:https://gitee.com/openeuler/kernel/pulls/1126 

Reviewed-by: Kefeng Wang <wangkefeng.wang@huawei.com> 
Signed-off-by: Jialin Zhang <zhangjialin11@huawei.com> 
...@@ -873,12 +873,12 @@ static int userfaultfd_release(struct inode *inode, struct file *file) ...@@ -873,12 +873,12 @@ static int userfaultfd_release(struct inode *inode, struct file *file)
prev = NULL; prev = NULL;
for (vma = mm->mmap; vma; vma = vma->vm_next) { for (vma = mm->mmap; vma; vma = vma->vm_next) {
userfault_flags = VM_UFFD_MISSING | VM_UFFD_WP; userfault_flags = VM_UFFD_MISSING | VM_UFFD_WP;
#ifdef CONFIG_USERSWAP
uswap_release(&userfault_flags);
#endif
cond_resched(); cond_resched();
BUG_ON(!!vma->vm_userfaultfd_ctx.ctx ^ BUG_ON(!!vma->vm_userfaultfd_ctx.ctx ^
!!(vma->vm_flags & userfault_flags)); !!(vma->vm_flags & userfault_flags));
#ifdef CONFIG_USERSWAP
uswap_release(&userfault_flags);
#endif
if (vma->vm_userfaultfd_ctx.ctx != ctx) { if (vma->vm_userfaultfd_ctx.ctx != ctx) {
prev = vma; prev = vma;
continue; continue;
......
...@@ -86,7 +86,7 @@ static unsigned long pages_can_be_swapped(struct mm_struct *mm, ...@@ -86,7 +86,7 @@ static unsigned long pages_can_be_swapped(struct mm_struct *mm,
*ppages = NULL; *ppages = NULL;
pages = kmalloc(sizeof(struct page *) * (len / PAGE_SIZE), GFP_KERNEL); pages = kvzalloc(sizeof(struct page *) * (len / PAGE_SIZE), GFP_KERNEL);
if (!pages) if (!pages)
return -ENOMEM; return -ENOMEM;
...@@ -151,7 +151,7 @@ static unsigned long pages_can_be_swapped(struct mm_struct *mm, ...@@ -151,7 +151,7 @@ static unsigned long pages_can_be_swapped(struct mm_struct *mm,
out_err: out_err:
for (i = 0; i < page_num; i++) for (i = 0; i < page_num; i++)
put_page(pages[i]); put_page(pages[i]);
kfree(pages); kvfree(pages);
return ret; return ret;
} }
...@@ -291,10 +291,9 @@ static unsigned long do_user_swap(struct mm_struct *mm, ...@@ -291,10 +291,9 @@ static unsigned long do_user_swap(struct mm_struct *mm,
unsigned long i = 0, j; unsigned long i = 0, j;
int ret; int ret;
ptes = kmalloc(sizeof(pte_t) * (len / PAGE_SIZE), GFP_KERNEL); ptes = kvzalloc(sizeof(pte_t) * (len / PAGE_SIZE), GFP_KERNEL);
if (!ptes) if (!ptes)
return -ENOMEM; return -ENOMEM;
memset(ptes, 0, sizeof(pte_t) * (len / PAGE_SIZE));
lru_add_drain(); lru_add_drain();
for (j = 0; j < len; j += PAGE_SIZE) { for (j = 0; j < len; j += PAGE_SIZE) {
page = pages[i]; page = pages[i];
...@@ -338,12 +337,12 @@ static unsigned long do_user_swap(struct mm_struct *mm, ...@@ -338,12 +337,12 @@ static unsigned long do_user_swap(struct mm_struct *mm,
if (pages_dirty) if (pages_dirty)
new_addr_start = new_addr_start | USWAP_PAGES_DIRTY; new_addr_start = new_addr_start | USWAP_PAGES_DIRTY;
kfree(ptes); kvfree(ptes);
return new_addr_start; return new_addr_start;
out_recover: out_recover:
uswapout_recover(mm, old_addr_start, i, pages, new_addr_start, ptes); uswapout_recover(mm, old_addr_start, i, pages, new_addr_start, ptes);
kfree(ptes); kvfree(ptes);
return ret; return ret;
} }
...@@ -388,7 +387,7 @@ unsigned long uswap_mremap(unsigned long old_addr, unsigned long old_len, ...@@ -388,7 +387,7 @@ unsigned long uswap_mremap(unsigned long old_addr, unsigned long old_len,
for (i = 0; i < len / PAGE_SIZE; i++) for (i = 0; i < len / PAGE_SIZE; i++)
if (pages[i]) if (pages[i])
put_page(pages[i]); put_page(pages[i]);
kfree(pages); kvfree(pages);
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册