runc/patch/0124-runc-fix-freezing-race.patch
xiadanni 86bbece715 runc: sync bugfix
1. add cpu and memory info when print cgroup info
2. fix freezing race

Signed-off-by: xiadanni <xiadanni1@huawei.com>
2021-03-18 11:10:23 +08:00

70 lines
2.2 KiB
Diff

From 943822abaa0aee51985384912292589ae1e34622 Mon Sep 17 00:00:00 2001
From: xiadanni <xiadanni1@huawei.com>
Date: Thu, 4 Feb 2021 16:26:49 +0800
Subject: [PATCH] runc: fix freezing race
runc kill blocks in freezer.Set, freezer.state keeps in freezing,
because new process is creating during freeze.
Upstream:https://github.com/opencontainers/runc/pull/2774
https://github.com/opencontainers/runc/pull/2791
Signed-off-by: xiadanni <xiadanni1@huawei.com>
---
libcontainer/cgroups/fs/freezer.go | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/libcontainer/cgroups/fs/freezer.go b/libcontainer/cgroups/fs/freezer.go
index 5ab3c02..40f70c1 100644
--- a/libcontainer/cgroups/fs/freezer.go
+++ b/libcontainer/cgroups/fs/freezer.go
@@ -3,6 +3,7 @@
package fs
import (
+ "errors"
"fmt"
"strings"
"time"
@@ -28,24 +29,32 @@ func (s *FreezerGroup) Apply(d *cgroupData) error {
func (s *FreezerGroup) Set(path string, cgroup *configs.Cgroup) error {
switch cgroup.Resources.Freezer {
- case configs.Frozen, configs.Thawed:
- for {
+ case configs.Frozen:
+ for i := 0; i < 1000; i++ {
+ if i%50 == 49 {
+ writeFile(path, "freezer.state", string(configs.Thawed))
+ time.Sleep(10 * time.Millisecond)
+ }
// In case this loop does not exit because it doesn't get the expected
// state, let's write again this state, hoping it's going to be properly
// set this time. Otherwise, this loop could run infinitely, waiting for
// a state change that would never happen.
- if err := writeFile(path, "freezer.state", string(cgroup.Resources.Freezer)); err != nil {
+ if err := writeFile(path, "freezer.state", string(configs.Frozen)); err != nil {
return err
}
state, err := readFile(path, "freezer.state")
if err != nil {
return err
}
- if strings.TrimSpace(state) == string(cgroup.Resources.Freezer) {
- break
+ if strings.TrimSpace(state) == string(configs.Frozen) {
+ return nil
}
time.Sleep(1 * time.Millisecond)
}
+ writeFile(path, "freezer.state", string(configs.Thawed))
+ return errors.New("unable to freeze")
+ case configs.Thawed:
+ return writeFile(path, "freezer.state", string(configs.Thawed))
case configs.Undefined:
return nil
default:
--
1.8.3.1