diff options
| author | Austin Clements <austin@google.com> | 2017-10-27 15:20:21 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2017-10-30 16:33:55 +0000 |
| commit | 15d6ab69fbd8c84cde109def59c7e002296c19e8 (patch) | |
| tree | 4e41f0e94965a21024d4c3bd13011edfea04922c /src/runtime/asm_arm64.s | |
| parent | 67a7d5d88503646a7e411cf5ae9c38e485b9be1b (diff) | |
| download | go-15d6ab69fbd8c84cde109def59c7e002296c19e8.tar.xz | |
runtime: make systemstack tail call if already switched
Currently systemstack always calls its argument, even if we're already
on the system stack. Unfortunately, traceback with _TraceJump stops at
the first systemstack it sees, which often cuts off runtime stacks
early in profiles.
Fix this by performing a tail call if we're already on the system
stack. This eliminates it from the traceback entirely, so it won't
stop prematurely (or all get mushed into a single node in the profile
graph).
Change-Id: Ibc69e8765e899f8d3806078517b8c7314da196f4
Reviewed-on: https://go-review.googlesource.com/74050
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/runtime/asm_arm64.s')
| -rw-r--r-- | src/runtime/asm_arm64.s | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/runtime/asm_arm64.s b/src/runtime/asm_arm64.s index b2aff1aab7..5e202e7a87 100644 --- a/src/runtime/asm_arm64.s +++ b/src/runtime/asm_arm64.s @@ -239,9 +239,11 @@ switch: noswitch: // already on m stack, just call directly + // Using a tail call here cleans up tracebacks since we won't stop + // at an intermediate systemstack. MOVD 0(R26), R3 // code pointer - BL (R3) - RET + MOVD.P 16(RSP), R30 // restore LR + B (R3) /* * support for morestack |
