fix a few more bugs detected by the simple tester.
authorPierre Habouzit <pierre.habouzit@intersec.com>
Sun, 15 Jan 2012 20:00:49 +0000 (21:00 +0100)
committerPierre Habouzit <pierre.habouzit@intersec.com>
Sun, 15 Jan 2012 20:00:49 +0000 (21:00 +0100)
Signed-off-by: Pierre Habouzit <pierre.habouzit@intersec.com>
Makefile
kernel/pwqr.c

index e03609c..24733f0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 all clean:
 all clean:
-       $(MAKE) -C kernel $@
+       cd kernel && $(MAKE) $(filter-out all,$@)
        $(MAKE) -C lib $@
        $(MAKE) -C test $@
 
        $(MAKE) -C lib $@
        $(MAKE) -C test $@
 
index 233bd7a..c705dfa 100644 (file)
@@ -324,6 +324,7 @@ static void pwqr_task_detach(struct pwqr_task *pwqt, struct pwqr_sb *sb)
        } else {
                __pwqr_sb_update_state(sb, 0);
        }
        } else {
                __pwqr_sb_update_state(sb, 0);
        }
+       pwqt->notifier.ops = &pwqr_preempt_noop_ops;
        pwqr_sb_unlock_irqrestore(sb, flags);
        pwqr_sb_put(sb);
        pwqt->sb = NULL;
        pwqr_sb_unlock_irqrestore(sb, flags);
        pwqr_sb_put(sb);
        pwqt->sb = NULL;
@@ -351,7 +352,6 @@ static void pwqr_task_release(struct pwqr_task *pwqt, bool from_notifier)
        hlist_del(&pwqt->link);
        spin_unlock(&b->lock);
 #endif
        hlist_del(&pwqt->link);
        spin_unlock(&b->lock);
 #endif
-       pwqt->notifier.ops = &pwqr_preempt_noop_ops;
 
        if (from_notifier) {
                /* When called from sched_{out,in}, it's not allowed to
 
        if (from_notifier) {
                /* When called from sched_{out,in}, it's not allowed to
@@ -374,7 +374,7 @@ static void pwqr_task_noop_sched_in(struct preempt_notifier *notifier, int cpu)
 }
 
 static void pwqr_task_noop_sched_out(struct preempt_notifier *notifier,
 }
 
 static void pwqr_task_noop_sched_out(struct preempt_notifier *notifier,
-                                   struct task_struct *next)
+                                    struct task_struct *next)
 {
 }
 
 {
 }
 
@@ -386,7 +386,6 @@ static void pwqr_task_blocked_sched_in(struct preempt_notifier *notifier, int cp
 
        if (unlikely(sb->state < 0)) {
                pwqr_task_detach(pwqt, sb);
 
        if (unlikely(sb->state < 0)) {
                pwqr_task_detach(pwqt, sb);
-               pwqr_task_release(pwqt, true);
                return;
        }
 
                return;
        }
 
@@ -405,7 +404,8 @@ static void pwqr_task_sched_out(struct preempt_notifier *notifier,
 
        if (unlikely(p->state & TASK_DEAD) || unlikely(sb->state < 0)) {
                pwqr_task_detach(pwqt, sb);
 
        if (unlikely(p->state & TASK_DEAD) || unlikely(sb->state < 0)) {
                pwqr_task_detach(pwqt, sb);
-               pwqr_task_release(pwqt, true);
+               if (p->state & TASK_DEAD)
+                       pwqr_task_release(pwqt, true);
                return;
        }
        if (p->state == 0 || (p->state & (__TASK_STOPPED | __TASK_TRACED)))
                return;
        }
        if (p->state == 0 || (p->state & (__TASK_STOPPED | __TASK_TRACED)))