Commit 8d48b2e0 authored by Alexey Dobriyan's avatar Alexey Dobriyan Committed by Linus Torvalds

proc: smaller readlock section in readdir("/proc")

Readdir context is thread local, so ->pos is thread local,
move it out of readlock.

Link: http://lkml.kernel.org/r/20180627195339.GD18113@avx2Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
Reviewed-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2cd36fb3
...@@ -286,9 +286,9 @@ int proc_readdir_de(struct file *file, struct dir_context *ctx, ...@@ -286,9 +286,9 @@ int proc_readdir_de(struct file *file, struct dir_context *ctx,
if (!dir_emit_dots(file, ctx)) if (!dir_emit_dots(file, ctx))
return 0; return 0;
i = ctx->pos - 2;
read_lock(&proc_subdir_lock); read_lock(&proc_subdir_lock);
de = pde_subdir_first(de); de = pde_subdir_first(de);
i = ctx->pos - 2;
for (;;) { for (;;) {
if (!de) { if (!de) {
read_unlock(&proc_subdir_lock); read_unlock(&proc_subdir_lock);
...@@ -309,8 +309,8 @@ int proc_readdir_de(struct file *file, struct dir_context *ctx, ...@@ -309,8 +309,8 @@ int proc_readdir_de(struct file *file, struct dir_context *ctx,
pde_put(de); pde_put(de);
return 0; return 0;
} }
read_lock(&proc_subdir_lock);
ctx->pos++; ctx->pos++;
read_lock(&proc_subdir_lock);
next = pde_subdir_next(de); next = pde_subdir_next(de);
pde_put(de); pde_put(de);
de = next; de = next;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment