-
Notifications
You must be signed in to change notification settings - Fork 17.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
runtime: don't clear lockedExt on locked M when G exits
When a locked M has its G exit without calling UnlockOSThread, then lockedExt on it was getting cleared. Unfortunately, this meant that during P handoff, if a new M was started, it might get forked (on most OSs besides Windows) from the locked M, which could have kernel state attached to it. To solve this, just don't clear lockedExt. At the point where the locked M has its G exit, it will also exit in accordance with the LockOSThread API. So, we can safely assume that it's lockedExt state will no longer be used. For the case of the main thread where it just gets wedged instead of exiting, it's probably better for it to keep the locked marker since it more accurately represents its state. Fixed #28979. Change-Id: I7d3d71dd65bcb873e9758086d2cbcb9a06429b0f Reviewed-on: https://go-review.googlesource.com/c/153078 Run-TryBot: Michael Knyszek <[email protected]> Reviewed-by: Austin Clements <[email protected]>
- Loading branch information
Showing
6 changed files
with
175 additions
and
30 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
// Copyright 2017 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
// +build linux | ||
|
||
package main | ||
|
||
import ( | ||
"bytes" | ||
"fmt" | ||
"io/ioutil" | ||
"os" | ||
"syscall" | ||
) | ||
|
||
func gettid() int { | ||
return syscall.Gettid() | ||
} | ||
|
||
func tidExists(tid int) (exists, supported bool) { | ||
stat, err := ioutil.ReadFile(fmt.Sprintf("/proc/self/task/%d/stat", tid)) | ||
if os.IsNotExist(err) { | ||
return false, true | ||
} | ||
// Check if it's a zombie thread. | ||
state := bytes.Fields(stat)[2] | ||
return !(len(state) == 1 && state[0] == 'Z'), true | ||
} | ||
|
||
func getcwd() (string, error) { | ||
if !syscall.ImplementsGetwd { | ||
return "", nil | ||
} | ||
// Use the syscall to get the current working directory. | ||
// This is imperative for checking for OS thread state | ||
// after an unshare since os.Getwd might just check the | ||
// environment, or use some other mechanism. | ||
var buf [4096]byte | ||
n, err := syscall.Getcwd(buf[:]) | ||
if err != nil { | ||
return "", err | ||
} | ||
// Subtract one for null terminator. | ||
return string(buf[:n-1]), nil | ||
} | ||
|
||
func unshareFs() error { | ||
return syscall.Unshare(syscall.CLONE_FS) | ||
} | ||
|
||
func chdir(path string) error { | ||
return syscall.Chdir(path) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters