Skip to content

Commit

Permalink
runtime: fix usleep on linux/PPC64
Browse files Browse the repository at this point in the history
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 golang#56374

Change-Id: I2e37ec218b9027efab6db4634eed1504c0c1b3c8
Reviewed-on: https://go-review.googlesource.com/c/go/+/444735
Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
Run-TryBot: Paul Murphy <murp@ibm.com>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
  • Loading branch information
pmur authored and romaindoumenc committed Nov 3, 2022
1 parent 6695343 commit 27cde35
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions src/runtime/sys_linux_ppc64x.s
Original file line number Diff line number Diff line change
Expand Up @@ -106,16 +106,23 @@ TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20
MOVW R3, errno+16(FP)
RET

// func usleep(usec uint32)
TEXT runtime·usleep(SB),NOSPLIT,$16-4
MOVW usec+0(FP), R3
MOVD R3, R5
MOVW $1000000, R4
DIVD R4, R3
MOVD R3, 8(R1)
MOVW $1000, R4
MULLD R3, R4
SUB R4, R5
MOVD R5, 16(R1)

// Use magic constant 0x8637bd06 and shift right 51
// to perform usec/1000000.
ORIS $0x8637, R0, R4 // Note, R0 always contains 0 here.
OR $0xbd06, R4, R4
MULLD R3, R4, R4 // Convert usec to S.
SRD $51, R4, R4
MOVD R4, 8(R1) // Store to tv_sec

MOVD $1000000, R5
MULLW R4, R5, R5 // Convert tv_sec back into uS
SUB R5, R3, R5 // Compute remainder uS.
MULLD $1000, R5, R5 // Convert to nsec
MOVD R5, 16(R1) // Store to tv_nsec

// nanosleep(&ts, 0)
ADD $8, R1, R3
Expand Down

0 comments on commit 27cde35

Please sign in to comment.