|
23 | 23 | &MemoryGroup{}, |
24 | 24 | &CpuGroup{}, |
25 | 25 | &CpuacctGroup{}, |
| 26 | + &PidsGroup{}, |
26 | 27 | &BlkioGroup{}, |
27 | 28 | &HugetlbGroup{}, |
28 | 29 | &NetClsGroup{}, |
@@ -105,8 +106,6 @@ func (m *Manager) Apply(pid int) (err error) { |
105 | 106 | return nil |
106 | 107 | } |
107 | 108 |
|
108 | | - var c = m.Cgroups |
109 | | - |
110 | 109 | d, err := getCgroupData(m.Cgroups, pid) |
111 | 110 | if err != nil { |
112 | 111 | return err |
@@ -135,13 +134,6 @@ func (m *Manager) Apply(pid int) (err error) { |
135 | 134 | paths[sys.Name()] = p |
136 | 135 | } |
137 | 136 | m.Paths = paths |
138 | | - |
139 | | - if paths["cpu"] != "" { |
140 | | - if err := CheckCpushares(paths["cpu"], c.Resources.CpuShares); err != nil { |
141 | | - return err |
142 | | - } |
143 | | - } |
144 | | - |
145 | 137 | return nil |
146 | 138 | } |
147 | 139 |
|
@@ -179,15 +171,34 @@ func (m *Manager) GetStats() (*cgroups.Stats, error) { |
179 | 171 | } |
180 | 172 |
|
181 | 173 | func (m *Manager) Set(container *configs.Config) error { |
182 | | - for name, path := range m.Paths { |
183 | | - sys, err := subsystems.Get(name) |
184 | | - if err == errSubsystemDoesNotExist || !cgroups.PathExists(path) { |
| 174 | + for _, sys := range subsystems { |
| 175 | + // We can't set this here, because after being applied, memcg doesn't |
| 176 | + // allow a non-empty cgroup from having its limits changed. |
| 177 | + if sys.Name() == "memory" { |
185 | 178 | continue |
186 | 179 | } |
| 180 | + |
| 181 | + // Generate fake cgroup data. |
| 182 | + d, err := getCgroupData(container.Cgroups, -1) |
| 183 | + if err != nil { |
| 184 | + return err |
| 185 | + } |
| 186 | + // Get the path, but don't error out if the cgroup wasn't found. |
| 187 | + path, err := d.path(sys.Name()) |
| 188 | + if err != nil && !cgroups.IsNotFound(err) { |
| 189 | + return err |
| 190 | + } |
| 191 | + |
187 | 192 | if err := sys.Set(path, container.Cgroups); err != nil { |
188 | 193 | return err |
189 | 194 | } |
190 | 195 | } |
| 196 | + |
| 197 | + if m.Paths["cpu"] != "" { |
| 198 | + if err := CheckCpushares(m.Paths["cpu"], container.Cgroups.Resources.CpuShares); err != nil { |
| 199 | + return err |
| 200 | + } |
| 201 | + } |
191 | 202 | return nil |
192 | 203 | } |
193 | 204 |
|
|
0 commit comments