- if (overcommit > 0) {
- if (overcommit > sb->waiting) {
- sb->quarantined += sb->waiting;
- sb->waiting = 0;
- } else {
- sb->quarantined += overcommit;
- sb->waiting -= overcommit;
- }
- } else {
- unsigned undercommit = -overcommit;
-
- if (undercommit < sb->quarantined) {
- sb->waiting += undercommit;
- sb->quarantined -= undercommit;
- } else if (sb->quarantined) {
- sb->waiting += sb->quarantined;
- sb->quarantined = 0;
- } else if (sb->waiting == 0 && sb->parked) {
+ if (timer_pending(&sb->timer))
+ del_timer(&sb->timer);
+}
+
+static void pwqr_sb_timer_cb(unsigned long arg)
+{
+ struct pwqr_sb *sb = (struct pwqr_sb *)arg;
+ unsigned long flags;
+
+ pwqr_sb_lock_irqsave(sb, flags);
+ if (sb->waiting == 0 && sb->parked && sb->running < sb->concurrency) {
+ if (sb->overcommit_wakes == 0)