diff options
| author | Joel Sing <joel@sing.id.au> | 2019-05-07 17:56:49 +1000 |
|---|---|---|
| committer | Joel Sing <joel@sing.id.au> | 2021-03-03 05:33:21 +0000 |
| commit | 00cb841b83ad157bc21d36daf0626bbcd4af0d57 (patch) | |
| tree | 10d3c992346b69236eb1356bfd381cc5e4f49584 /src/syscall/asm_linux_arm.s | |
| parent | f2df1e3c34ceb2225d0df5c9ec92d5dc9e9ba919 (diff) | |
| download | go-00cb841b83ad157bc21d36daf0626bbcd4af0d57.tar.xz | |
syscall: implement rawVforkSyscall for remaining linux platforms
This allows the use of CLONE_VFORK and CLONE_VM for fork/exec, preventing
'fork/exec ...: cannot allocate memory' failures from occuring when attempting
to execute commands from a Go process that has a large memory footprint.
Additionally, this should reduce the latency of fork/exec on these platforms.
Fixes #31936
Change-Id: I4e28cf0763173145cacaa5340680dca9ff449305
Reviewed-on: https://go-review.googlesource.com/c/go/+/295849
Trust: Joel Sing <joel@sing.id.au>
Run-TryBot: Joel Sing <joel@sing.id.au>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/syscall/asm_linux_arm.s')
| -rw-r--r-- | src/syscall/asm_linux_arm.s | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/syscall/asm_linux_arm.s b/src/syscall/asm_linux_arm.s index 458e9cce79..6bb4df81a0 100644 --- a/src/syscall/asm_linux_arm.s +++ b/src/syscall/asm_linux_arm.s @@ -154,6 +154,27 @@ ok1: MOVW R0, err+24(FP) RET +// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr) +TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16 + MOVW trap+0(FP), R7 // syscall entry + MOVW a1+4(FP), R0 + MOVW $0, R1 + MOVW $0, R2 + SWI $0 + MOVW $0xfffff001, R1 + CMP R1, R0 + BLS ok + MOVW $-1, R1 + MOVW R1, r1+8(FP) + RSB $0, R0, R0 + MOVW R0, err+12(FP) + RET +ok: + MOVW R0, r1+8(FP) + MOVW $0, R0 + MOVW R0, err+12(FP) + RET + // func rawSyscallNoError(trap uintptr, a1, a2, a3 uintptr) (r1, r2 uintptr); TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-24 MOVW trap+0(FP), R7 // syscall entry |
