Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 42 additions & 33 deletions internal/runtimehandlerhooks/high_performance_hooks_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,12 @@ const (

// HighPerformanceHooks used to run additional hooks that will configure a system for the latency sensitive workloads.
type HighPerformanceHooks struct {
irqBalanceConfigFile string
cpusetLock sync.Mutex
sharedCPUs string
irqBalanceConfigFile string
cpusetLock sync.Mutex
irqSMPAffinityFileLock sync.Mutex
irqBalanceConfigFileLock sync.Mutex
sharedCPUs string
irqSMPAffinityFile string
}

func (h *HighPerformanceHooks) PreCreate(ctx context.Context, specgen *generate.Generator, s *sandbox.Sandbox, c *oci.Container) error {
Expand Down Expand Up @@ -142,7 +145,7 @@ func (h *HighPerformanceHooks) PreStart(ctx context.Context, c *oci.Container, s
if shouldIRQLoadBalancingBeDisabled(ctx, s.Annotations()) {
log.Infof(ctx, "Disable irq smp balancing for container %q", c.ID())

if err := setIRQLoadBalancing(ctx, c, false, IrqSmpAffinityProcFile, h.irqBalanceConfigFile); err != nil {
if err := h.setIRQLoadBalancing(ctx, c, false); err != nil {
return fmt.Errorf("set IRQ load balancing: %w", err)
}
}
Expand Down Expand Up @@ -196,7 +199,7 @@ func (h *HighPerformanceHooks) PreStop(ctx context.Context, c *oci.Container, s

// enable the IRQ smp balancing for the container CPUs
if shouldIRQLoadBalancingBeDisabled(ctx, s.Annotations()) {
if err := setIRQLoadBalancing(ctx, c, true, IrqSmpAffinityProcFile, h.irqBalanceConfigFile); err != nil {
if err := h.setIRQLoadBalancing(ctx, c, true); err != nil {
return fmt.Errorf("set IRQ load balancing: %w", err)
}
}
Expand Down Expand Up @@ -569,7 +572,7 @@ func disableCPULoadBalancingV1(containerManagers []cgroups.Manager) error {
return nil
}

func setIRQLoadBalancing(ctx context.Context, c *oci.Container, enable bool, irqSmpAffinityFile, irqBalanceConfigFile string) error {
func (h *HighPerformanceHooks) setIRQLoadBalancing(ctx context.Context, c *oci.Container, enable bool) error {
lspec := c.Spec().Linux
if lspec == nil ||
lspec.Resources == nil ||
Expand All @@ -578,26 +581,15 @@ func setIRQLoadBalancing(ctx context.Context, c *oci.Container, enable bool, irq
return fmt.Errorf("find container %s CPUs", c.ID())
}

content, err := os.ReadFile(irqSmpAffinityFile)
newIRQBalanceSetting, err := h.updateNewIRQSMPAffinityMask(lspec.Resources.CPU.Cpus, enable)
if err != nil {
return err
}

currentIRQSMPSetting := strings.TrimSpace(string(content))

newIRQSMPSetting, newIRQBalanceSetting, err := UpdateIRQSmpAffinityMask(lspec.Resources.CPU.Cpus, currentIRQSMPSetting, enable)
if err != nil {
return err
}

if err := os.WriteFile(irqSmpAffinityFile, []byte(newIRQSMPSetting), 0o644); err != nil {
return err
}

isIrqConfigExists := fileExists(irqBalanceConfigFile)
isIrqConfigExists := fileExists(h.irqBalanceConfigFile)

if isIrqConfigExists {
if err := updateIrqBalanceConfigFile(irqBalanceConfigFile, newIRQBalanceSetting); err != nil {
if err := h.updateIrqBalanceConfigFile(newIRQBalanceSetting); err != nil {
return err
}
}
Expand All @@ -624,6 +616,36 @@ func setIRQLoadBalancing(ctx context.Context, c *oci.Container, enable bool, irq
return nil
}

func (h *HighPerformanceHooks) updateNewIRQSMPAffinityMask(cpus string, enable bool) (string, error) {
h.irqSMPAffinityFileLock.Lock()
defer h.irqSMPAffinityFileLock.Unlock()

content, err := os.ReadFile(h.irqSMPAffinityFile)
if err != nil {
return "", err
}

currentIRQSMPSetting := strings.TrimSpace(string(content))

newIRQSMPSetting, newIRQBalanceSetting, err := calcIRQSMPAffinityMask(cpus, currentIRQSMPSetting, enable)
if err != nil {
return "", err
}

if err := os.WriteFile(h.irqSMPAffinityFile, []byte(newIRQSMPSetting), 0o644); err != nil {
return "", err
}

return newIRQBalanceSetting, nil
}

func (h *HighPerformanceHooks) updateIrqBalanceConfigFile(newIRQBalanceSetting string) error {
h.irqBalanceConfigFileLock.Lock()
defer h.irqBalanceConfigFileLock.Unlock()

return updateIrqBalanceConfigFile(h.irqBalanceConfigFile, newIRQBalanceSetting)
}

func setCPUQuota(podManager cgroups.Manager, containerManagers []cgroups.Manager) error {
if err := disableCPUQuotaForCgroup(podManager); err != nil {
return err
Expand Down Expand Up @@ -1034,19 +1056,6 @@ func RestoreIrqBalanceConfig(ctx context.Context, irqBalanceConfigFile, irqBanne
return nil
}

func ShouldCPUQuotaBeDisabled(ctx context.Context, cid string, cSpec *specs.Spec, s *sandbox.Sandbox, annotations fields.Set) bool {
if !shouldRunHooks(ctx, cid, cSpec, s) {
return false
}

if annotations[crioannotations.CPUQuotaAnnotation] == annotationTrue {
log.Warnf(ctx, "%s", annotationValueDeprecationWarning(crioannotations.CPUQuotaAnnotation))
}

return annotations[crioannotations.CPUQuotaAnnotation] == annotationTrue ||
annotations[crioannotations.CPUQuotaAnnotation] == annotationDisable
}

func shouldRunHooks(ctx context.Context, id string, cSpec *specs.Spec, s *sandbox.Sandbox) bool {
if isCgroupParentBurstable(s) {
log.Infof(ctx, "Container %q is a burstable pod. Skip PreStart.", id)
Expand Down
Loading
Loading