oom: remove deprecated oom_adj
The deprecated /proc/<pid>/oom_adj is scheduled for removal this month. Signed-off-by: Davidlohr Bueso <dave@gnu.org> Acked-by: David Rientjes <rientjes@google.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d5dc0ad928
commit
01dc52ebdf
@ -1,22 +0,0 @@
|
|||||||
What: /proc/<pid>/oom_adj
|
|
||||||
When: August 2012
|
|
||||||
Why: /proc/<pid>/oom_adj allows userspace to influence the oom killer's
|
|
||||||
badness heuristic used to determine which task to kill when the kernel
|
|
||||||
is out of memory.
|
|
||||||
|
|
||||||
The badness heuristic has since been rewritten since the introduction of
|
|
||||||
this tunable such that its meaning is deprecated. The value was
|
|
||||||
implemented as a bitshift on a score generated by the badness()
|
|
||||||
function that did not have any precise units of measure. With the
|
|
||||||
rewrite, the score is given as a proportion of available memory to the
|
|
||||||
task allocating pages, so using a bitshift which grows the score
|
|
||||||
exponentially is, thus, impossible to tune with fine granularity.
|
|
||||||
|
|
||||||
A much more powerful interface, /proc/<pid>/oom_score_adj, was
|
|
||||||
introduced with the oom killer rewrite that allows users to increase or
|
|
||||||
decrease the badness score linearly. This interface will replace
|
|
||||||
/proc/<pid>/oom_adj.
|
|
||||||
|
|
||||||
A warning will be emitted to the kernel log if an application uses this
|
|
||||||
deprecated interface. After it is printed once, future warnings will be
|
|
||||||
suppressed until the kernel is rebooted.
|
|
@ -33,7 +33,7 @@ Table of Contents
|
|||||||
2 Modifying System Parameters
|
2 Modifying System Parameters
|
||||||
|
|
||||||
3 Per-Process Parameters
|
3 Per-Process Parameters
|
||||||
3.1 /proc/<pid>/oom_adj & /proc/<pid>/oom_score_adj - Adjust the oom-killer
|
3.1 /proc/<pid>/oom_score_adj - Adjust the oom-killer
|
||||||
score
|
score
|
||||||
3.2 /proc/<pid>/oom_score - Display current oom-killer score
|
3.2 /proc/<pid>/oom_score - Display current oom-killer score
|
||||||
3.3 /proc/<pid>/io - Display the IO accounting fields
|
3.3 /proc/<pid>/io - Display the IO accounting fields
|
||||||
@ -1320,10 +1320,10 @@ of the kernel.
|
|||||||
CHAPTER 3: PER-PROCESS PARAMETERS
|
CHAPTER 3: PER-PROCESS PARAMETERS
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
3.1 /proc/<pid>/oom_adj & /proc/<pid>/oom_score_adj- Adjust the oom-killer score
|
3.1 /proc/<pid>/oom_score_adj- Adjust the oom-killer score
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
These file can be used to adjust the badness heuristic used to select which
|
This file can be used to adjust the badness heuristic used to select which
|
||||||
process gets killed in out of memory conditions.
|
process gets killed in out of memory conditions.
|
||||||
|
|
||||||
The badness heuristic assigns a value to each candidate task ranging from 0
|
The badness heuristic assigns a value to each candidate task ranging from 0
|
||||||
@ -1361,22 +1361,10 @@ same system, cpuset, mempolicy, or memory controller resources to use at least
|
|||||||
equivalent to discounting 50% of the task's allowed memory from being considered
|
equivalent to discounting 50% of the task's allowed memory from being considered
|
||||||
as scoring against the task.
|
as scoring against the task.
|
||||||
|
|
||||||
For backwards compatibility with previous kernels, /proc/<pid>/oom_adj may also
|
|
||||||
be used to tune the badness score. Its acceptable values range from -16
|
|
||||||
(OOM_ADJUST_MIN) to +15 (OOM_ADJUST_MAX) and a special value of -17
|
|
||||||
(OOM_DISABLE) to disable oom killing entirely for that task. Its value is
|
|
||||||
scaled linearly with /proc/<pid>/oom_score_adj.
|
|
||||||
|
|
||||||
Writing to /proc/<pid>/oom_score_adj or /proc/<pid>/oom_adj will change the
|
|
||||||
other with its scaled value.
|
|
||||||
|
|
||||||
The value of /proc/<pid>/oom_score_adj may be reduced no lower than the last
|
The value of /proc/<pid>/oom_score_adj may be reduced no lower than the last
|
||||||
value set by a CAP_SYS_RESOURCE process. To reduce the value any lower
|
value set by a CAP_SYS_RESOURCE process. To reduce the value any lower
|
||||||
requires CAP_SYS_RESOURCE.
|
requires CAP_SYS_RESOURCE.
|
||||||
|
|
||||||
NOTICE: /proc/<pid>/oom_adj is deprecated and will be removed, please see
|
|
||||||
Documentation/feature-removal-schedule.txt.
|
|
||||||
|
|
||||||
Caveat: when a parent task is selected, the oom killer will sacrifice any first
|
Caveat: when a parent task is selected, the oom killer will sacrifice any first
|
||||||
generation children with separate address spaces instead, if possible. This
|
generation children with separate address spaces instead, if possible. This
|
||||||
avoids servers and important system daemons from being killed and loses the
|
avoids servers and important system daemons from being killed and loses the
|
||||||
@ -1387,9 +1375,7 @@ minimal amount of work.
|
|||||||
-------------------------------------------------------------
|
-------------------------------------------------------------
|
||||||
|
|
||||||
This file can be used to check the current score used by the oom-killer is for
|
This file can be used to check the current score used by the oom-killer is for
|
||||||
any given <pid>. Use it together with /proc/<pid>/oom_adj to tune which
|
any given <pid>.
|
||||||
process should be killed in an out-of-memory situation.
|
|
||||||
|
|
||||||
|
|
||||||
3.3 /proc/<pid>/io - Display the IO accounting fields
|
3.3 /proc/<pid>/io - Display the IO accounting fields
|
||||||
-------------------------------------------------------
|
-------------------------------------------------------
|
||||||
|
117
fs/proc/base.c
117
fs/proc/base.c
@ -873,111 +873,6 @@ static const struct file_operations proc_environ_operations = {
|
|||||||
.release = mem_release,
|
.release = mem_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
static ssize_t oom_adjust_read(struct file *file, char __user *buf,
|
|
||||||
size_t count, loff_t *ppos)
|
|
||||||
{
|
|
||||||
struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode);
|
|
||||||
char buffer[PROC_NUMBUF];
|
|
||||||
size_t len;
|
|
||||||
int oom_adjust = OOM_DISABLE;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
if (!task)
|
|
||||||
return -ESRCH;
|
|
||||||
|
|
||||||
if (lock_task_sighand(task, &flags)) {
|
|
||||||
oom_adjust = task->signal->oom_adj;
|
|
||||||
unlock_task_sighand(task, &flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
put_task_struct(task);
|
|
||||||
|
|
||||||
len = snprintf(buffer, sizeof(buffer), "%i\n", oom_adjust);
|
|
||||||
|
|
||||||
return simple_read_from_buffer(buf, count, ppos, buffer, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t oom_adjust_write(struct file *file, const char __user *buf,
|
|
||||||
size_t count, loff_t *ppos)
|
|
||||||
{
|
|
||||||
struct task_struct *task;
|
|
||||||
char buffer[PROC_NUMBUF];
|
|
||||||
int oom_adjust;
|
|
||||||
unsigned long flags;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
memset(buffer, 0, sizeof(buffer));
|
|
||||||
if (count > sizeof(buffer) - 1)
|
|
||||||
count = sizeof(buffer) - 1;
|
|
||||||
if (copy_from_user(buffer, buf, count)) {
|
|
||||||
err = -EFAULT;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = kstrtoint(strstrip(buffer), 0, &oom_adjust);
|
|
||||||
if (err)
|
|
||||||
goto out;
|
|
||||||
if ((oom_adjust < OOM_ADJUST_MIN || oom_adjust > OOM_ADJUST_MAX) &&
|
|
||||||
oom_adjust != OOM_DISABLE) {
|
|
||||||
err = -EINVAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
task = get_proc_task(file->f_path.dentry->d_inode);
|
|
||||||
if (!task) {
|
|
||||||
err = -ESRCH;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
task_lock(task);
|
|
||||||
if (!task->mm) {
|
|
||||||
err = -EINVAL;
|
|
||||||
goto err_task_lock;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lock_task_sighand(task, &flags)) {
|
|
||||||
err = -ESRCH;
|
|
||||||
goto err_task_lock;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oom_adjust < task->signal->oom_adj && !capable(CAP_SYS_RESOURCE)) {
|
|
||||||
err = -EACCES;
|
|
||||||
goto err_sighand;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Warn that /proc/pid/oom_adj is deprecated, see
|
|
||||||
* Documentation/feature-removal-schedule.txt.
|
|
||||||
*/
|
|
||||||
printk_once(KERN_WARNING "%s (%d): /proc/%d/oom_adj is deprecated, please use /proc/%d/oom_score_adj instead.\n",
|
|
||||||
current->comm, task_pid_nr(current), task_pid_nr(task),
|
|
||||||
task_pid_nr(task));
|
|
||||||
task->signal->oom_adj = oom_adjust;
|
|
||||||
/*
|
|
||||||
* Scale /proc/pid/oom_score_adj appropriately ensuring that a maximum
|
|
||||||
* value is always attainable.
|
|
||||||
*/
|
|
||||||
if (task->signal->oom_adj == OOM_ADJUST_MAX)
|
|
||||||
task->signal->oom_score_adj = OOM_SCORE_ADJ_MAX;
|
|
||||||
else
|
|
||||||
task->signal->oom_score_adj = (oom_adjust * OOM_SCORE_ADJ_MAX) /
|
|
||||||
-OOM_DISABLE;
|
|
||||||
trace_oom_score_adj_update(task);
|
|
||||||
err_sighand:
|
|
||||||
unlock_task_sighand(task, &flags);
|
|
||||||
err_task_lock:
|
|
||||||
task_unlock(task);
|
|
||||||
put_task_struct(task);
|
|
||||||
out:
|
|
||||||
return err < 0 ? err : count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct file_operations proc_oom_adjust_operations = {
|
|
||||||
.read = oom_adjust_read,
|
|
||||||
.write = oom_adjust_write,
|
|
||||||
.llseek = generic_file_llseek,
|
|
||||||
};
|
|
||||||
|
|
||||||
static ssize_t oom_score_adj_read(struct file *file, char __user *buf,
|
static ssize_t oom_score_adj_read(struct file *file, char __user *buf,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
@ -1051,15 +946,7 @@ static ssize_t oom_score_adj_write(struct file *file, const char __user *buf,
|
|||||||
if (has_capability_noaudit(current, CAP_SYS_RESOURCE))
|
if (has_capability_noaudit(current, CAP_SYS_RESOURCE))
|
||||||
task->signal->oom_score_adj_min = oom_score_adj;
|
task->signal->oom_score_adj_min = oom_score_adj;
|
||||||
trace_oom_score_adj_update(task);
|
trace_oom_score_adj_update(task);
|
||||||
/*
|
|
||||||
* Scale /proc/pid/oom_adj appropriately ensuring that OOM_DISABLE is
|
|
||||||
* always attainable.
|
|
||||||
*/
|
|
||||||
if (task->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
|
|
||||||
task->signal->oom_adj = OOM_DISABLE;
|
|
||||||
else
|
|
||||||
task->signal->oom_adj = (oom_score_adj * OOM_ADJUST_MAX) /
|
|
||||||
OOM_SCORE_ADJ_MAX;
|
|
||||||
err_sighand:
|
err_sighand:
|
||||||
unlock_task_sighand(task, &flags);
|
unlock_task_sighand(task, &flags);
|
||||||
err_task_lock:
|
err_task_lock:
|
||||||
@ -2710,7 +2597,6 @@ static const struct pid_entry tgid_base_stuff[] = {
|
|||||||
REG("cgroup", S_IRUGO, proc_cgroup_operations),
|
REG("cgroup", S_IRUGO, proc_cgroup_operations),
|
||||||
#endif
|
#endif
|
||||||
INF("oom_score", S_IRUGO, proc_oom_score),
|
INF("oom_score", S_IRUGO, proc_oom_score),
|
||||||
REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adjust_operations),
|
|
||||||
REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations),
|
REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations),
|
||||||
#ifdef CONFIG_AUDITSYSCALL
|
#ifdef CONFIG_AUDITSYSCALL
|
||||||
REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations),
|
REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations),
|
||||||
@ -3077,7 +2963,6 @@ static const struct pid_entry tid_base_stuff[] = {
|
|||||||
REG("cgroup", S_IRUGO, proc_cgroup_operations),
|
REG("cgroup", S_IRUGO, proc_cgroup_operations),
|
||||||
#endif
|
#endif
|
||||||
INF("oom_score", S_IRUGO, proc_oom_score),
|
INF("oom_score", S_IRUGO, proc_oom_score),
|
||||||
REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adjust_operations),
|
|
||||||
REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations),
|
REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations),
|
||||||
#ifdef CONFIG_AUDITSYSCALL
|
#ifdef CONFIG_AUDITSYSCALL
|
||||||
REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations),
|
REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations),
|
||||||
|
@ -1,17 +1,6 @@
|
|||||||
#ifndef __INCLUDE_LINUX_OOM_H
|
#ifndef __INCLUDE_LINUX_OOM_H
|
||||||
#define __INCLUDE_LINUX_OOM_H
|
#define __INCLUDE_LINUX_OOM_H
|
||||||
|
|
||||||
/*
|
|
||||||
* /proc/<pid>/oom_adj is deprecated, see
|
|
||||||
* Documentation/feature-removal-schedule.txt.
|
|
||||||
*
|
|
||||||
* /proc/<pid>/oom_adj set to -17 protects from the oom-killer
|
|
||||||
*/
|
|
||||||
#define OOM_DISABLE (-17)
|
|
||||||
/* inclusive */
|
|
||||||
#define OOM_ADJUST_MIN (-16)
|
|
||||||
#define OOM_ADJUST_MAX 15
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* /proc/<pid>/oom_score_adj set to OOM_SCORE_ADJ_MIN disables oom killing for
|
* /proc/<pid>/oom_score_adj set to OOM_SCORE_ADJ_MIN disables oom killing for
|
||||||
* pid.
|
* pid.
|
||||||
|
@ -671,7 +671,6 @@ struct signal_struct {
|
|||||||
struct rw_semaphore group_rwsem;
|
struct rw_semaphore group_rwsem;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int oom_adj; /* OOM kill score adjustment (bit shift) */
|
|
||||||
int oom_score_adj; /* OOM kill score adjustment */
|
int oom_score_adj; /* OOM kill score adjustment */
|
||||||
int oom_score_adj_min; /* OOM kill score adjustment minimum value.
|
int oom_score_adj_min; /* OOM kill score adjustment minimum value.
|
||||||
* Only settable by CAP_SYS_RESOURCE. */
|
* Only settable by CAP_SYS_RESOURCE. */
|
||||||
|
@ -1056,7 +1056,6 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
|
|||||||
init_rwsem(&sig->group_rwsem);
|
init_rwsem(&sig->group_rwsem);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sig->oom_adj = current->signal->oom_adj;
|
|
||||||
sig->oom_score_adj = current->signal->oom_score_adj;
|
sig->oom_score_adj = current->signal->oom_score_adj;
|
||||||
sig->oom_score_adj_min = current->signal->oom_score_adj_min;
|
sig->oom_score_adj_min = current->signal->oom_score_adj_min;
|
||||||
|
|
||||||
|
@ -428,8 +428,8 @@ static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order,
|
|||||||
{
|
{
|
||||||
task_lock(current);
|
task_lock(current);
|
||||||
pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, "
|
pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, "
|
||||||
"oom_adj=%d, oom_score_adj=%d\n",
|
"oom_score_adj=%d\n",
|
||||||
current->comm, gfp_mask, order, current->signal->oom_adj,
|
current->comm, gfp_mask, order,
|
||||||
current->signal->oom_score_adj);
|
current->signal->oom_score_adj);
|
||||||
cpuset_print_task_mems_allowed(current);
|
cpuset_print_task_mems_allowed(current);
|
||||||
task_unlock(current);
|
task_unlock(current);
|
||||||
|
Loading…
Reference in New Issue
Block a user