Skip to content

Commit

Permalink
spec: add scheduler entity
Browse files Browse the repository at this point in the history
extend the process struct to represent scheduling attributes for a
process based on the sched_setattr(2) syscall.

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
  • Loading branch information
giuseppe committed Mar 17, 2023
1 parent 9067ce6 commit 5a350bc
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 0 deletions.
27 changes: 27 additions & 0 deletions config.md
Expand Up @@ -291,6 +291,33 @@ For Linux-based systems, the `process` object supports the following process-spe

This is a per-process setting, where as [`disableOOMKiller`](config-linux.md#memory) is scoped for a memory cgroup.
For more information on how these two settings work together, see [the memory cgroup documentation section 10. OOM Contol][cgroup-v1-memory_2].
* **`scheduler`** (object, OPTIONAL) is an object describing the scheduler properties for the process. The `scheduler` contains the following properties:

* **`policy`** (string, REQUIRED) represents the scheduling policy. A valid list of values is:

* `SCHED_OTHER`
* `SCHED_FIFO`
* `SCHED_RR`
* `SCHED_BATCH`
* `SCHED_ISO`
* `SCHED_IDLE`
* `SCHED_DEADLINE`

* **`nice`** (int32, OPTIONAL) is the nice value for the process, affecting its priority. A lower nice value corresponds to a higher priority. If not set, the runtime must use the value 0.
* **`priority`** (int32, OPTIONAL) represents the static priority of the process, used by real-time policies like SCHED_FIFO and SCHED_RR. If not set, the runtime must use the value 0.
* **`flags`** (array of strings, OPTIONAL) is an array of strings representing scheduling flags. A valid list of values is:

* `SCHED_FLAG_RESET_ON_FORK`
* `SCHED_FLAG_RECLAIM`
* `SCHED_FLAG_DL_OVERRUN`
* `SCHED_FLAG_KEEP_POLICY`
* `SCHED_FLAG_KEEP_PARAMS`
* `SCHED_FLAG_UTIL_CLAMP_MIN`
* `SCHED_FLAG_UTIL_CLAMP_MAX`

* **`runtime`** (uint64, OPTIONAL) represents the amount of time in nanoseconds during which the process is allowed to run in a given period, used by the deadline scheduler. If not set, the runtime must use the value 0.
* **`deadline`** (uint64, OPTIONAL) represents the absolute deadline for the process to complete its execution, used by the deadline scheduler. If not set, the runtime must use the value 0.
* **`period`** (uint64, OPTIONAL) represents the length of the period in nanoseconds used for determining the process runtime, used by the deadline scheduler. If not set, the runtime must use the value 0.
* **`selinuxLabel`** (string, OPTIONAL) specifies the SELinux label for the process.
For more information about SELinux, see [SELinux documentation][selinux].

Expand Down
26 changes: 26 additions & 0 deletions schema/config-schema.json
Expand Up @@ -147,6 +147,32 @@
"noNewPrivileges": {
"type": "boolean"
},
"scheduler": {
"type": "object",
"properties": {
"policy": {
"type": "string"
},
"nice": {
"$ref": "defs.json#/definitions/int32"
},
"priority": {
"$ref": "defs.json#/definitions/int32"
},
"flags": {
"$ref": "defs.json#/definitions/ArrayOfStrings"
},
"runtime": {
"$ref": "defs.json#/definitions/uint64"
},
"deadline": {
"$ref": "defs.json#/definitions/uint64"
},
"period": {
"$ref": "defs.json#/definitions/uint64"
}
}
},
"rlimits": {
"type": "array",
"items": {
Expand Down
70 changes: 70 additions & 0 deletions specs-go/config.go
Expand Up @@ -33,6 +33,34 @@ type Spec struct {
ZOS *ZOS `json:"zos,omitempty" platform:"zos"`
}

// Scheduler represents the scheduling attributes for a process. It is based on
// the Linux sched_setattr(2) syscall.
type Scheduler struct {
// Policy represents the scheduling policy (e.g., SCHED_FIFO, SCHED_RR, SCHED_OTHER).
Policy LinuxSchedulerPolicy `json:"policy"`

// Nice is the nice value for the process, which affects its priority.
Nice int32 `json:"nice"`

// Priority represents the static priority of the process.
Priority int32 `json:"priority"`

// Flags is an array of scheduling flags.
Flags []LinuxSchedulerFlag `json:"flags"`

// The following ones are used by the DEADLINE scheduler.

// Runtime is the amount of time in nanoseconds during which the process
// is allowed to run in a given period.
Runtime uint64 `json:"runtime"`

// Deadline is the absolute deadline for the process to complete its execution.
Deadline uint64 `json:"deadline"`

// Period is the length of the period in nanoseconds used for determining the process runtime.
Period uint64 `json:"period"`
}

// Process contains information to start a specific application inside the container.
type Process struct {
// Terminal creates an interactive terminal for the container.
Expand Down Expand Up @@ -60,6 +88,8 @@ type Process struct {
ApparmorProfile string `json:"apparmorProfile,omitempty" platform:"linux"`
// Specify an oom_score_adj for the container.
OOMScoreAdj *int `json:"oomScoreAdj,omitempty" platform:"linux"`
// Scheduler specifies the scheduling attributes for a process
Scheduler *Scheduler `json:"scheduler,omitempty" platform:"linux"`
// SelinuxLabel specifies the selinux context that the container process is run as.
SelinuxLabel string `json:"selinuxLabel,omitempty" platform:"linux"`
}
Expand Down Expand Up @@ -788,3 +818,43 @@ type ZOSDevice struct {
// Gid of the device.
GID *uint32 `json:"gid,omitempty"`
}

// LinuxSchedulerPolicy represents different scheduling policies used with the Linux Scheduler
type LinuxSchedulerPolicy string

const (
// SCHED_OTHER is the default scheduling policy
SCHED_OTHER LinuxSchedulerPolicy = "SCHED_OTHER"
// SCHED_FIFO is the First-In-First-Out scheduling policy
SCHED_FIFO LinuxSchedulerPolicy = "SCHED_FIFO"
// SCHED_RR is the Round-Robin scheduling policy
SCHED_RR LinuxSchedulerPolicy = "SCHED_RR"
// SCHED_BATCH is the Batch scheduling policy
SCHED_BATCH LinuxSchedulerPolicy = "SCHED_BATCH"
// SCHED_ISO is the Isolation scheduling policy
SCHED_ISO LinuxSchedulerPolicy = "SCHED_ISO"
// SCHED_IDLE is the Idle scheduling policy
SCHED_IDLE LinuxSchedulerPolicy = "SCHED_IDLE"
// SCHED_DEADLINE is the Deadline scheduling policy
SCHED_DEADLINE LinuxSchedulerPolicy = "SCHED_DEADLINE"
)

// LinuxSchedulerFlag represents the flags used by the Linux Scheduler.
type LinuxSchedulerFlag string

const (
// SCHED_FLAG_RESET_ON_FORK represents the reset on fork scheduling flag
SCHED_FLAG_RESET_ON_FORK LinuxSchedulerFlag = "SCHED_FLAG_RESET_ON_FORK"
// SCHED_FLAG_RECLAIM represents the reclaim scheduling flag
SCHED_FLAG_RECLAIM LinuxSchedulerFlag = "SCHED_FLAG_RECLAIM"
// SCHED_FLAG_DL_OVERRUN represents the deadline overrun scheduling flag
SCHED_FLAG_DL_OVERRUN LinuxSchedulerFlag = "SCHED_FLAG_DL_OVERRUN"
// SCHED_FLAG_KEEP_POLICY represents the keep policy scheduling flag
SCHED_FLAG_KEEP_POLICY LinuxSchedulerFlag = "SCHED_FLAG_KEEP_POLICY"
// SCHED_FLAG_KEEP_PARAMS represents the keep parameters scheduling flag
SCHED_FLAG_KEEP_PARAMS LinuxSchedulerFlag = "SCHED_FLAG_KEEP_PARAMS"
// SCHED_FLAG_UTIL_CLAMP_MIN represents the utilization clamp minimum scheduling flag
SCHED_FLAG_UTIL_CLAMP_MIN LinuxSchedulerFlag = "SCHED_FLAG_UTIL_CLAMP_MIN"
// SCHED_FLAG_UTIL_CLAMP_MAX represents the utilization clamp maximum scheduling flag
SCHED_FLAG_UTIL_CLAMP_MAX LinuxSchedulerFlag = "SCHED_FLAG_UTIL_CLAMP_MAX"
)

0 comments on commit 5a350bc

Please sign in to comment.