lkml.org 
[lkml]   [2022]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH v2 2/2] LoongArch: No need to call RESTORE_ALL_AND_RET for all syscalls
From
Date
Cc Jiaxun Yang <jiaxun.yang@flygoat.com>

On 06/22/2022 06:01 PM, Huacai Chen wrote:
> Hi, Tiezhu,
>
> On Tue, Jun 21, 2022 at 6:08 PM Tiezhu Yang <yangtiezhu@loongson.cn> wrote:
>>
>> In handle_syscall, it is unnecessary to call RESTORE_ALL_AND_RET
>> for all syscalls.
>>
>> (1) rt_sigreturn call RESTORE_ALL_AND_RET.
>> (2) The other syscalls call RESTORE_STATIC_SOME_SP_AND_RET.
>>
>> This patch only adds the minimal changes as simple as possible
>> to reduce the code complexity, at the same time, it can reduce
>> many load instructions.
>>
>> Here are the test environments:
>>
>> Hardware: Loongson-LS3A5000-7A1000-1w-A2101
>> Firmware: UDK2018-LoongArch-A2101-pre-beta8 [1]
>> System: loongarch64-clfs-system-5.0 [2]
>>
>> The system passed functional testing used with the following
>> test case without and with this patch:
>>
>> git clone https://github.com/hevz/sigaction-test.git
>> cd sigaction-test
>> make check
>>
>> Additionally, use UnixBench syscall to test the performance:
>>
>> git clone https://github.com/kdlucas/byte-unixbench.git
>> cd byte-unixbench/UnixBench/
>> make
>> pgms/syscall 600
>>
>> In order to avoid the performance impact, add init=/bin/bash
>> to the boot cmdline.
>>
>> Here is the test result, the bigger the better, it shows about
>> 1.2% gain tested with close, getpid and exec [3]:
>>
>> duration without_this_patch with_this_patch
>> 600 s 626558267 lps 634244079 lps
>>
>> [1] https://github.com/loongson/Firmware/tree/main/5000Series/PC/A2101
>> [2] https://github.com/sunhaiyong1978/CLFS-for-LoongArch/releases/tag/5.0
>> [3] https://github.com/kdlucas/byte-unixbench/blob/master/UnixBench/src/syscall.c
> I test your patch and the whole UnixBench result is like this:
>
> Before patch, single thread:
>
> System Benchmarks Index Values BASELINE RESULT INDEX
> Dhrystone 2 using register variables 116700.0 9235787.7 791.4
> Double-Precision Whetstone 55.0 2758.7 501.6
> Execl Throughput 43.0 2386.8 555.1
> File Copy 1024 bufsize 2000 maxblocks 3960.0 191752.0 484.2
> File Copy 256 bufsize 500 maxblocks 1655.0 78737.9 475.8
> File Copy 4096 bufsize 8000 maxblocks 5800.0 297402.5 512.8
> Pipe Throughput 12440.0 353658.1 284.3
> Pipe-based Context Switching 4000.0 120140.8 300.4
> Process Creation 126.0 5735.0 455.2
> Shell Scripts (1 concurrent) 42.4 2701.5 637.1
> Shell Scripts (8 concurrent) 6.0 894.9 1491.5
> System Call Overhead 15000.0 557467.4 371.6
> ========
> System Benchmarks Index Score 516.1
>
> After patch, single thread:
>
> System Benchmarks Index Values BASELINE RESULT INDEX
> Dhrystone 2 using register variables 116700.0 9235688.9 791.4
> Double-Precision Whetstone 55.0 2758.7 501.6
> Execl Throughput 43.0 2377.8 553.0
> File Copy 1024 bufsize 2000 maxblocks 3960.0 192545.5 486.2
> File Copy 256 bufsize 500 maxblocks 1655.0 79735.0 481.8
> File Copy 4096 bufsize 8000 maxblocks 5800.0 299621.9 516.6
> Pipe Throughput 12440.0 354969.1 285.3
> Pipe-based Context Switching 4000.0 118307.5 295.8
> Process Creation 126.0 5757.0 456.9
> Shell Scripts (1 concurrent) 42.4 2695.4 635.7
> Shell Scripts (8 concurrent) 6.0 894.4 1490.6
> System Call Overhead 15000.0 563582.7 375.7
> ========
> System Benchmarks Index Score 517.0
>
> Before patch, multi-threads:
>
> System Benchmarks Index Values BASELINE RESULT INDEX
> Dhrystone 2 using register variables 116700.0 36943633.4 3165.7
> Double-Precision Whetstone 55.0 11035.8 2006.5
> Execl Throughput 43.0 8800.1 2046.5
> File Copy 1024 bufsize 2000 maxblocks 3960.0 277638.3 701.1
> File Copy 256 bufsize 500 maxblocks 1655.0 92530.5 559.1
> File Copy 4096 bufsize 8000 maxblocks 5800.0 524344.3 904.0
> Pipe Throughput 12440.0 1359237.2 1092.6
> Pipe-based Context Switching 4000.0 571511.4 1428.8
> Process Creation 126.0 20823.3 1652.6
> Shell Scripts (1 concurrent) 42.4 6883.9 1623.6
> Shell Scripts (8 concurrent) 6.0 981.7 1636.1
> System Call Overhead 15000.0 2029539.8 1353.0
> ========
> System Benchmarks Index Score 1367.4
>
> After patch, multi-threads:
>
> System Benchmarks Index Values BASELINE RESULT INDEX
> Dhrystone 2 using register variables 116700.0 36943793.6 3165.7
> Double-Precision Whetstone 55.0 11035.5 2006.4
> Execl Throughput 43.0 8768.3 2039.1
> File Copy 1024 bufsize 2000 maxblocks 3960.0 277962.9 701.9
> File Copy 256 bufsize 500 maxblocks 1655.0 92059.7 556.3
> File Copy 4096 bufsize 8000 maxblocks 5800.0 525937.5 906.8
> Pipe Throughput 12440.0 1361566.6 1094.5
> Pipe-based Context Switching 4000.0 575835.4 1439.6
> Process Creation 126.0 20426.4 1621.1
> Shell Scripts (1 concurrent) 42.4 6877.5 1622.0
> Shell Scripts (8 concurrent) 6.0 980.3 1633.8
> System Call Overhead 15000.0 2049771.6 1366.5
> ========
> System Benchmarks Index Score 1366.6
>
> From my point of view, the benefit is negligible.

