projects
/
~madcoder
/
pwqr.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix a few more bugs detected by the simple tester.
[~madcoder/pwqr.git]
/
kernel
/
pwqr.c
diff --git
a/kernel/pwqr.c
b/kernel/pwqr.c
index
233bd7a
..
c705dfa
100644
(file)
--- a/
kernel/pwqr.c
+++ b/
kernel/pwqr.c
@@
-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)))