diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index c8ec0227f340095163320a0093c878122eebc79e..216a968eb7859d85abf6459189f227bfdc92e7bd 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -873,12 +873,12 @@ static int userfaultfd_release(struct inode *inode, struct file *file) prev = NULL; for (vma = mm->mmap; vma; vma = vma->vm_next) { userfault_flags = VM_UFFD_MISSING | VM_UFFD_WP; -#ifdef CONFIG_USERSWAP - uswap_release(&userfault_flags); -#endif cond_resched(); BUG_ON(!!vma->vm_userfaultfd_ctx.ctx ^ !!(vma->vm_flags & userfault_flags)); +#ifdef CONFIG_USERSWAP + uswap_release(&userfault_flags); +#endif if (vma->vm_userfaultfd_ctx.ctx != ctx) { prev = vma; continue; diff --git a/mm/userswap.c b/mm/userswap.c index 2d47f6ed9f9165200e0de0c2408e7b96fa6b9b5d..32cee1a2176767778c179ef5789dfac35c90eb4a 100644 --- a/mm/userswap.c +++ b/mm/userswap.c @@ -86,7 +86,7 @@ static unsigned long pages_can_be_swapped(struct mm_struct *mm, *ppages = NULL; - pages = kmalloc(sizeof(struct page *) * (len / PAGE_SIZE), GFP_KERNEL); + pages = kvzalloc(sizeof(struct page *) * (len / PAGE_SIZE), GFP_KERNEL); if (!pages) return -ENOMEM; @@ -151,7 +151,7 @@ static unsigned long pages_can_be_swapped(struct mm_struct *mm, out_err: for (i = 0; i < page_num; i++) put_page(pages[i]); - kfree(pages); + kvfree(pages); return ret; } @@ -291,10 +291,9 @@ static unsigned long do_user_swap(struct mm_struct *mm, unsigned long i = 0, j; int ret; - ptes = kmalloc(sizeof(pte_t) * (len / PAGE_SIZE), GFP_KERNEL); + ptes = kvzalloc(sizeof(pte_t) * (len / PAGE_SIZE), GFP_KERNEL); if (!ptes) return -ENOMEM; - memset(ptes, 0, sizeof(pte_t) * (len / PAGE_SIZE)); lru_add_drain(); for (j = 0; j < len; j += PAGE_SIZE) { page = pages[i]; @@ -338,12 +337,12 @@ static unsigned long do_user_swap(struct mm_struct *mm, if (pages_dirty) new_addr_start = new_addr_start | USWAP_PAGES_DIRTY; - kfree(ptes); + kvfree(ptes); return new_addr_start; out_recover: uswapout_recover(mm, old_addr_start, i, pages, new_addr_start, ptes); - kfree(ptes); + kvfree(ptes); return ret; } @@ -388,7 +387,7 @@ unsigned long uswap_mremap(unsigned long old_addr, unsigned long old_len, for (i = 0; i < len / PAGE_SIZE; i++) if (pages[i]) put_page(pages[i]); - kfree(pages); + kvfree(pages); return ret; }