@@ -195,24 +195,36 @@ func (p *staticPolicy) validateState(s state.State) error {
195
195
tmpAssignments := s .GetCPUAssignments ()
196
196
tmpDefaultCPUset := s .GetDefaultCPUSet ()
197
197
198
+ allCPUs := p .topology .CPUDetails .CPUs ()
199
+ if p .options .StrictCPUReservation {
200
+ allCPUs = allCPUs .Difference (p .reservedCPUs )
201
+ }
202
+
198
203
// Default cpuset cannot be empty when assignments exist
199
204
if tmpDefaultCPUset .IsEmpty () {
200
205
if len (tmpAssignments ) != 0 {
201
206
return fmt .Errorf ("default cpuset cannot be empty" )
202
207
}
203
208
// state is empty initialize
204
- allCPUs := p .topology .CPUDetails .CPUs ()
205
209
s .SetDefaultCPUSet (allCPUs )
210
+ klog .InfoS ("Static policy initialized" , "defaultCPUSet" , allCPUs )
206
211
return nil
207
212
}
208
213
209
214
// State has already been initialized from file (is not empty)
210
215
// 1. Check if the reserved cpuset is not part of default cpuset because:
211
216
// - kube/system reserved have changed (increased) - may lead to some containers not being able to start
212
217
// - user tampered with file
213
- if ! p .reservedCPUs .Intersection (tmpDefaultCPUset ).Equals (p .reservedCPUs ) {
214
- return fmt .Errorf ("not all reserved cpus: \" %s\" are present in defaultCpuSet: \" %s\" " ,
215
- p .reservedCPUs .String (), tmpDefaultCPUset .String ())
218
+ if p .options .StrictCPUReservation {
219
+ if ! p .reservedCPUs .Intersection (tmpDefaultCPUset ).IsEmpty () {
220
+ return fmt .Errorf ("some of strictly reserved cpus: \" %s\" are present in defaultCpuSet: \" %s\" " ,
221
+ p .reservedCPUs .Intersection (tmpDefaultCPUset ).String (), tmpDefaultCPUset .String ())
222
+ }
223
+ } else {
224
+ if ! p .reservedCPUs .Intersection (tmpDefaultCPUset ).Equals (p .reservedCPUs ) {
225
+ return fmt .Errorf ("not all reserved cpus: \" %s\" are present in defaultCpuSet: \" %s\" " ,
226
+ p .reservedCPUs .String (), tmpDefaultCPUset .String ())
227
+ }
216
228
}
217
229
218
230
// 2. Check if state for static policy is consistent
@@ -235,15 +247,20 @@ func (p *staticPolicy) validateState(s state.State) error {
235
247
// the set of CPUs stored in the state.
236
248
totalKnownCPUs := tmpDefaultCPUset .Clone ()
237
249
tmpCPUSets := []cpuset.CPUSet {}
250
+ tmpAllCPUs := p .topology .CPUDetails .CPUs ()
238
251
for pod := range tmpAssignments {
239
252
for _ , cset := range tmpAssignments [pod ] {
240
253
tmpCPUSets = append (tmpCPUSets , cset )
241
254
}
242
255
}
243
256
totalKnownCPUs = totalKnownCPUs .Union (tmpCPUSets ... )
244
- if ! totalKnownCPUs .Equals (p .topology .CPUDetails .CPUs ()) {
257
+ if p .options .StrictCPUReservation {
258
+ tmpAllCPUs = tmpAllCPUs .Difference (p .reservedCPUs )
259
+ }
260
+ if ! totalKnownCPUs .Equals (tmpAllCPUs ) {
245
261
return fmt .Errorf ("current set of available CPUs \" %s\" doesn't match with CPUs in state \" %s\" " ,
246
- p .topology .CPUDetails .CPUs ().String (), totalKnownCPUs .String ())
262
+ tmpAllCPUs .String (), totalKnownCPUs .String ())
263
+
247
264
}
248
265
249
266
return nil
0 commit comments