Signed-off-by: Liam R. Howlett <Liam.Howlett@xxxxxxxxxx> --- fs/proc/base.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index fd46d8dd0cf4..8f62ab2e77e5 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2315,6 +2315,7 @@ proc_map_files_readdir(struct file *file, struct dir_context *ctx) GENRADIX(struct map_files_info) fa; struct map_files_info *p; int ret; + MA_STATE(mas, NULL, 0, 0); genradix_init(&fa); @@ -2340,8 +2341,10 @@ proc_map_files_readdir(struct file *file, struct dir_context *ctx) mmput(mm); goto out_put_task; } + rcu_read_lock(); nr_files = 0; + mas.tree = &mm->mm_mt; /* * We need two passes here: @@ -2353,7 +2356,8 @@ proc_map_files_readdir(struct file *file, struct dir_context *ctx) * routine might require mmap_lock taken in might_fault(). */ - for (vma = mm->mmap, pos = 2; vma; vma = vma->vm_next) { + pos = 2; + mas_for_each(&mas, vma, ULONG_MAX) { if (!vma->vm_file) continue; if (++pos <= ctx->pos) @@ -2371,6 +2375,7 @@ proc_map_files_readdir(struct file *file, struct dir_context *ctx) p->end = vma->vm_end; p->mode = vma->vm_file->f_mode; } + rcu_read_unlock(); mmap_read_unlock(mm); mmput(mm); -- 2.30.2