Message ID | 20170601145707.590629-1-arnd@arndb.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Arnd, 2017-06-01 23:57 GMT+09:00 Arnd Bergmann <arnd@arndb.de>: > checksyscalls.sh is run at every "make" run while building the kernel, > even if no files have changed. I looked at where we spend time in > a trivial empty rebuild and found checksyscalls.sh to be a source > of noticeable overhead, as it spawns a lot of child processes just > to call 'cat' copying from stdin to stdout, once for each of the > over 400 x86 syscalls. > > Using a shell-builtin (echo) instead of the external command gives > us a 13x speedup: > > Before After > real 0m1.018s real 0m0.077s > user 0m0.068s user 0m0.048s > sys 0m0.156s sys 0m0.024s > > The time it took to rebuild a single file on my machine dropped > from 5.5 seconds to 4.5 seconds. > I will apply this patch. On my PC, I did not see such a big difference as you saw, though. Big or small, it is speed-up anyway. My test result. Three times for each. Without this patch: masahiro@grover:~/workspace/linux$ time make prepare0 CHK include/config/kernel.release CHK include/generated/uapi/linux/version.h CHK include/generated/utsrelease.h CHK include/generated/bounds.h CHK include/generated/timeconst.h CHK include/generated/asm-offsets.h CALL scripts/checksyscalls.sh real 0m0.556s user 0m0.048s sys 0m0.028s masahiro@grover:~/workspace/linux$ time make prepare0 CHK include/config/kernel.release CHK include/generated/uapi/linux/version.h CHK include/generated/utsrelease.h CHK include/generated/bounds.h CHK include/generated/timeconst.h CHK include/generated/asm-offsets.h CALL scripts/checksyscalls.sh real 0m0.531s user 0m0.052s sys 0m0.012s masahiro@grover:~/workspace/linux$ time make prepare0 CHK include/config/kernel.release CHK include/generated/uapi/linux/version.h CHK include/generated/utsrelease.h CHK include/generated/bounds.h CHK include/generated/timeconst.h CHK include/generated/asm-offsets.h CALL scripts/checksyscalls.sh real 0m0.530s user 0m0.040s sys 0m0.020s With this patch: masahiro@grover:~/workspace/linux$ git log -1 --oneline b7a9f79 kbuild: speed up checksyscalls.sh masahiro@grover:~/workspace/linux$ time make prepare0 CHK include/config/kernel.release CHK include/generated/uapi/linux/version.h CHK include/generated/utsrelease.h CHK include/generated/bounds.h CHK include/generated/timeconst.h CHK include/generated/asm-offsets.h CALL scripts/checksyscalls.sh real 0m0.384s user 0m0.040s sys 0m0.008s masahiro@grover:~/workspace/linux$ time make prepare0 CHK include/config/kernel.release CHK include/generated/uapi/linux/version.h CHK include/generated/utsrelease.h CHK include/generated/bounds.h CHK include/generated/timeconst.h CHK include/generated/asm-offsets.h CALL scripts/checksyscalls.sh real 0m0.386s user 0m0.048s sys 0m0.000s masahiro@grover:~/workspace/linux$ time make prepare0 CHK include/config/kernel.release CHK include/generated/uapi/linux/version.h CHK include/generated/utsrelease.h CHK include/generated/bounds.h CHK include/generated/timeconst.h CHK include/generated/asm-offsets.h CALL scripts/checksyscalls.sh real 0m0.384s user 0m0.024s sys 0m0.024s
2017-06-01 23:57 GMT+09:00 Arnd Bergmann <arnd@arndb.de>: > checksyscalls.sh is run at every "make" run while building the kernel, > even if no files have changed. I looked at where we spend time in > a trivial empty rebuild and found checksyscalls.sh to be a source > of noticeable overhead, as it spawns a lot of child processes just > to call 'cat' copying from stdin to stdout, once for each of the > over 400 x86 syscalls. > > Using a shell-builtin (echo) instead of the external command gives > us a 13x speedup: > > Before After > real 0m1.018s real 0m0.077s > user 0m0.068s user 0m0.048s > sys 0m0.156s sys 0m0.024s > > The time it took to rebuild a single file on my machine dropped > from 5.5 seconds to 4.5 seconds. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> Applied to linux-kbuild/kbuild. Thanks!
diff --git a/scripts/checksyscalls.sh b/scripts/checksyscalls.sh index 0cce56da3706..b8c9d2b04ffc 100755 --- a/scripts/checksyscalls.sh +++ b/scripts/checksyscalls.sh @@ -231,15 +231,12 @@ EOF } syscall_list() { - grep '^[0-9]' "$1" | sort -n | ( + grep '^[0-9]' "$1" | sort -n | while read nr abi name entry ; do - cat <<EOF -#if !defined(__NR_${name}) && !defined(__IGNORE_${name}) -#warning syscall ${name} not implemented -#endif -EOF + echo "#if !defined(__NR_${name}) && !defined(__IGNORE_${name})" + echo "#warning syscall ${name} not implemented" + echo "#endif" done - ) } (ignore_list && syscall_list $(dirname $0)/../arch/x86/entry/syscalls/syscall_32.tbl) | \
checksyscalls.sh is run at every "make" run while building the kernel, even if no files have changed. I looked at where we spend time in a trivial empty rebuild and found checksyscalls.sh to be a source of noticeable overhead, as it spawns a lot of child processes just to call 'cat' copying from stdin to stdout, once for each of the over 400 x86 syscalls. Using a shell-builtin (echo) instead of the external command gives us a 13x speedup: Before After real 0m1.018s real 0m0.077s user 0m0.068s user 0m0.048s sys 0m0.156s sys 0m0.024s The time it took to rebuild a single file on my machine dropped from 5.5 seconds to 4.5 seconds. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- scripts/checksyscalls.sh | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)