summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cnf/make.conf.example17
-rw-r--r--lib/_emerge/actions.py45
-rw-r--r--man/make.conf.516
3 files changed, 78 insertions, 0 deletions
diff --git a/cnf/make.conf.example b/cnf/make.conf.example
index 5b2229465..2e33a6e50 100644
--- a/cnf/make.conf.example
+++ b/cnf/make.conf.example
@@ -291,6 +291,23 @@
# unset.
#PORTAGE_IONICE_COMMAND="ionice -c 3 -p \${PID}"
#
+# PORTAGE_SCHEDULING_POLICY allows changing the current scheduling policy. The
+# supported options are 'other', 'batch', 'idle', 'fifo' and 'round-robin'. When
+# unset, the scheduling policy remains unchanged, by default Linux uses 'other'
+# policy. Users that wish to minimize the Portage's impact on system
+# responsiveness should set scheduling policy to 'idle' which significantly
+# reduces the disruption to the rest of the system by scheduling Portage as
+# extremely low priority processes.
+#
+#PORTAGE_SCHEDULING_POLICY="idle"
+#
+# PORTAGE_SCHEDULING_PRIORITY allows changing the priority (1-99) of the current
+# scheduling policy, only applies if PORTAGE_SCHEDULING_POLICY is set to 'fifo'
+# or 'round-robin', for others the only supported priority is 0, If unset,
+# defaults to lowest priority of the selected scheduling policy.
+#
+#PORTAGE_SCHEDULING_PRIORITY="99"
+#
# AUTOCLEAN enables portage to automatically clean out older or overlapping
# packages from the system after every successful merge. This is the
# same as running 'emerge -c' after every merge. Set with: "yes" or "no".
diff --git a/lib/_emerge/actions.py b/lib/_emerge/actions.py
index e2f3f2ccf..e79bb30c0 100644
--- a/lib/_emerge/actions.py
+++ b/lib/_emerge/actions.py
@@ -3054,6 +3054,7 @@ def config_protect_check(trees):
def apply_priorities(settings):
ionice(settings)
nice(settings)
+ set_scheduling_policy(settings)
def nice(settings):
@@ -3094,6 +3095,50 @@ def ionice(settings):
)
+def set_scheduling_policy(settings):
+ scheduling_policy = settings.get("PORTAGE_SCHEDULING_POLICY")
+ scheduling_priority = settings.get("PORTAGE_SCHEDULING_PRIORITY")
+
+ if platform.system() != "Linux" or not scheduling_policy:
+ return os.EX_OK
+
+ policies = {
+ "other": os.SCHED_OTHER,
+ "batch": os.SCHED_BATCH,
+ "idle": os.SCHED_IDLE,
+ "fifo": os.SCHED_FIFO,
+ "round-robin": os.SCHED_RR,
+ }
+
+ out = portage.output.EOutput()
+
+ if scheduling_policy in policies:
+ policy = policies[scheduling_policy]
+ else:
+ out.eerror("Invalid policy in PORTAGE_SCHEDULING_POLICY.")
+ out.eerror(
+ "See the make.conf(5) man page for PORTAGE_SCHEDULING_POLICY usage instructions."
+ )
+ return os.EX_USAGE
+
+ if not scheduling_priority:
+ scheduling_priority = os.sched_get_priority_min(policy)
+ else:
+ scheduling_priority = int(scheduling_priority)
+ if scheduling_priority not in range(
+ os.sched_get_priority_min(policy), os.sched_get_priority_max(policy) + 1
+ ):
+ out.eerror("Invalid priority in PORTAGE_SCHEDULING_PRIORITY.")
+ out.eerror(
+ "See the make.conf(5) man page for PORTAGE_SCHEDULING_PRIORITY usage instructions."
+ )
+ return os.EX_USAGE
+
+ os.sched_setscheduler(portage.getpid(), policy, os.sched_param(scheduling_priority))
+
+ return os.EX_OK
+
+
def setconfig_fallback(root_config):
setconfig = root_config.setconfig
setconfig._create_default_config()
diff --git a/man/make.conf.5 b/man/make.conf.5
index bde92af1a..a527a3f74 100644
--- a/man/make.conf.5
+++ b/man/make.conf.5
@@ -1080,6 +1080,22 @@ will set idle io priority. For more information about ionice, see
Portage will also set the autogroup-nice value (see fBsched\fR(7))), if
FEATURES="pid\-sandbox" is enabled.
.TP
+\fBPORTAGE_SCHEDULING_POLICY\fR = \fI[policy name]\fR
+Allows changing the current scheduling policy. The supported options are
+\fBother\fR, \fBbatch\fR, \fBidle\fR, \fBfifo\fR, and \fBround-robin\fR. When
+unset, the scheduling policy remains unchanged, by default Linux uses 'other'
+policy. Users that wish to minimize the Portage's impact on system
+responsiveness should set scheduling policy to \fBidle\fR, which significantly
+reduces the disruption to the rest of the system by scheduling Portage as
+extremely low priority processes. see \fBsched\fR(7) for more information.
+.TP
+\fBPORTAGE_SCHEDULING_PRIORITY\fR = \fI[priority]\fR
+Allows changing the priority (1-99) of the current scheduling policy, only
+applies if PORTAGE _SCHEDULING_POLICY is set to 'fifo' or 'round-robin',
+for others the only supported priority is 0, If unset, defaults to lowest
+priority of the selected scheduling policy. For more information about
+scheduler, see \fBsched\fR(7). This variable is unset by default.
+.TP
.B PORTAGE_LOG_FILTER_FILE_CMD
This variable specifies a command that filters build log output to a
log file. In order to filter ANSI escape codes from build logs,