]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: implement rawVforkSyscall for remaining linux platforms
authorJoel Sing <joel@sing.id.au>
Tue, 7 May 2019 07:56:49 +0000 (17:56 +1000)
committerJoel Sing <joel@sing.id.au>
Wed, 3 Mar 2021 05:33:21 +0000 (05:33 +0000)
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>
src/syscall/asm_linux_386.s
src/syscall/asm_linux_amd64.s
src/syscall/asm_linux_arm.s
src/syscall/asm_linux_arm64.s
src/syscall/asm_linux_mips64x.s
src/syscall/asm_linux_mipsx.s
src/syscall/exec_linux.go
src/syscall/syscall_linux_386.go
src/syscall/syscall_linux_arm.go
src/syscall/syscall_linux_mips64x.go
src/syscall/syscall_linux_mipsx.go

index 4201f367ba6ae25ec057170806b27ccfb7384e7f..1c69083118c35bd985d59d8bce338f23c7a56ccf 100644 (file)
@@ -110,6 +110,26 @@ ok2:
        MOVL    $0, err+36(FP)
        RET
 
+// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
+TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16
+       MOVL    trap+0(FP), AX  // syscall entry
+       MOVL    a1+4(FP), BX
+       MOVL    $0, CX
+       MOVL    $0, DX
+       POPL    SI // preserve return address
+       INVOKE_SYSCALL
+       PUSHL   SI
+       CMPL    AX, $0xfffff001
+       JLS     ok
+       MOVL    $-1, r1+8(FP)
+       NEGL    AX
+       MOVL    AX, err+12(FP)
+       RET
+ok:
+       MOVL    AX, r1+8(FP)
+       MOVL    $0, err+12(FP)
+       RET
+
 // func rawSyscallNoError(trap uintptr, a1, a2, a3 uintptr) (r1, r2 uintptr);
 TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-24
        MOVL    trap+0(FP), AX  // syscall entry
index ba22179dc2ed4099353d1d2c3b6eb318284a23fa..a9af68d51db96d562039d9cae7212de8a4bde9ec 100644 (file)
@@ -108,7 +108,7 @@ ok2:
        RET
 
 // func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
-TEXT ·rawVforkSyscall(SB),NOSPLIT,$0-32
+TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
        MOVQ    a1+8(FP), DI
        MOVQ    $0, SI
        MOVQ    $0, DX
index 458e9cce797897ff64d821d2283f671a5897b9fa..6bb4df81a0ec5b23d04ecb1131869241fe261890 100644 (file)
@@ -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
index fb22f8d547d78e6e30ef771982a22069480af40e..a30e4d87d4c08acb3604ee18d8e3ae519f459d43 100644 (file)
@@ -125,7 +125,6 @@ ok:
        MOVD    ZR, err+24(FP)  // errno
        RET
 
-
 // func rawSyscallNoError(trap uintptr, a1, a2, a3 uintptr) (r1, r2 uintptr);
 TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48
        MOVD    a1+8(FP), R0
index d0b0e5a0a877adcb5084f56b67a9d1eafc3bbe6e..b3ae59023dfaa0deccc49492aedfb79b0f85a65f 100644 (file)
@@ -102,6 +102,26 @@ ok2:
        MOVV    R0, err+72(FP)  // errno
        RET
 
+// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
+TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
+       MOVV    a1+8(FP), R4
+       MOVV    R0, R5
+       MOVV    R0, R6
+       MOVV    R0, R7
+       MOVV    R0, R8
+       MOVV    R0, R9
+       MOVV    trap+0(FP), R2  // syscall entry
+       SYSCALL
+       BEQ     R7, ok
+       MOVV    $-1, R1
+       MOVV    R1, r1+16(FP)   // r1
+       MOVV    R2, err+24(FP)  // errno
+       RET
+ok:
+       MOVV    R2, r1+16(FP)   // r1
+       MOVV    R0, err+24(FP)  // errno
+       RET
+
 TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48
        MOVV    a1+8(FP), R4
        MOVV    a2+16(FP), R5
