Monorepo for Tangled tangled.org
2

Configure Feed

Select the types of activity you want to include in your feed.

spindle/microvm: move procs before applying resources to supervisor cgroup

Signed-off-by: dawn <dawn@tangled.org>

+16 -4
+16 -4
spindle/engines/microvm/cgroup.go
··· 239 239 } 240 240 241 241 func moveParentProcesses(parent *cgroup2.Manager, supervisorMemoryMinMiB int64, logger *slog.Logger) error { 242 - supervisor, err := parent.NewChild(supervisorCgroupName, supervisorResources(supervisorMemoryMinMiB)) 242 + procs, err := parent.Procs(false) 243 243 if err != nil { 244 - return fmt.Errorf("create supervisor cgroup: %w", err) 244 + return fmt.Errorf("list parent cgroup processes: %w", err) 245 245 } 246 246 247 - procs, err := parent.Procs(false) 247 + // first create with empty resources 248 + supervisor, err := parent.NewChild(supervisorCgroupName, &cgroup2.Resources{}) 248 249 if err != nil { 249 - return fmt.Errorf("list parent cgroup processes: %w", err) 250 + return fmt.Errorf("create supervisor cgroup: %w", err) 250 251 } 252 + 253 + // move procs 251 254 for _, pid := range procs { 252 255 if err := supervisor.AddProc(pid); err != nil { 253 256 return fmt.Errorf("move pid %d to supervisor cgroup: %w", pid, err) 257 + } 258 + } 259 + 260 + // now apply resources. we can't do this while parent has procs still 261 + if res := supervisorResources(supervisorMemoryMinMiB); res != nil { 262 + // we use a "new" parent here, this is so we enable subtree_control. 263 + // .Update() does not work here... 264 + if _, err = parent.NewChild(supervisorCgroupName, res); err != nil { 265 + return fmt.Errorf("apply supervisor cgroup resources: %w", err) 254 266 } 255 267 } 256 268