@@ -143,7 +143,7 @@ func (m *kubeGenericRuntimeManager) generateLinuxContainerResources(pod *v1.Pod,
143
143
lcr .OomScoreAdj = int64 (qos .GetContainerOOMScoreAdjust (pod , container ,
144
144
int64 (m .machineInfo .MemoryCapacity )))
145
145
146
- lcr .HugepageLimits = GetHugepageLimitsFromResources (container .Resources )
146
+ lcr .HugepageLimits = GetHugepageLimitsFromResources (pod , container .Resources )
147
147
148
148
// Configure swap for the container
149
149
m .configureContainerSwapResources (lcr , pod , container )
@@ -300,7 +300,7 @@ func (m *kubeGenericRuntimeManager) calculateLinuxResources(cpuRequest, cpuLimit
300
300
}
301
301
302
302
// GetHugepageLimitsFromResources returns limits of each hugepages from resources.
303
- func GetHugepageLimitsFromResources (resources v1.ResourceRequirements ) []* runtimeapi.HugepageLimit {
303
+ func GetHugepageLimitsFromResources (pod * v1. Pod , resources v1.ResourceRequirements ) []* runtimeapi.HugepageLimit {
304
304
var hugepageLimits []* runtimeapi.HugepageLimit
305
305
306
306
// For each page size, limit to 0.
@@ -312,23 +312,20 @@ func GetHugepageLimitsFromResources(resources v1.ResourceRequirements) []*runtim
312
312
}
313
313
314
314
requiredHugepageLimits := map [string ]uint64 {}
315
- for resourceObj , amountObj := range resources .Limits {
316
- if ! v1helper .IsHugePageResourceName (resourceObj ) {
317
- continue
318
- }
319
315
320
- pageSize , err := v1helper .HugePageSizeFromResourceName (resourceObj )
321
- if err != nil {
322
- klog .InfoS ("Failed to get hugepage size from resource" , "object" , resourceObj , "err" , err )
323
- continue
316
+ // When hugepage limits are specified at pod level, the container limit will
317
+ // match the pod level limit, however if the container also specifies,
318
+ // its limit will have precedence over the pod level limit
319
+ if utilfeature .DefaultFeatureGate .Enabled (kubefeatures .PodLevelResources ) && resourcehelper .IsPodLevelResourcesSet (pod ) {
320
+ for limitName , limitAmount := range pod .Spec .Resources .Limits {
321
+ readAndDefineRequiredHugepageLimit (requiredHugepageLimits , limitName , limitAmount )
324
322
}
323
+ }
325
324
326
- sizeString , err := v1helper .HugePageUnitSizeFromByteSize (pageSize .Value ())
327
- if err != nil {
328
- klog .InfoS ("Size is invalid" , "object" , resourceObj , "err" , err )
329
- continue
330
- }
331
- requiredHugepageLimits [sizeString ] = uint64 (amountObj .Value ())
325
+ // If the container and the pod specify, the container will have precedence,
326
+ // overriding the pod level limit
327
+ for resourceObj , amountObj := range resources .Limits {
328
+ readAndDefineRequiredHugepageLimit (requiredHugepageLimits , resourceObj , amountObj )
332
329
}
333
330
334
331
for _ , hugepageLimit := range hugepageLimits {
@@ -340,6 +337,25 @@ func GetHugepageLimitsFromResources(resources v1.ResourceRequirements) []*runtim
340
337
return hugepageLimits
341
338
}
342
339
340
+ func readAndDefineRequiredHugepageLimit (requiredHugepageLimits map [string ]uint64 , resourceObj v1.ResourceName , amountObj resource.Quantity ) {
341
+ if ! v1helper .IsHugePageResourceName (resourceObj ) {
342
+ return
343
+ }
344
+
345
+ pageSize , err := v1helper .HugePageSizeFromResourceName (resourceObj )
346
+ if err != nil {
347
+ klog .InfoS ("Failed to get hugepage size from resource" , "object" , resourceObj , "err" , err )
348
+ return
349
+ }
350
+
351
+ sizeString , err := v1helper .HugePageUnitSizeFromByteSize (pageSize .Value ())
352
+ if err != nil {
353
+ klog .InfoS ("Size is invalid" , "object" , resourceObj , "err" , err )
354
+ return
355
+ }
356
+ requiredHugepageLimits [sizeString ] = uint64 (amountObj .Value ())
357
+ }
358
+
343
359
func toKubeContainerResources (statusResources * runtimeapi.ContainerResources ) * kubecontainer.ContainerResources {
344
360
var cStatusResources * kubecontainer.ContainerResources
345
361
runtimeStatusResources := statusResources .GetLinux ()
0 commit comments