]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] exit-fix-2.5.38-F0
authorIngo Molnar <mingo@elte.hu>
Thu, 26 Sep 2002 01:04:38 +0000 (18:04 -0700)
committerIngo Molnar <mingo@elte.hu>
Thu, 26 Sep 2002 01:04:38 +0000 (18:04 -0700)
From Andrew Morton.

There are a couple of places where we would enable interrupts while
write-holding the tasklist_lock ...  nasty.

kernel/sched.c
kernel/signal.c

index 9965e5f7549e766ddac8454794c52d508815900c..c4ba26fd875a342a1099dd553c94c8382d196c23 100644 (file)
@@ -477,13 +477,15 @@ void wake_up_forked_process(task_t * p)
  */
 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.
index 013c7a899152731ea87bd9dc2abd808d9cbbfc1c..86c999cdecfdd01653de486c4ee7641af1a39d31 100644 (file)
@@ -1086,6 +1086,7 @@ kill_proc(pid_t pid, int sig, int priv)
  */
 static inline void wake_up_parent(struct task_struct *p)
 {
+       unsigned long flags;
        struct task_struct *parent = p->parent, *tsk = parent;
 
        /*
@@ -1095,14 +1096,14 @@ static inline void wake_up_parent(struct task_struct *p)
                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);
 }
 
 /*