Skip to content

Commit e54e808

Browse files
pmurmknyszek
authored andcommitted
[release-branch.go1.18] runtime: fix usleep on linux/PPC64
The existing implementation fails to convert the remainder microseconds to nanoseconds. This causes sysmon to consume much more cpu, and generate lots of context switches. We can also do a little better here to avoid division by a constant. I used go to determine the magic numbers. Fixes #56396 Change-Id: I2e37ec218b9027efab6db4634eed1504c0c1b3c8 Reviewed-on: https://go-review.googlesource.com/c/go/+/444735 Reviewed-by: Lynn Boger <[email protected]> Run-TryBot: Paul Murphy <[email protected]> Reviewed-by: David Chase <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Bryan Mills <[email protected]> Reviewed-on: https://go-review.googlesource.com/c/go/+/445156
1 parent db5cb5f commit e54e808

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

src/runtime/sys_linux_ppc64x.s

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,23 @@ TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20
119119
MOVW R3, errno+16(FP)
120120
RET
121121

122+
// func usleep(usec uint32)
122123
TEXT runtime·usleep(SB),NOSPLIT,$16-4
123124
MOVW usec+0(FP), R3
124-
MOVD R3, R5
125-
MOVW $1000000, R4
126-
DIVD R4, R3
127-
MOVD R3, 8(R1)
128-
MOVW $1000, R4
129-
MULLD R3, R4
130-
SUB R4, R5
131-
MOVD R5, 16(R1)
125+
126+
// Use magic constant 0x8637bd06 and shift right 51
127+
// to perform usec/1000000.
128+
ORIS $0x8637, R0, R4 // Note, R0 always contains 0 here.
129+
OR $0xbd06, R4, R4
130+
MULLD R3, R4, R4 // Convert usec to S.
131+
SRD $51, R4, R4
132+
MOVD R4, 8(R1) // Store to tv_sec
133+
134+
MOVD $1000000, R5
135+
MULLW R4, R5, R5 // Convert tv_sec back into uS
136+
SUB R5, R3, R5 // Compute remainder uS.
137+
MULLD $1000, R5, R5 // Convert to nsec
138+
MOVD R5, 16(R1) // Store to tv_nsec
132139

133140
// nanosleep(&ts, 0)
134141
ADD $8, R1, R3

0 commit comments

Comments
 (0)