lkml.org 
[lkml]   [1998]   [Jun]   [2]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
DateTue, 2 Jun 1998 01:40:50 -0600 (MDT)
FromColin Plumb <>
Subjectsched.c documentation patch
The code is neat, but could be commented a bit better.
In particular, I think the invariant relationship between
tv?.index and timer_jiffies should be made clear so no future
hacker messes it up.

I also fixed a jiffies-overflow buglet (it requires a delay
of greater than 1<<26 jiffies that spans jiffies wrapping 2^32,
which is pretty unlikely) so that it works right.

Note that delays over 2^31 jiffies don't work on 32-bit platforms, so
perhaps a more vigorous complaint in the handling for that case
is in order.
-- 
	-Colin

--- sched.c
+++ sched.c	Tue Jun  2 00:18:29 1998
@@ -273,6 +273,29 @@
 
 #define NOOF_TVECS (sizeof(tvecs) / sizeof(tvecs[0]))
 
+/*
+ * A timeout within TVR_SIZE jiffies of now is linked into one of the
+ * lists in tv1, and every jiffy one of the bins is emptied.
+ * Timeouts further in the future are grouped into bins of TVR_SIZE
+ * jiffies and stored in one of the TVN_SIZE slots in tv2.
+ * timeouts further than TVR_SIZE*TVN_SIZE jiffies away are stored in tv3,
+ * and so on.  The current settings support up to 32 bits of timeout.
+ * Timeouts further away than that (e.g. 48 days and 13:05:04 on an
+ * Alpha at 1024 Hz) are forgotten about and *never* wake up.
+ *
+ * timer_jiffies keeps track of how far the timer list has been run,
+ * which lags behind jiffies.  (jiffies are incremented in an interrupt,
+ * but run_timer_list is done later by the scheduler.)
+ *
+ * The following invariants are maintained by run_timer_list:
+ *	tv1.index == timer_jiffies & TVR_MASK
+ *	tv2.index == (timer_jiffies >> TVR_BITS) & TVN_MASK
+ *	tv3.index == (timer_jiffies >> TVR_BITS + TVN_BITS) & TVN_MASK
+ *	tv3.index == (timer_jiffies >> TVR_BITS + 2*TVN_BITS) & TVN_MASK
+ *	etc.
+ * thus, the "index" values are not strictly necessary.
+ */
+
 static unsigned long timer_jiffies = 0;
 
 static inline void insert_timer(struct timer_list *timer,
@@ -304,7 +327,7 @@
 	} else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) {
 		int i = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK;
 		insert_timer(timer, tv4.vec, i);
-	} else if (expires < timer_jiffies) {
+	} else if ((long)idx < 0) {
 		/* can happen if you add a timer with expires == jiffies,
 		 * or you set a timer to go off in the past
 		 */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu

\
 
 \ /
  Last update: 2005-03-22 12:42    [from the cache]
©2003-2008