fs/exec.c: move ->recursion_depth out of critical sections
authorAlexey Dobriyan <adobriyan@gmail.com>
Tue, 14 May 2019 22:44:37 +0000 (15:44 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 15 May 2019 02:52:50 +0000 (19:52 -0700)
->recursion_depth is changed only by current, therefore decrementing can
be done without taking any locks.

Link: http://lkml.kernel.org/r/20190417213150.GA26474@avx2
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/exec.c

index 2e0033348d8e10c02a5c3928caec876798edb1fd..d88584ebf07f310a89ceef07e3ead8351e6931fd 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1652,11 +1652,13 @@ int search_binary_handler(struct linux_binprm *bprm)
                if (!try_module_get(fmt->module))
                        continue;
                read_unlock(&binfmt_lock);
+
                bprm->recursion_depth++;
                retval = fmt->load_binary(bprm);
+               bprm->recursion_depth--;
+
                read_lock(&binfmt_lock);
                put_binfmt(fmt);
-               bprm->recursion_depth--;
                if (retval < 0 && !bprm->mm) {
                        /* we got to flush_old_exec() and failed after it */
                        read_unlock(&binfmt_lock);