Skip to content

Commit 53ea4f4

Browse files
committed
HighPerformanceHooks: Defer irqSMPAffinityFile rollback
Signed-off-by: Andreas Karis <[email protected]> (cherry picked from commit 78c966c)
1 parent 211098d commit 53ea4f4

File tree

2 files changed

+65
-6
lines changed

2 files changed

+65
-6
lines changed

internal/runtimehandlerhooks/high_performance_hooks_linux.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,7 @@ func (h *HighPerformanceHooks) handleIRQBalanceOneShot(ctx context.Context, cNam
667667
}
668668

669669
// updateNewIRQSMPAffinityMask updates SMP IRQ affinity and IRQ balance configuration files.
670-
func (h *HighPerformanceHooks) updateNewIRQSMPAffinityMask(ctx context.Context, cID, cName, cpus string, enable bool) (string, error) {
670+
func (h *HighPerformanceHooks) updateNewIRQSMPAffinityMask(ctx context.Context, cID, cName, cpus string, enable bool) (newIRQBalanceSetting string, err error) {
671671
content, err := os.ReadFile(h.irqSMPAffinityFile)
672672
if err != nil {
673673
return "", err
@@ -690,17 +690,22 @@ func (h *HighPerformanceHooks) updateNewIRQSMPAffinityMask(ctx context.Context,
690690
return "", err
691691
}
692692

693+
// Rollback IRQ SMP affinity file to maintain consistency if something goes wrong.
694+
defer func() {
695+
if err != nil {
696+
if rollbackErr := os.WriteFile(h.irqSMPAffinityFile, []byte(originalIRQSMPSetting), 0o644); rollbackErr != nil {
697+
log.Errorf(ctx, "Failed to rollback IRQ SMP affinity file after config update failure: err: %q, rollback err: %q",
698+
err, rollbackErr)
699+
}
700+
}
701+
}()
702+
693703
// Nothing else to do if irq balance config file does not exist.
694704
if !fileExists(h.irqBalanceConfigFile) {
695705
return newIRQBalanceSetting, nil
696706
}
697707

698708
if err := updateIrqBalanceConfigFile(h.irqBalanceConfigFile, newIRQBalanceSetting); err != nil {
699-
// Rollback IRQ SMP affinity file to maintain consistency
700-
if rollbackErr := os.WriteFile(h.irqSMPAffinityFile, []byte(originalIRQSMPSetting), 0o644); rollbackErr != nil {
701-
log.Errorf(ctx, "Failed to rollback IRQ SMP affinity file after config update failure: %v", rollbackErr)
702-
}
703-
704709
return "", err
705710
}
706711

internal/runtimehandlerhooks/high_performance_hooks_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,60 @@ var _ = Describe("high_performance_hooks", func() {
813813
)
814814
})
815815

816+
Describe("updateNewIRQSMPAffinityMask rollback", func() {
817+
irqBalanceConfigFile := filepath.Join(fixturesDir, "irqbalance")
818+
irqSMPAffinityFile := filepath.Join(fixturesDir, "irqsmpaffinity")
819+
820+
h := &HighPerformanceHooks{
821+
irqSMPAffinityFile: irqSMPAffinityFile,
822+
irqBalanceConfigFile: irqBalanceConfigFile,
823+
}
824+
825+
type parameters struct {
826+
irqBalanceFileRO bool
827+
originalIRQSMPAffinityMask string
828+
expectedIRQSMPAffinityMask string
829+
}
830+
831+
DescribeTable("test rollback",
832+
func(p parameters) {
833+
err := os.WriteFile(irqSMPAffinityFile, []byte(p.originalIRQSMPAffinityMask), 0o644)
834+
Expect(err).ToNot(HaveOccurred())
835+
836+
if p.irqBalanceFileRO {
837+
err = os.Symlink("/proc/version", irqBalanceConfigFile)
838+
Expect(err).ToNot(HaveOccurred())
839+
} else {
840+
err = os.WriteFile(irqBalanceConfigFile, []byte(""), 0o644)
841+
Expect(err).ToNot(HaveOccurred())
842+
}
843+
844+
_, err = h.updateNewIRQSMPAffinityMask(context.TODO(), "cID", "CName", "2-3", false)
845+
if p.irqBalanceFileRO {
846+
Expect(err).To(HaveOccurred())
847+
} else {
848+
Expect(err).NotTo(HaveOccurred())
849+
}
850+
851+
writtenMask, err := os.ReadFile(irqSMPAffinityFile)
852+
Expect(err).NotTo(HaveOccurred())
853+
Expect(string(writtenMask)).To(Equal(p.expectedIRQSMPAffinityMask))
854+
},
855+
Entry("writing IRQ balance file fails",
856+
parameters{
857+
irqBalanceFileRO: true,
858+
originalIRQSMPAffinityMask: "ffffffff",
859+
expectedIRQSMPAffinityMask: "ffffffff",
860+
}),
861+
Entry("writing IRQ balance file succeeds",
862+
parameters{
863+
irqBalanceFileRO: false,
864+
originalIRQSMPAffinityMask: "ffffffff",
865+
expectedIRQSMPAffinityMask: "fffffff3",
866+
}),
867+
)
868+
})
869+
816870
Describe("convertAnnotationToLatency", func() {
817871
verifyConvertAnnotationToLatency := func(annotation string, expected string, expect_error bool) {
818872
latency, err := convertAnnotationToLatency(annotation)

0 commit comments

Comments
 (0)