bool pageout;
 };
 
+struct madvise_behavior {
+       int behavior;
+       struct mmu_gather *tlb;
+};
+
 /*
  * Any behaviour which results in changes to the vma->vm_flags needs to
  * take mmap_lock for writing. Others, which simply traverse vmas, need
 static long madvise_dontneed_free(struct vm_area_struct *vma,
                                  struct vm_area_struct **prev,
                                  unsigned long start, unsigned long end,
-                                 int behavior)
+                                 struct madvise_behavior *madv_behavior)
 {
+       int behavior = madv_behavior->behavior;
        struct mm_struct *mm = vma->vm_mm;
 
        *prev = vma;
 static int madvise_vma_behavior(struct vm_area_struct *vma,
                                struct vm_area_struct **prev,
                                unsigned long start, unsigned long end,
-                               unsigned long behavior)
+                               void *behavior_arg)
 {
+       struct madvise_behavior *arg = behavior_arg;
+       int behavior = arg->behavior;
        int error;
        struct anon_vma_name *anon_name;
        unsigned long new_flags = vma->vm_flags;
        case MADV_FREE:
        case MADV_DONTNEED:
        case MADV_DONTNEED_LOCKED:
-               return madvise_dontneed_free(vma, prev, start, end, behavior);
+               return madvise_dontneed_free(vma, prev, start, end, arg);
        case MADV_NORMAL:
                new_flags = new_flags & ~VM_RAND_READ & ~VM_SEQ_READ;
                break;
  */
 static
 int madvise_walk_vmas(struct mm_struct *mm, unsigned long start,
-                     unsigned long end, unsigned long arg,
+                     unsigned long end, void *arg,
                      int (*visit)(struct vm_area_struct *vma,
                                   struct vm_area_struct **prev, unsigned long start,
-                                  unsigned long end, unsigned long arg))
+                                  unsigned long end, void *arg))
 {
        struct vm_area_struct *vma;
        struct vm_area_struct *prev;
 static int madvise_vma_anon_name(struct vm_area_struct *vma,
                                 struct vm_area_struct **prev,
                                 unsigned long start, unsigned long end,
-                                unsigned long anon_name)
+                                void *anon_name)
 {
        int error;
 
                return -EBADF;
 
        error = madvise_update_vma(vma, prev, start, end, vma->vm_flags,
-                                  (struct anon_vma_name *)anon_name);
+                                  anon_name);
 
        /*
         * madvise() returns EAGAIN if kernel resources, such as
        if (end == start)
                return 0;
 
-       return madvise_walk_vmas(mm, start, end, (unsigned long)anon_name,
+       return madvise_walk_vmas(mm, start, end, anon_name,
                                 madvise_vma_anon_name);
 }
 #endif /* CONFIG_ANON_VMA_NAME */
 }
 
 static int madvise_do_behavior(struct mm_struct *mm,
-               unsigned long start, size_t len_in, int behavior)
+               unsigned long start, size_t len_in,
+               struct madvise_behavior *madv_behavior)
 {
+       int behavior = madv_behavior->behavior;
        struct blk_plug plug;
        unsigned long end;
        int error;
        if (is_madvise_populate(behavior))
                error = madvise_populate(mm, start, end, behavior);
        else
-               error = madvise_walk_vmas(mm, start, end, behavior,
+               error = madvise_walk_vmas(mm, start, end, madv_behavior,
                                          madvise_vma_behavior);
        blk_finish_plug(&plug);
        return error;
 int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int behavior)
 {
        int error;
+       struct madvise_behavior madv_behavior = {.behavior = behavior};
 
        if (madvise_should_skip(start, len_in, behavior, &error))
                return error;
        error = madvise_lock(mm, behavior);
        if (error)
                return error;
-       error = madvise_do_behavior(mm, start, len_in, behavior);
+       error = madvise_do_behavior(mm, start, len_in, &madv_behavior);
        madvise_unlock(mm, behavior);
 
        return error;
 {
        ssize_t ret = 0;
        size_t total_len;
+       struct madvise_behavior madv_behavior = {.behavior = behavior};
 
        total_len = iov_iter_count(iter);
 
                if (madvise_should_skip(start, len_in, behavior, &error))
                        ret = error;
                else
-                       ret = madvise_do_behavior(mm, start, len_in, behavior);
+                       ret = madvise_do_behavior(mm, start, len_in,
+                                       &madv_behavior);
                /*
                 * An madvise operation is attempting to restart the syscall,
                 * but we cannot proceed as it would not be correct to repeat