index 5727e4d41d031ec7f75f68beadb70756e1752b26..ee436490b212cae11bbc010903cb46ea52ea2d19 100644 (file)
@@ -139,6 +139,23 @@ ok2:
        MOVW    R0, err+36(FP)  // errno
        RET
 
+// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
+TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16
+       MOVW    a1+4(FP), R4
+       MOVW    R0, R5
+       MOVW    R0, R6
+       MOVW    trap+0(FP), R2  // syscall entry
+       SYSCALL
+       BEQ     R7, ok
+       MOVW    $-1, R1
+       MOVW    R1, r1+8(FP)    // r1
+       MOVW    R2, err+12(FP)  // errno
+       RET
+ok:
+       MOVW    R2, r1+8(FP)    // r1
+       MOVW    R0, err+12(FP)  // errno
+       RET
+
 TEXT ·rawSyscallNoError(SB),NOSPLIT,$20-24
        MOVW    a1+4(FP), R4
        MOVW    a2+8(FP), R5
index b0099cb4b0cd3ad2403a10dfc28b2844b5d3ca09..6353da40489790fcff81f3e4de32f6410ce9cb31 100644 (file)
@@ -208,18 +208,12 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att
                }
        }
 
-       var hasRawVforkSyscall bool
-       switch runtime.GOARCH {
-       case "amd64", "arm64", "ppc64", "riscv64", "s390x":
-               hasRawVforkSyscall = true
-       }
-
        // About to call fork.
        // No more allocation or calls of non-assembly functions.
        runtime_BeforeFork()
        locked = true
        switch {
-       case hasRawVforkSyscall && (sys.Cloneflags&CLONE_NEWUSER == 0 && sys.Unshareflags&CLONE_NEWUSER == 0):
+       case sys.Cloneflags&CLONE_NEWUSER == 0 && sys.Unshareflags&CLONE_NEWUSER == 0:
                r1, err1 = rawVforkSyscall(SYS_CLONE, uintptr(SIGCHLD|CLONE_VFORK|CLONE_VM)|sys.Cloneflags)
        case runtime.GOARCH == "s390x":
                r1, _, err1 = RawSyscall6(SYS_CLONE, 0, uintptr(SIGCHLD)|sys.Cloneflags, 0, 0, 0, 0)
index ed5264740346bad129dc8feaeb7fcc15fb2650d8..0db037470d438761c4c290d27384aafe43c7eda2 100644 (file)
@@ -387,6 +387,4 @@ func (cmsg *Cmsghdr) SetLen(length int) {
        cmsg.Len = uint32(length)
 }
 
-func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno) {
-       panic("not implemented")
-}
+func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno)
index 4a3729f8981b520df330b24674abc1e61b8b1948..e887cf788f3ae20cab1ee83a502ff054f1383d97 100644 (file)
@@ -236,6 +236,4 @@ func (cmsg *Cmsghdr) SetLen(length int) {
        cmsg.Len = uint32(length)
 }
 
-func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno) {
-       panic("not implemented")
-}
+func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno)
index dd51f3d00a5c8891cd6a9877e99160a416588b9d..5feb03e915adf0021f5060b2fa6e5b88d9b973b7 100644 (file)
@@ -214,6 +214,4 @@ func (cmsg *Cmsghdr) SetLen(length int) {
        cmsg.Len = uint64(length)
 }
 
-func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno) {
-       panic("not implemented")
-}
+func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno)
index 7894bdd46536d2b38d8bfc0d1b0c78237c028279..39104d71d84520f8fe6dd3bb17d8944635354318 100644 (file)
@@ -224,6 +224,4 @@ func (cmsg *Cmsghdr) SetLen(length int) {
        cmsg.Len = uint32(length)
 }
 
-func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno) {
-       panic("not implemented")
-}
+func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno)