svn commit: r237233 - projects/calloutng/sys/kern

Davide Italiano davide at FreeBSD.org
Mon Jun 18 18:25:58 UTC 2012


Author: davide
Date: Mon Jun 18 18:25:57 2012
New Revision: 237233
URL: http://svn.freebsd.org/changeset/base/237233

Log:
  Don't compute the bucket applying the hash function if there's no need to
  do this. While here, try to simplify the callout_tick() logic and fix
  a couple of style bugs.
  
  Discussed with:		mav

Modified:
  projects/calloutng/sys/kern/kern_timeout.c

Modified: projects/calloutng/sys/kern/kern_timeout.c
==============================================================================
--- projects/calloutng/sys/kern/kern_timeout.c	Mon Jun 18 17:23:24 2012	(r237232)
+++ projects/calloutng/sys/kern/kern_timeout.c	Mon Jun 18 18:25:57 2012	(r237233)
@@ -358,13 +358,11 @@ get_bucket(struct bintime *bt)
 void
 callout_tick(void)
 {
+	struct bintime limit, next, now;
 	struct callout *tmp;
 	struct callout_cpu *cc;
 	struct callout_tailq *sc;
-	struct bintime now;
-	struct bintime limit;
-	struct bintime next;
-	int cpu, first, flag, future, last, need_softclock; 
+	int cpu, first, future, last, need_softclock; 
 
 	/*
 	 * Process callouts at a very low cpu priority, so we don't keep the
@@ -374,8 +372,12 @@ callout_tick(void)
 	cc = CC_SELF();
 	mtx_lock_spin_flags(&cc->cc_lock, MTX_QUIET);
 	binuptime(&now);
+	cpu = curcpu;
 	first = callout_hash(&cc->cc_softticks);
 	last = callout_hash(&now);
+	next.sec = -1;
+	next.frac = -1;
+	future = ((last + hz/4) & callwheelmask); 
 	/* 
 	 * Check if we wrapped around the entire wheel from the last scan.
 	 * In case, we need to scan entirely the wheel for pending callouts.
@@ -388,19 +390,10 @@ callout_tick(void)
 		first &= callwheelmask;
 		last &= callwheelmask;
 	}
-	cpu = curcpu;
-	next.sec = -1;
-	next .frac = -1;
-	limit.sec = 0;
-	limit.frac = 4611686018427250000; /* 1/4 sec */
-	bintime_add(&limit,&now);
-	future = get_bucket(&limit);
-	flag = 0;
 	for (;;) {	
 		sc = &cc->cc_callwheel[first];
 		TAILQ_FOREACH(tmp, sc, c_links.tqe) {
-			if ((!flag || flag == 1) && 
-			    bintime_cmp(&tmp->c_time, &now, <=)) {
+			if (bintime_cmp(&tmp->c_time, &now, <=)) {
 				if (tmp->c_flags & CALLOUT_DIRECT) {
 					tmp->c_func(tmp->c_arg);
 					TAILQ_REMOVE(sc, tmp, c_links.tqe);
@@ -414,8 +407,18 @@ callout_tick(void)
 					need_softclock = 1;
 				}
 			}	
-			if ((flag == 1 || flag == 2)  && 
-			    bintime_cmp(&tmp->c_time, &now, >)) {
+		}	
+		if (first == last)
+			break;
+		first = ((first + 1) & callwheelmask);
+	}
+	limit.sec = 0;
+	limit.frac = (uint64_t)1 << (64 - 2);
+	bintime_add(&limit, &now);		
+	for (;;) {
+		sc = &cc->cc_callwheel[last];
+		TAILQ_FOREACH(tmp, sc, c_links.tqe) {
+			if (bintime_cmp(&tmp->c_time, &limit, <=)) {
 				if (next.sec == -1 ||
 				    bintime_cmp(&tmp->c_time, &next, <)) {
 					next = tmp->c_time;
@@ -423,16 +426,15 @@ callout_tick(void)
 				}
 			}
 		}
-		if (first == ((last - 1) & callwheelmask)) 
-			flag = 1;
-		if (first == last)
-			flag = 2;
-		if (first == future || next.sec != -1)
+		if ((last == future) || (next.sec != -1))
 			break;
-		first = (first + 1) & callwheelmask;
+		last = ((last + 1) & callwheelmask);
+	}	
+	if (next.sec == -1) { 
+		next.sec = 0;	
+		next.frac = (uint64_t)1 << (64 - 2);	
+		bintime_add(&next, &now);
 	}
-	if (next.sec == -1)  
-		next = limit;
 	cc->cc_firsttick = next;
 	if (callout_new_inserted != NULL) 
 		(*callout_new_inserted)(cpu, next);


More information about the svn-src-projects mailing list