Skip to content

Commit 81d995d

Browse files
minuxtoothrot
authored andcommitted
[release-branch.go1.13] runtime: fix darwin syscall performance regression
While understanding why syscall.Read is 2x slower on darwin/amd64, I found out that, contrary to popular belief, the slowdown is not due to the migration to use libSystem.dylib instead of direct SYSCALLs, i.e., CL 141639 (and #17490), but due to a subtle change introduced in CL 141639. Previously, syscall.Read used syscall.Syscall(SYS_READ), whose preamble called runtime.entersyscall, but after CL 141639, syscall.Read changes to call runtime.syscall_syscall instead, which in turn calls runtime.entersyscallblock instead of runtime.entersyscall. And the entire 2x slow down can be attributed to this change. I think this is unnecessary as even though syscalls like Read might block, it does not always block, so there is no need to handoff P proactively for each Read. Additionally, we have been fine with not handing off P for each Read prior to Go 1.12, so we probably don't need to change it. This changes restores the pre-Go 1.12 behavior, where syscall preamble uses runtime.entersyscall, and we rely on sysmon to take P back from g blocked in syscalls. Updates #34712 Change-Id: If76e97b5a7040cf1c10380a567c4f5baec3121ba Reviewed-on: https://go-review.googlesource.com/c/go/+/197938 Run-TryBot: Minux Ma <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Keith Randall <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> (cherry picked from commit c1635ad) Reviewed-on: https://go-review.googlesource.com/c/go/+/200103 Run-TryBot: Alexander Rakoczy <[email protected]> Reviewed-by: Cherry Zhang <[email protected]>
1 parent 842a1e7 commit 81d995d

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

src/runtime/sys_darwin.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func libcCall(fn, arg unsafe.Pointer) int32 {
6060
//go:nosplit
6161
//go:cgo_unsafe_args
6262
func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
63-
entersyscallblock()
63+
entersyscall()
6464
libcCall(unsafe.Pointer(funcPC(syscall)), unsafe.Pointer(&fn))
6565
exitsyscall()
6666
return
@@ -71,7 +71,7 @@ func syscall()
7171
//go:nosplit
7272
//go:cgo_unsafe_args
7373
func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
74-
entersyscallblock()
74+
entersyscall()
7575
libcCall(unsafe.Pointer(funcPC(syscall6)), unsafe.Pointer(&fn))
7676
exitsyscall()
7777
return
@@ -82,7 +82,7 @@ func syscall6()
8282
//go:nosplit
8383
//go:cgo_unsafe_args
8484
func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
85-
entersyscallblock()
85+
entersyscall()
8686
libcCall(unsafe.Pointer(funcPC(syscall6X)), unsafe.Pointer(&fn))
8787
exitsyscall()
8888
return
@@ -93,7 +93,7 @@ func syscall6X()
9393
//go:nosplit
9494
//go:cgo_unsafe_args
9595
func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
96-
entersyscallblock()
96+
entersyscall()
9797
libcCall(unsafe.Pointer(funcPC(syscallPtr)), unsafe.Pointer(&fn))
9898
exitsyscall()
9999
return

0 commit comments

Comments
 (0)