Oleg Nesterov dae51f5620 sched: fix SCHED_FIFO tasks & FAIR_GROUP_SCHED
Suppose that the SCHED_FIFO task does

	switch_uid(new_user);

Now, p->se.cfs_rq and p->se.parent both point into the old
user_struct->tg because sched_move_task() doesn't call set_task_cfs_rq()
for !fair_sched_class case.

Suppose that old user_struct/task_group is freed/reused, and the task
does

	sched_setscheduler(SCHED_NORMAL);

__setscheduler() sets fair_sched_class, but doesn't update
->se.cfs_rq/parent which point to the freed memory.

This means that check_preempt_wakeup() doing

		while (!is_same_group(se, pse)) {
			se = parent_entity(se);
			pse = parent_entity(pse);
		}

may OOPS in a similar way if rq->curr or p did something like above.

Perhaps we need something like the patch below, note that
__setscheduler() can't do set_task_cfs_rq().

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2007-11-15 20:57:40 +01:00
..
2007-11-14 18:45:43 -08:00
2007-10-18 14:37:24 -07:00
2007-10-21 02:37:45 -04:00
2007-10-21 02:37:45 -04:00
2007-10-21 02:37:45 -04:00
2007-10-21 02:37:45 -04:00
2007-11-14 18:45:37 -08:00
2007-10-18 14:37:24 -07:00
2007-10-19 11:53:56 -07:00
2007-10-18 14:37:26 -07:00
2007-10-19 11:53:54 -07:00
2007-10-19 11:53:49 -07:00
2007-10-19 11:53:54 -07:00
2007-10-19 11:53:34 -07:00
2007-11-14 18:45:43 -08:00
2007-10-18 14:37:24 -07:00
2007-10-18 14:37:24 -07:00