aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHong-Mei Li <a21834@motorola.com>2015-03-20 18:05:10 -0700
committerMister Oyster <oysterized@gmail.com>2017-04-17 11:51:36 +0200
commit5b6c8937233e2945a5fe70152ace3b7e0a8d804b (patch)
tree750a861ee25f9b0da05dd1e355ae9a9f0c8b1732
parentbcc91adb7f16e2a24a5a4c676b03e9c061c0f539 (diff)
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: I26098ca3350f111e94567f9e65ec3dce413197aa Signed-off-by: Hong-Mei Li <a21834@motorola.com> Reviewed-on: http://gerrit.mot.com/727760 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver <sltawvr@motorola.com> 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.c5
-rw-r--r--kernel/fork.c3
2 files changed, 7 insertions, 1 deletions
diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c
index 00056c7e8..114c6a5ec 100644
--- a/drivers/staging/android/lowmemorykiller.c
+++ b/drivers/staging/android/lowmemorykiller.c
@@ -352,7 +352,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 06b92b187..655a77cde 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -368,6 +368,9 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
account_kernel_stack(ti, 1);
+#ifdef CONFIG_ANDROID_LMK_ADJ_RBTREE
+ RB_CLEAR_NODE(&tsk->adj_node);
+#endif
return tsk;
free_ti: