Skip to content

Commit 3eda69c

Browse files
mrutland-armtorvalds
authored andcommitted
kernel/fork.c: detect early free of a live mm
KASAN splats indicate that in some cases we free a live mm, then continue to access it, with potentially disastrous results. This is likely due to a mismatched mmdrop() somewhere in the kernel, but so far the culprit remains elusive. Let's have __mmdrop() verify that the mm isn't live for the current task, similar to the existing check for init_mm. This way, we can catch this class of issue earlier, and without requiring KASAN. Currently, idle_task_exit() leaves active_mm stale after it switches to init_mm. This isn't harmful, but will trigger the new assertions, so we must adjust idle_task_exit() to update active_mm. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Mark Rutland <[email protected]> Reviewed-by: Andrew Morton <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Mathieu Desnoyers <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Will Deacon <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 0c7c1be commit 3eda69c

File tree

2 files changed

+3
-0
lines changed

2 files changed

+3
-0
lines changed

kernel/fork.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,8 @@ static void check_mm(struct mm_struct *mm)
595595
void __mmdrop(struct mm_struct *mm)
596596
{
597597
BUG_ON(mm == &init_mm);
598+
WARN_ON_ONCE(mm == current->mm);
599+
WARN_ON_ONCE(mm == current->active_mm);
598600
mm_free_pgd(mm);
599601
destroy_context(mm);
600602
hmm_mm_destroy(mm);

kernel/sched/core.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5560,6 +5560,7 @@ void idle_task_exit(void)
55605560

55615561
if (mm != &init_mm) {
55625562
switch_mm(mm, &init_mm, current);
5563+
current->active_mm = &init_mm;
55635564
finish_arch_post_lock_switch();
55645565
}
55655566
mmdrop(mm);

0 commit comments

Comments
 (0)