Commit e2c56651 authored by Nathan Lynch's avatar Nathan Lynch Committed by Linus Torvalds

[PATCH] introduce idle_task_exit

Heiko Carstens figured out that offlining a cpu can leak mm_structs because
the dying cpu's idle task fails to switch to init_mm and mmdrop its
active_mm before the cpu is down.  This patch introduces idle_task_exit,
which allows the idle task to do this as Ingo suggested.

I will follow this up with a patch for ppc64 which calls idle_task_exit
from cpu_die.
Signed-off-by: default avatarNathan Lynch <nathanl@austin.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 0615dec5
...@@ -756,6 +756,7 @@ extern void sched_exec(void); ...@@ -756,6 +756,7 @@ extern void sched_exec(void);
#endif #endif
extern void sched_idle_next(void); extern void sched_idle_next(void);
extern void idle_task_exit(void);
extern void set_user_nice(task_t *p, long nice); extern void set_user_nice(task_t *p, long nice);
extern int task_prio(const task_t *p); extern int task_prio(const task_t *p);
extern int task_nice(const task_t *p); extern int task_nice(const task_t *p);
......
...@@ -3976,6 +3976,20 @@ void sched_idle_next(void) ...@@ -3976,6 +3976,20 @@ void sched_idle_next(void)
spin_unlock_irqrestore(&rq->lock, flags); spin_unlock_irqrestore(&rq->lock, flags);
} }
/* Ensures that the idle task is using init_mm right before its cpu goes
* offline.
*/
void idle_task_exit(void)
{
struct mm_struct *mm = current->active_mm;
BUG_ON(cpu_online(smp_processor_id()));
if (mm != &init_mm)
switch_mm(mm, &init_mm, current);
mmdrop(mm);
}
static void migrate_dead(unsigned int dead_cpu, task_t *tsk) static void migrate_dead(unsigned int dead_cpu, task_t *tsk)
{ {
struct runqueue *rq = cpu_rq(dead_cpu); struct runqueue *rq = cpu_rq(dead_cpu);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment