struct vm_area_struct **prev,
                             unsigned long start, unsigned long end)
 {
+       struct mm_struct *mm = vma->vm_mm;
        struct file *file = vma->vm_file;
        loff_t offset;
 
        get_file(file);
        offset = (loff_t)(start - vma->vm_start)
                        + ((loff_t)vma->vm_pgoff << PAGE_SHIFT);
-       mmap_read_unlock(current->mm);
+       mmap_read_unlock(mm);
        vfs_fadvise(file, offset, end - start, POSIX_FADV_WILLNEED);
        fput(file);
-       mmap_read_lock(current->mm);
+       mmap_read_lock(mm);
        return 0;
 }
 
                                  unsigned long start, unsigned long end,
                                  int behavior)
 {
+       struct mm_struct *mm = vma->vm_mm;
+
        *prev = vma;
        if (!can_madv_lru_vma(vma))
                return -EINVAL;
        if (!userfaultfd_remove(vma, start, end)) {
                *prev = NULL; /* mmap_lock has been dropped, prev is stale */
 
-               mmap_read_lock(current->mm);
-               vma = find_vma(current->mm, start);
+               mmap_read_lock(mm);
+               vma = find_vma(mm, start);
                if (!vma)
                        return -ENOMEM;
                if (start < vma->vm_start) {
        loff_t offset;
        int error;
        struct file *f;
+       struct mm_struct *mm = vma->vm_mm;
 
        *prev = NULL;   /* tell sys_madvise we drop mmap_lock */
 
        get_file(f);
        if (userfaultfd_remove(vma, start, end)) {
                /* mmap_lock was not released by userfaultfd_remove() */
-               mmap_read_unlock(current->mm);
+               mmap_read_unlock(mm);
        }
        error = vfs_fallocate(f,
                                FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
                                offset, end - start);
        fput(f);
-       mmap_read_lock(current->mm);
+       mmap_read_lock(mm);
        return error;
 }
 
  *  -EBADF  - map exists, but area maps something that isn't a file.
  *  -EAGAIN - a kernel resource was temporarily unavailable.
  */
-int do_madvise(unsigned long start, size_t len_in, int behavior)
+int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int behavior)
 {
        unsigned long end, tmp;
        struct vm_area_struct *vma, *prev;
 
        write = madvise_need_mmap_write(behavior);
        if (write) {
-               if (mmap_write_lock_killable(current->mm))
+               if (mmap_write_lock_killable(mm))
                        return -EINTR;
        } else {
-               mmap_read_lock(current->mm);
+               mmap_read_lock(mm);
        }
 
        /*
         * ranges, just ignore them, but return -ENOMEM at the end.
         * - different from the way of handling in mlock etc.
         */
-       vma = find_vma_prev(current->mm, start, &prev);
+       vma = find_vma_prev(mm, start, &prev);
        if (vma && start > vma->vm_start)
                prev = vma;
 
                if (prev)
                        vma = prev->vm_next;
                else    /* madvise_remove dropped mmap_lock */
-                       vma = find_vma(current->mm, start);
+                       vma = find_vma(mm, start);
        }
 out:
        blk_finish_plug(&plug);
        if (write)
-               mmap_write_unlock(current->mm);
+               mmap_write_unlock(mm);
        else
-               mmap_read_unlock(current->mm);
+               mmap_read_unlock(mm);
 
        return error;
 }
 
 SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior)
 {
-       return do_madvise(start, len_in, behavior);
+       return do_madvise(current->mm, start, len_in, behavior);
 }