diff --git a/src/runtime/mstkbar.go b/src/runtime/mstkbar.go
index 6f5b4598538a2cb1b47640d795456746aba15b67..1c1c2eaf0a323c37546fa0196aff2b629a198e69 100644
--- a/src/runtime/mstkbar.go
+++ b/src/runtime/mstkbar.go
@@ -300,16 +300,26 @@ func setNextBarrierPC(pc uintptr) {
 // This is necessary because a sigprof during barrier installation or
 // removal could observe inconsistencies between the stkbar array and
 // the stack itself and crash.
+//
+//go:nosplit
 func gcLockStackBarriers(gp *g) {
+	acquirem()
 	for !atomic.Cas(&gp.stackLock, 0, 1) {
 		osyield()
 	}
 }
 
+//go:nosplit
 func gcTryLockStackBarriers(gp *g) bool {
-	return atomic.Cas(&gp.stackLock, 0, 1)
+	mp := acquirem()
+	result := atomic.Cas(&gp.stackLock, 0, 1)
+	if !result {
+		releasem(mp)
+	}
+	return result
 }
 
 func gcUnlockStackBarriers(gp *g) {
 	atomic.Store(&gp.stackLock, 0)
+	releasem(getg().m)
 }