diff options
author | Hong-Mei Li <a21834@motorola.com> | 2015-03-12 19:14:26 -0700 |
---|---|---|
committer | Simon Shields <keepcalm444@gmail.com> | 2016-06-13 14:47:40 +1000 |
commit | ca7c9fad094f4413dcb2ce65d6d4983201295536 (patch) | |
tree | 6f9b883e3f06f1b44e9eb2fd380286e2f5454b7a | |
parent | 2ed1b46030d9062ac9dc12ffef3beb3ece44d1a0 (diff) | |
download | kernel_samsung_smdk4412-ca7c9fad094f4413dcb2ce65d6d4983201295536.zip kernel_samsung_smdk4412-ca7c9fad094f4413dcb2ce65d6d4983201295536.tar.gz kernel_samsung_smdk4412-ca7c9fad094f4413dcb2ce65d6d4983201295536.tar.bz2 |
drivers:lmk: Fix double delete issue
someone may change a process's oom_score_adj by proc fs, even though the
process has exited. In that case, the task was deleted from the rb tree
already, and the redundant deleting would trigger rb_erase panic finally.
In this patch, we make sure to clear the node after deteting and check
its empty status before rb_erase.
Change-Id: I7628c7d21011099e796b7d366cbc142f96bb8aab
Signed-off-by: Hong-Mei Li <a21834@motorola.com>
Reviewed-on: http://gerrit.mot.com/725306
SLTApproved: Slta Waiver <sltawvr@motorola.com>
SME-Granted: SME Approvals Granted
Tested-by: Jira Key <jirakey@motorola.com>
Reviewed-by: Sheng-Zhe Zhao <a18689@motorola.com>
Submit-Approved: Jira Key <jirakey@motorola.com>
-rw-r--r-- | drivers/staging/android/lowmemorykiller.c | 5 | ||||
-rw-r--r-- | kernel/fork.c | 2 |
2 files changed, 6 insertions, 1 deletions
diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c index caa7d3d..239d32d 100644 --- a/drivers/staging/android/lowmemorykiller.c +++ b/drivers/staging/android/lowmemorykiller.c @@ -450,7 +450,10 @@ void add_2_adj_tree(struct task_struct *task) void delete_from_adj_tree(struct task_struct *task) { spin_lock(&lmk_lock); - rb_erase(&task->adj_node, &tasks_scoreadj); + if (!RB_EMPTY_NODE(&task->adj_node)) { + rb_erase(&task->adj_node, &tasks_scoreadj); + RB_CLEAR_NODE(&task->adj_node); + } spin_unlock(&lmk_lock); } diff --git a/kernel/fork.c b/kernel/fork.c index c1760e6..ba7e2bc 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -317,6 +317,8 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) account_kernel_stack(ti, 1); + RB_CLEAR_NODE(&tsk->adj_node); + return tsk; out: |