]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: check mips64 VDSO clock_gettime return code
authorMeng Zhuo <mzh@golangcn.org>
Wed, 18 Nov 2020 02:28:18 +0000 (10:28 +0800)
committerMeng Zhuo <mzh@golangcn.org>
Thu, 7 Jan 2021 01:55:27 +0000 (01:55 +0000)
We introduced VDSO feature for mips64x in Go1.14, however Linux kernel
didn't ship VDSO safe fallback until 4.13.

This CL checks vdso return code it may fix this issue.

name         old time/op  new time/op  delta
Now           174ns ± 0%   176ns ± 0%  +1.20%  (p=0.000 n=8+9)
NowUnixNano   175ns ± 0%   177ns ± 0%  +1.13%  (p=0.000 n=9+7)
FormatNow    1.01µs ± 1%  1.02µs ± 3%    ~     (p=0.181 n=10+10)

Fixes #39046

Change-Id: Ibcefe4c8334f634c7ef18fa70f3c7dbe8306f224
Reviewed-on: https://go-review.googlesource.com/c/go/+/270717
Run-TryBot: Meng Zhuo <mzh@golangcn.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Trust: Michael Pratt <mpratt@google.com>
Trust: Meng Zhuo <mzh@golangcn.org>

src/runtime/sys_linux_mips64x.s

index afad056d06bd43edbd3f550b7b42c49706a14b7b..c3e9f37694578e140cd38c7300b60bdc4b148db0 100644 (file)
@@ -250,6 +250,14 @@ noswitch:
        BEQ     R25, fallback
 
        JAL     (R25)
+       // check on vdso call return for kernel compatibility
+       // see https://golang.org/issues/39046
+       // if we get any error make fallback permanent.
+       BEQ     R2, R0, finish
+       MOVV    R0, runtime·vdsoClockgettimeSym(SB)
+       MOVW    $0, R4 // CLOCK_REALTIME
+       MOVV    $0(R29), R5
+       JMP     fallback
 
 finish:
        MOVV    0(R29), R3      // sec
@@ -311,6 +319,12 @@ noswitch:
        BEQ     R25, fallback
 
        JAL     (R25)
+       // see walltime1 for detail
+       BEQ     R2, R0, finish
+       MOVV    R0, runtime·vdsoClockgettimeSym(SB)
+       MOVW    $1, R4 // CLOCK_MONOTONIC
+       MOVV    $0(R29), R5
+       JMP     fallback
 
 finish:
        MOVV    0(R29), R3      // sec