aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchainhelen <chainhelen@gmail.com>2020-08-21 16:44:52 +0000
committerDmitri Shuralyov <dmitshur@golang.org>2020-09-02 12:57:08 +0000
commita269e5f9391ee462cd94ccfb59c8c4460d4a7eb7 (patch)
tree8d66a88b2811aa29c72d3cce8758f789102d3d00
parent0ffc5672df75accd06fb7477c46d4a7d1740401d (diff)
downloadgo-a269e5f9391ee462cd94ccfb59c8c4460d4a7eb7.tar.gz
go-a269e5f9391ee462cd94ccfb59c8c4460d4a7eb7.zip
[release-branch.go1.15] runtime: fix panic if newstack at runtime.acquireLockRank
Process may crash becaues acquireLockRank and releaseLockRank may be called in nosplit context. With optimizations and inlining disabled, these functions won't get inlined or have their morestack calls eliminated. Nosplit is not strictly required for lockWithRank, unlockWithRank and lockWithRankMayAcquire, just keep consistency with lockrank_on.go here. Updates #40843. Fixes #40845. Change-Id: I5824119f98a1da66d767cdb9a60dffe768f13c81 GitHub-Last-Rev: 38fd3ccf6ea03b670c7561c060ccdbccc42fff40 GitHub-Pull-Request: golang/go#40844 Reviewed-on: https://go-review.googlesource.com/c/go/+/248878 Reviewed-by: Dan Scales <danscales@google.com> Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> (cherry picked from commit b246c0e12fd41caf45a0f81eaa4f8fe249fbbc01) Reviewed-on: https://go-review.googlesource.com/c/go/+/252339 Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
-rw-r--r--src/runtime/lockrank_off.go10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/runtime/lockrank_off.go b/src/runtime/lockrank_off.go
index 425ca8dd93..32378a9627 100644
--- a/src/runtime/lockrank_off.go
+++ b/src/runtime/lockrank_off.go
@@ -18,19 +18,29 @@ func getLockRank(l *mutex) lockRank {
return 0
}
+// The following functions may be called in nosplit context.
+// Nosplit is not strictly required for lockWithRank, unlockWithRank
+// and lockWithRankMayAcquire, but these nosplit annotations must
+// be kept consistent with the equivalent functions in lockrank_on.go.
+
+//go:nosplit
func lockWithRank(l *mutex, rank lockRank) {
lock2(l)
}
+//go:nosplit
func acquireLockRank(rank lockRank) {
}
+//go:nosplit
func unlockWithRank(l *mutex) {
unlock2(l)
}
+//go:nosplit
func releaseLockRank(rank lockRank) {
}
+//go:nosplit
func lockWithRankMayAcquire(l *mutex, rank lockRank) {
}