patch-2.4.19 linux-2.4.19/kernel/timer.c
Next file: linux-2.4.19/lib/Makefile
Previous file: linux-2.4.19/kernel/time.c
Back to the patch index
Back to the overall index
- Lines: 55
- Date:
Fri Aug 2 17:39:46 2002
- Orig file:
linux-2.4.18/kernel/timer.c
- Orig date:
Mon Oct 8 10:41:41 2001
diff -urN linux-2.4.18/kernel/timer.c linux-2.4.19/kernel/timer.c
@@ -101,6 +101,8 @@
(struct timer_vec *)&tv1, &tv2, &tv3, &tv4, &tv5
};
+static struct list_head * run_timer_list_running;
+
#define NOOF_TVECS (sizeof(tvecs) / sizeof(tvecs[0]))
void init_timervecs (void)
@@ -128,7 +130,9 @@
unsigned long idx = expires - timer_jiffies;
struct list_head * vec;
- if (idx < TVR_SIZE) {
+ if (run_timer_list_running)
+ vec = run_timer_list_running;
+ else if (idx < TVR_SIZE) {
int i = expires & TVR_MASK;
vec = tv1.vec + i;
} else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
@@ -289,6 +293,7 @@
{
spin_lock_irq(&timerlist_lock);
while ((long)(jiffies - timer_jiffies) >= 0) {
+ LIST_HEAD(queued);
struct list_head *head, *curr;
if (!tv1.index) {
int n = 1;
@@ -296,6 +301,7 @@
cascade_timers(tvecs[n]);
} while (tvecs[n]->index == 1 && ++n < NOOF_TVECS);
}
+ run_timer_list_running = &queued;
repeat:
head = tv1.vec + tv1.index;
curr = head->next;
@@ -317,8 +323,18 @@
timer_exit();
goto repeat;
}
+ run_timer_list_running = NULL;
++timer_jiffies;
tv1.index = (tv1.index + 1) & TVR_MASK;
+
+ curr = queued.next;
+ while (curr != &queued) {
+ struct timer_list *timer;
+
+ timer = list_entry(curr, struct timer_list, list);
+ curr = curr->next;
+ internal_add_timer(timer);
+ }
}
spin_unlock_irq(&timerlist_lock);
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)