aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);