aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/syscall.go
diff options
context:
space:
mode:
Diffstat (limited to 'container/syscall.go')
-rw-r--r--container/syscall.go123
1 files changed, 120 insertions, 3 deletions
diff --git a/container/syscall.go b/container/syscall.go
index 5f392c35..4af60366 100644
--- a/container/syscall.go
+++ b/container/syscall.go
@@ -1,6 +1,9 @@
package container
import (
+ "encoding"
+ "strconv"
+ "sync"
. "syscall"
"unsafe"
@@ -43,18 +46,132 @@ func Isatty(fd int) bool {
return r == 0
}
+// SchedPolicy denotes a scheduling policy defined in include/uapi/linux/sched.h.
+type SchedPolicy int
+
// include/uapi/linux/sched.h
const (
- SCHED_NORMAL = iota
+ SCHED_NORMAL SchedPolicy = iota
SCHED_FIFO
SCHED_RR
SCHED_BATCH
- _ // SCHED_ISO: reserved but not implemented yet
+ _SCHED_ISO // SCHED_ISO: reserved but not implemented yet
SCHED_IDLE
SCHED_DEADLINE
SCHED_EXT
+
+ _SCHED_LAST SchedPolicy = iota - 1
)
+var _ encoding.TextMarshaler = _SCHED_LAST
+var _ encoding.TextUnmarshaler = new(SchedPolicy)
+
+// String returns a unique representation of policy, also used in encoding.
+func (policy SchedPolicy) String() string {
+ switch policy {
+ case SCHED_NORMAL:
+ return ""
+ case SCHED_FIFO:
+ return "fifo"
+ case SCHED_RR:
+ return "rr"
+ case SCHED_BATCH:
+ return "batch"
+ case SCHED_IDLE:
+ return "idle"
+ case SCHED_DEADLINE:
+ return "deadline"
+ case SCHED_EXT:
+ return "ext"
+
+ default:
+ return "invalid policy " + strconv.Itoa(int(policy))
+ }
+}
+
+// MarshalText performs bounds checking and returns the result of String.
+func (policy SchedPolicy) MarshalText() ([]byte, error) {
+ if policy == _SCHED_ISO || policy < 0 || policy > _SCHED_LAST {
+ return nil, EINVAL
+ }
+ return []byte(policy.String()), nil
+}
+
+// InvalidSchedPolicyError is an invalid string representation of a [SchedPolicy].
+type InvalidSchedPolicyError string
+
+func (InvalidSchedPolicyError) Unwrap() error { return EINVAL }
+func (e InvalidSchedPolicyError) Error() string {
+ return "invalid scheduling policy " + strconv.Quote(string(e))
+}
+
+// UnmarshalText is the inverse of MarshalText.
+func (policy *SchedPolicy) UnmarshalText(text []byte) error {
+ switch string(text) {
+ case "fifo":
+ *policy = SCHED_FIFO
+ case "rr":
+ *policy = SCHED_RR
+ case "batch":
+ *policy = SCHED_BATCH
+ case "idle":
+ *policy = SCHED_IDLE
+ case "deadline":
+ *policy = SCHED_DEADLINE
+ case "ext":
+ *policy = SCHED_EXT
+
+ case "":
+ *policy = 0
+ return nil
+ default:
+ return InvalidSchedPolicyError(text)
+ }
+ return nil
+}
+
+// for sched_get_priority_max and sched_get_priority_min
+var (
+ schedPriority [_SCHED_LAST + 1][2]std.Int
+ schedPriorityErr [_SCHED_LAST + 1][2]error
+ schedPriorityOnce [_SCHED_LAST + 1][2]sync.Once
+)
+
+// GetPriorityMax returns the maximum priority value that can be used with the
+// scheduling algorithm identified by policy.
+func (policy SchedPolicy) GetPriorityMax() (std.Int, error) {
+ schedPriorityOnce[policy][0].Do(func() {
+ priority, _, errno := Syscall(
+ SYS_SCHED_GET_PRIORITY_MAX,
+ uintptr(policy),
+ 0, 0,
+ )
+ schedPriority[policy][0] = std.Int(priority)
+ if schedPriority[policy][0] < 0 {
+ schedPriorityErr[policy][0] = errno
+ }
+ })
+ return schedPriority[policy][0], schedPriorityErr[policy][0]
+}
+
+// GetPriorityMin returns the minimum priority value that can be used with the
+// scheduling algorithm identified by policy.
+func (policy SchedPolicy) GetPriorityMin() (std.Int, error) {
+ schedPriorityOnce[policy][1].Do(func() {
+ priority, _, errno := Syscall(
+ SYS_SCHED_GET_PRIORITY_MIN,
+ uintptr(policy),
+ 0, 0,
+ )
+ schedPriority[policy][1] = std.Int(priority)
+ if schedPriority[policy][1] < 0 {
+ schedPriorityErr[policy][1] = errno
+ }
+ })
+ return schedPriority[policy][1], schedPriorityErr[policy][1]
+
+}
+
// schedParam is equivalent to struct sched_param from include/linux/sched.h.
type schedParam struct {
// sched_priority
@@ -74,7 +191,7 @@ type schedParam struct {
// this if you do not have something similar in place!
//
// [very subtle to use correctly]: https://www.openwall.com/lists/musl/2016/03/01/4
-func schedSetscheduler(tid, policy int, param *schedParam) error {
+func schedSetscheduler(tid int, policy SchedPolicy, param *schedParam) error {
if r, _, errno := Syscall(
SYS_SCHED_SETSCHEDULER,
uintptr(tid),