mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Pass context to kernel.TaskImage.release().
PiperOrigin-RevId: 543541608
This commit is contained in:
@@ -147,7 +147,7 @@ func (t *Task) Clone(args *linux.CloneArgs) (ThreadID, *SyscallControl, error) {
|
||||
return 0, nil, err
|
||||
}
|
||||
cu.Add(func() {
|
||||
image.release()
|
||||
image.release(t)
|
||||
})
|
||||
// clone() returns 0 in the child.
|
||||
image.Arch.SetReturn(0)
|
||||
|
||||
@@ -94,7 +94,7 @@ func (*execStop) Killable() bool { return true }
|
||||
// goroutine.
|
||||
func (t *Task) Execve(newImage *TaskImage, argv, env []string, executable *vfs.FileDescription, pathname string) (*SyscallControl, error) {
|
||||
cu := cleanup.Make(func() {
|
||||
newImage.release()
|
||||
newImage.release(t)
|
||||
})
|
||||
defer cu.Clean()
|
||||
// We can't clearly hold kernel package locks while stat'ing executable.
|
||||
@@ -154,7 +154,7 @@ func (r *runSyscallAfterExecStop) execute(t *Task) taskRunState {
|
||||
t.tg.execing = nil
|
||||
if t.killed() {
|
||||
t.tg.pidns.owner.mu.Unlock()
|
||||
r.image.release()
|
||||
r.image.release(t)
|
||||
return (*runInterrupt)(nil)
|
||||
}
|
||||
// We are the thread group leader now. Save our old thread ID for
|
||||
@@ -248,7 +248,7 @@ func (r *runSyscallAfterExecStop) execute(t *Task) taskRunState {
|
||||
// Don't hold t.mu while calling t.image.release(), that may
|
||||
// attempt to acquire TaskImage.MemoryManager.mappingMu, a lock order
|
||||
// violation.
|
||||
oldImage.release()
|
||||
oldImage.release(t)
|
||||
|
||||
t.unstopVforkParent()
|
||||
t.p.FullStateChanged()
|
||||
|
||||
@@ -54,11 +54,11 @@ type TaskImage struct {
|
||||
|
||||
// release releases all resources held by the TaskImage. release is called by
|
||||
// the task when it execs into a new TaskImage.
|
||||
func (image *TaskImage) release() {
|
||||
func (image *TaskImage) release(ctx context.Context) {
|
||||
// Nil out pointers so that if the task is saved after release, it doesn't
|
||||
// follow the pointers to possibly now-invalid objects.
|
||||
if image.MemoryManager != nil {
|
||||
image.MemoryManager.DecUsers(context.Background())
|
||||
image.MemoryManager.DecUsers(ctx)
|
||||
image.MemoryManager = nil
|
||||
}
|
||||
image.fu = nil
|
||||
|
||||
@@ -113,7 +113,7 @@ type TaskConfig struct {
|
||||
func (ts *TaskSet) NewTask(ctx context.Context, cfg *TaskConfig) (*Task, error) {
|
||||
var err error
|
||||
cleanup := func() {
|
||||
cfg.TaskImage.release()
|
||||
cfg.TaskImage.release(ctx)
|
||||
cfg.FSContext.DecRef(ctx)
|
||||
cfg.FDTable.DecRef(ctx)
|
||||
cfg.IPCNamespace.DecRef(ctx)
|
||||
|
||||
Reference in New Issue
Block a user