There is another way to look at what is going on.
This patch is related with syscall, I prefer to
observe "System Call Overhead" in the test results.

Here are the INDEX of "System Call Overhead" in your test results:

thread before_patch after_patch gain
single 371.6 375.7 1.103%
multi 1353.0 1366.5 0.998%

For now, I would like to wait for other people's review.
If the conclusion is the optimization is meaningless,
I am fine with ignoring this patch.

Thanks,
Tiezhu

>
>
> Huacai
>
>>
>> Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
>> ---
>> arch/loongarch/include/asm/stackframe.h | 5 +++++
>> arch/loongarch/kernel/entry.S | 15 +++++++++++++++
>> 2 files changed, 20 insertions(+)
>>
>> diff --git a/arch/loongarch/include/asm/stackframe.h b/arch/loongarch/include/asm/stackframe.h
>> index 4ca9530..551ab8f 100644
>> --- a/arch/loongarch/include/asm/stackframe.h
>> +++ b/arch/loongarch/include/asm/stackframe.h
>> @@ -216,4 +216,9 @@
>> RESTORE_SP_AND_RET \docfi
>> .endm
>>
>> + .macro RESTORE_STATIC_SOME_SP_AND_RET docfi=0
>> + RESTORE_STATIC \docfi
>> + RESTORE_SOME \docfi
>> + RESTORE_SP_AND_RET \docfi
>> + .endm
>> #endif /* _ASM_STACKFRAME_H */
>> diff --git a/arch/loongarch/kernel/entry.S b/arch/loongarch/kernel/entry.S
>> index d5b3dbc..c764c99 100644
>> --- a/arch/loongarch/kernel/entry.S
>> +++ b/arch/loongarch/kernel/entry.S
>> @@ -14,6 +14,7 @@
>> #include <asm/regdef.h>
>> #include <asm/stackframe.h>
>> #include <asm/thread_info.h>
>> +#include <asm/unistd.h>
>>
>> .text
>> .cfi_sections .debug_frame
>> @@ -62,9 +63,23 @@ SYM_FUNC_START(handle_syscall)
>> li.d tp, ~_THREAD_MASK
>> and tp, tp, sp
>>
>> + /* Syscall number held in a7, we can store it in TI_SYSCALL. */
>> + LONG_S a7, tp, TI_SYSCALL
>> +
>> move a0, sp
>> bl do_syscall
>>
>> + /*
>> + * Syscall number held in a7 which is stored in TI_SYSCALL.
>> + * rt_sigreturn call RESTORE_ALL_AND_RET.
>> + * The other syscalls call RESTORE_STATIC_SOME_SP_AND_RET.
>> + */
>> + LONG_L t3, tp, TI_SYSCALL
>> + li.w t4, __NR_rt_sigreturn
>> + beq t3, t4, 1f
>> +
>> + RESTORE_STATIC_SOME_SP_AND_RET
>> +1:
>> RESTORE_ALL_AND_RET
>> SYM_FUNC_END(handle_syscall)
>>
>> --
>> 2.1.0
>>

\
 
 \ /
  Last update: 2022-06-23 02:45    [W:0.066 / U:0.416 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site