]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: reduce syscall when call runtime.clone
authorcui <cuiweixie@gmail.com>
Wed, 12 Aug 2020 17:33:41 +0000 (17:33 +0000)
committerIan Lance Taylor <iant@golang.org>
Wed, 19 Aug 2020 00:02:38 +0000 (00:02 +0000)
Change-Id: I3ea398fd86aae4c86557dd6fff65d90a6f756890
GitHub-Last-Rev: 4c295388f7b5e6768ffd2530337f78b4c75a9310
GitHub-Pull-Request: golang/go#40392
Reviewed-on: https://go-review.googlesource.com/c/go/+/244626
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/sys_linux_amd64.s

index 621c01b365b9a315676fd034fd156f74b456e534..8d90813589198328184e7869cc1220a1ab5d80c6 100644 (file)
@@ -592,13 +592,25 @@ TEXT runtime·clone(SB),NOSPLIT,$0
        MOVQ    stk+8(FP), SI
        MOVQ    $0, DX
        MOVQ    $0, R10
-
+       MOVQ    $0, R8
        // Copy mp, gp, fn off parent stack for use by child.
        // Careful: Linux system call clobbers CX and R11.
-       MOVQ    mp+16(FP), R8
+       MOVQ    mp+16(FP), R13
        MOVQ    gp+24(FP), R9
        MOVQ    fn+32(FP), R12
-
+       CMPQ    R13, $0    // m
+       JEQ     nog1
+       CMPQ    R9, $0    // g
+       JEQ     nog1
+       LEAQ    m_tls(R13), R8
+#ifdef GOOS_android
+       // Android stores the TLS offset in runtime·tls_g.
+       SUBQ    runtime·tls_g(SB), R8
+#else
+       ADDQ    $8, R8  // ELF wants to use -8(FS)
+#endif
+       ORQ     $0x00080000, DI //add flag CLONE_SETTLS(0x00080000) to call clone
+nog1:
        MOVL    $SYS_clone, AX
        SYSCALL
 
@@ -612,27 +624,23 @@ TEXT runtime·clone(SB),NOSPLIT,$0
        MOVQ    SI, SP
 
        // If g or m are nil, skip Go-related setup.
-       CMPQ    R8, $0    // m
-       JEQ     nog
+       CMPQ    R13, $0    // m
+       JEQ     nog2
        CMPQ    R9, $0    // g
-       JEQ     nog
+       JEQ     nog2
 
        // Initialize m->procid to Linux tid
        MOVL    $SYS_gettid, AX
        SYSCALL
-       MOVQ    AX, m_procid(R8)
-
-       // Set FS to point at m->tls.
-       LEAQ    m_tls(R8), DI
-       CALL    runtime·settls(SB)
+       MOVQ    AX, m_procid(R13)
 
        // In child, set up new stack
        get_tls(CX)
-       MOVQ    R8, g_m(R9)
+       MOVQ    R13, g_m(R9)
        MOVQ    R9, g(CX)
        CALL    runtime·stackcheck(SB)
 
-nog:
+nog2:
        // Call fn
        CALL    R12