aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYi-wei Zhao <gbjc64@motorola.com>2014-12-30 17:38:04 -0600
committerMister Oyster <oysterized@gmail.com>2017-04-11 11:00:03 +0200
commitf7b445954612ca791c14598e9d5afaced40f76fc (patch)
tree3c6ee10400149812237907d373ad8570d72f15c0
parent8e0a290d5efb120346f38a0e2e8ef32bc3b9a71f (diff)
fs: support task's adj rbtree
Add (or del) a task to (or from) task's adj rbtree when its oom_score_adj is modified. Change-Id: I8a9490c6f30f42f6e4ed8f7fa9249f6da6177ae2 Signed-off-by: Hong-Mei Li <a21834@motorola.com> Signed-off-by: Yi-wei Zhao <gbjc64@motorola.com> Reviewed-on: http://gerrit.mot.com/701206 SLTApproved: Slta Waiver <sltawvr@motorola.com> Tested-by: Jira Key <jirakey@motorola.com> Submit-Approved: Jira Key <jirakey@motorola.com>
-rw-r--r--fs/exec.c7
-rw-r--r--fs/proc/base.c5
2 files changed, 12 insertions, 0 deletions
diff --git a/fs/exec.c b/fs/exec.c
index 9d973ce29..359a4430d 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -953,6 +953,13 @@ static int de_thread(struct task_struct *tsk)
transfer_pid(leader, tsk, PIDTYPE_SID);
list_replace_rcu(&leader->tasks, &tsk->tasks);
+ /*
+ * need to delete leader from adj tree, because it will not be
+ * group leader (exit_signal = -1) soon. release_task(leader)
+ * can't delete it.
+ */
+ delete_from_adj_tree(leader);
+ add_2_adj_tree(tsk);
list_replace_init(&leader->sibling, &tsk->sibling);
tsk->group_leader = tsk;
diff --git a/fs/proc/base.c b/fs/proc/base.c
index d909b2f18..e16a126b8 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -1003,7 +1003,9 @@ static ssize_t oom_adj_write(struct file *file, const char __user *buf,
current->comm, task_pid_nr(current), task_pid_nr(task),
task_pid_nr(task));
+ delete_from_adj_tree(task);
task->signal->oom_score_adj = oom_adj;
+ add_2_adj_tree(task);
trace_oom_score_adj_update(task);
err_sighand:
unlock_task_sighand(task, &flags);
@@ -1118,7 +1120,10 @@ static ssize_t oom_score_adj_write(struct file *file, const char __user *buf,
goto err_sighand;
}
+ delete_from_adj_tree(task);
task->signal->oom_score_adj = (short)oom_score_adj;
+ add_2_adj_tree(task);
+
if (has_capability_noaudit(current, CAP_SYS_RESOURCE))
task->signal->oom_score_adj_min = (short)oom_score_adj;
trace_oom_score_adj_update(task);