Re: [RFC 0/12][PATCH] SCHED_DEADLINE: fork and terminate task logic

From: Peter Zijlstra
Date: Tue Dec 29 2009 - 10:22:18 EST


On Fri, 2009-10-16 at 17:41 +0200, Raistlin wrote:
> +++ b/kernel/sched.c
> @@ -2561,8 +2561,20 @@ void sched_fork(struct task_struct *p, int clone_flags)
> * Make sure we do not leak PI boosting priority to the child.
> */
> p->prio = current->normal_prio;
> + if (deadline_task(p)) {
> + p->sched_class = &deadline_sched_class;
>
> - if (!rt_prio(p->prio))
> + /*
> + * the child will be SCHED_DEADLINE, but with zero bandwidth.
> + * The parent (or some other task) must call setscheduler_ex
> + * on it, or it won't ever start.
> + */
> + init_deadline_task(p);
> + p->dl.flags &= ~DL_NEW;
> + p->dl.flags |= DL_THROTTLED;

I recently added ->task_fork(), which is called after the class
assignment.

> + } else if (rt_prio(p->prio))
> + p->sched_class = &rt_sched_class;
> + else
> p->sched_class = &fair_sched_class;
>
> #ifdef CONFIG_SMP
> @@ -2744,6 +2756,10 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev)
> if (mm)
> mmdrop(mm);
> if (unlikely(prev_state == TASK_DEAD)) {
> + /* a deadline task is dying: stop the bandwidth timer */
> + if (deadline_task(prev))
> + hrtimer_cancel(&prev->dl.dl_timer);
> +
> /*
> * Remove function-return probe instances associated with this
> * task and put them back on the free list.

Shouldn't this be done in the ->dequeue_task() callback?

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/