diff --git a/libcontainer/init_linux.go b/libcontainer/init_linux.go index 36641a17fa7..9b82ffd4b1d 100644 --- a/libcontainer/init_linux.go +++ b/libcontainer/init_linux.go @@ -692,6 +692,27 @@ func setupScheduler(config *configs.Config) error { return nil } +func setIOPriority(ioprio *configs.IOPriority) error { + const ioprioWhoPgrp = 1 + + if ioprio == nil { + return nil + } + class, ok := configs.IOPrioClassMapping[ioprio.Class] + if !ok { + return fmt.Errorf("invalid io priority class: %s", ioprio.Class) + } + + // Combine class and priority into a single value + // https://github.com/torvalds/linux/blob/v5.18/include/uapi/linux/ioprio.h#L5-L17 + iop := (class << 13) | ioprio.Priority + _, _, errno := unix.RawSyscall(unix.SYS_IOPRIO_SET, ioprioWhoPgrp, 0, uintptr(iop)) + if errno != 0 { + return fmt.Errorf("failed to set io priority: %w", errno) + } + return nil +} + func setupPersonality(config *configs.Config) error { return system.SetLinuxPersonality(config.Personality.Domain) } diff --git a/libcontainer/process_linux.go b/libcontainer/process_linux.go index b39f0aaed61..d178aab8a86 100644 --- a/libcontainer/process_linux.go +++ b/libcontainer/process_linux.go @@ -125,10 +125,6 @@ func (p *setnsProcess) signal(sig os.Signal) error { func (p *setnsProcess) start() (retErr error) { defer p.comm.closeParent() - if err := setIOPriority(p.process.IOPriority); err != nil { - return err - } - // get the "before" value of oom kill count oom, _ := p.manager.OOMKillCount() err := p.cmd.Start() @@ -986,24 +982,3 @@ func initWaiter(r io.Reader) chan error { return ch } - -func setIOPriority(ioprio *configs.IOPriority) error { - const ioprioWhoPgrp = 1 - - if ioprio == nil { - return nil - } - class, ok := configs.IOPrioClassMapping[ioprio.Class] - if !ok { - return fmt.Errorf("invalid io priority class: %s", ioprio.Class) - } - - // Combine class and priority into a single value - // https://github.com/torvalds/linux/blob/v5.18/include/uapi/linux/ioprio.h#L5-L17 - iop := (class << 13) | ioprio.Priority - _, _, errno := unix.RawSyscall(unix.SYS_IOPRIO_SET, ioprioWhoPgrp, 0, uintptr(iop)) - if errno != 0 { - return fmt.Errorf("failed to set io priority: %w", errno) - } - return nil -} diff --git a/libcontainer/setns_init_linux.go b/libcontainer/setns_init_linux.go index ae36ecac5b3..8cbced8ef67 100644 --- a/libcontainer/setns_init_linux.go +++ b/libcontainer/setns_init_linux.go @@ -76,6 +76,9 @@ func (l *linuxSetnsInit) Init() error { return err } + if err := setIOPriority(l.config.Config.IOPriority); err != nil { + return err + } // Tell our parent that we're ready to exec. This must be done before the // Seccomp rules have been applied, because we need to be able to read and // write to a socket.