Index: pym/portage/__init__.py =================================================================== --- pym/portage/__init__.py (revision 11181) +++ pym/portage/__init__.py (revision 11182) @@ -996,7 +996,8 @@ "PORTAGE_ELOG_MAILURI", "PORTAGE_ELOG_SYSTEM", "PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS", "PORTAGE_FETCH_RESUME_MIN_SIZE", "PORTAGE_GPG_DIR", - "PORTAGE_GPG_KEY", "PORTAGE_PACKAGE_EMPTY_ABORT", + "PORTAGE_GPG_KEY", "PORTAGE_IONICE_COMMAND", + "PORTAGE_PACKAGE_EMPTY_ABORT", "PORTAGE_RO_DISTDIRS", "PORTAGE_RSYNC_EXTRA_OPTS", "PORTAGE_RSYNC_OPTS", "PORTAGE_RSYNC_RETRIES", "PORTAGE_USE", "PORT_LOGDIR", Index: pym/_emerge/__init__.py =================================================================== --- pym/_emerge/__init__.py (revision 11181) +++ pym/_emerge/__init__.py (revision 11182) @@ -12846,6 +12846,29 @@ settings["NOCOLOR"] = "true" settings.backup_changes("NOCOLOR") +def ionice(settings): + + ionice_cmd = settings.get("PORTAGE_IONICE_COMMAND") + if ionice_cmd: + ionice_cmd = shlex.split(ionice_cmd) + if not ionice_cmd: + return + + from portage.util import varexpand + variables = {"PID" : str(os.getpid())} + cmd = [varexpand(x, mydict=variables) for x in ionice_cmd] + + try: + rval = portage.process.spawn(cmd, env=os.environ) + except portage.exception.CommandNotFound: + # The OS kernel probably doesn't support ionice, + # so return silently. + return + + if rval != os.EX_OK: + out = portage.output.EOutput() + out.eerror("PORTAGE_IONICE_COMMAND returned %d" % (rval,)) + def emerge_main(): global portage # NFC why this is necessary now - genone portage._disable_legacy_globals() @@ -12867,6 +12890,8 @@ settings, trees, mtimedb = load_emerge_config() portdb = trees[settings["ROOT"]]["porttree"].dbapi + ionice(settings) + try: os.nice(int(settings.get("PORTAGE_NICENESS", "0"))) except (OSError, ValueError), e: Index: cnf/make.globals =================================================================== --- cnf/make.globals (revision 11181) +++ cnf/make.globals (revision 11182) @@ -62,6 +62,9 @@ # Minimum size of existing file for RESUMECOMMAND to be called. PORTAGE_FETCH_RESUME_MIN_SIZE="350K" +# Command called to adjust the io priority of portage and it's subprocesses. +PORTAGE_IONICE_COMMAND="ionice -c 2 -n 7 -p \${PID}" + # Number of times 'emerge --sync' will run before giving up. PORTAGE_RSYNC_RETRIES="3" Index: man/make.conf.5 =================================================================== --- man/make.conf.5 (revision 11181) +++ man/make.conf.5 (revision 11182) @@ -459,6 +459,14 @@ variable should contain an integer number of bytes and may have a suffix such as K, M, or G. .TP +\fBPORTAGE_IONICE_COMMAND\fR = \fI[ionice command string]\fR +This variable should contain a command for portage to call in order +to adjust the io priority of portage and it's subprocesses. The command +string should contain a \\${PID} place-holder that will be substituted +with an integer pid. For more information about ionice, see \fBionice\fR(1). +.br +Defaults to "ionice -c 2 -n 7 -p \\${PID}". +.TP \fBPORTAGE_NICENESS\fR = \fI[number]\fR The value of this variable will be added to the current nice level that emerge is running at. In other words, this will not set the nice level,