From Andrew Morton.
There are a couple of places where we would enable interrupts while
write-holding the tasklist_lock ... nasty.
*/
void sched_exit(task_t * p)
{
- local_irq_disable();
+ unsigned long flags;
+
+ local_irq_save(flags);
if (p->first_time_slice) {
p->parent->time_slice += p->time_slice;
if (unlikely(p->parent->time_slice > MAX_TIMESLICE))
p->parent->time_slice = MAX_TIMESLICE;
}
- local_irq_enable();
+ local_irq_restore(flags);
/*
* If the child was a (relative-) CPU hog then decrease
* the sleep_avg of the parent as well.
*/
static inline void wake_up_parent(struct task_struct *p)
{
+ unsigned long flags;
struct task_struct *parent = p->parent, *tsk = parent;
/*
wake_up_interruptible(&tsk->wait_chldexit);
return;
}
- spin_lock_irq(&parent->sig->siglock);
+ spin_lock_irqsave(&parent->sig->siglock, flags);
do {
wake_up_interruptible(&tsk->wait_chldexit);
tsk = next_thread(tsk);
if (tsk->sig != parent->sig)
BUG();
} while (tsk != parent);
- spin_unlock_irq(&parent->sig->siglock);
+ spin_unlock_irqrestore(&parent->sig->siglock, flags);
}
/*