[svn-commits] sruffell: linux/trunk r6933 - /linux/trunk/drivers/dahdi/dahdi_dummy.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Aug 4 11:22:44 CDT 2009


Author: sruffell
Date: Tue Aug  4 11:22:39 2009
New Revision: 6933

URL: http://svn.asterisk.org/svn-view/dahdi?view=rev&rev=6933
Log:
dahdi_dummy: Do not allow jumps in system time to lock up the system.

Since dahdi_dummy uses the number of milliseconds that has actually passed to
determine how many times to call dahdi_receive, it is possible that if the
system time shifts after dahdi is started, that the system can appear to lock
up while dahdi_dummy attempts to catch up.  This change prevents soft lock ups
under these conditions.

(closes issue #15647)
Reported by: missnebun

Modified:
    linux/trunk/drivers/dahdi/dahdi_dummy.c

Modified: linux/trunk/drivers/dahdi/dahdi_dummy.c
URL: http://svn.asterisk.org/svn-view/dahdi/linux/trunk/drivers/dahdi/dahdi_dummy.c?view=diff&rev=6933&r1=6932&r2=6933
==============================================================================
--- linux/trunk/drivers/dahdi/dahdi_dummy.c (original)
+++ linux/trunk/drivers/dahdi/dahdi_dummy.c Tue Aug  4 11:22:39 2009
@@ -161,12 +161,31 @@
 	unsigned long ms_since_start;
 	struct timespec now;
 	const unsigned long MAX_INTERVAL = 100000L;
+	const unsigned long MS_LIMIT = 3000;
 
 	if (!atomic_read(&shutdown))
 		mod_timer(&timer, jiffies + JIFFIES_INTERVAL);
 
 	now = current_kernel_time();
 	ms_since_start = timespec_diff_ms(&ztd->start_interval, &now);
+	
+	/*
+	 * If the system time has changed, it is possible for us to be far
+	 * behind.  If we are more than MS_LIMIT milliseconds behind, just
+	 * reset our time base and continue so that we do not hang the system
+	 * here.
+	 *
+	 */
+	if (unlikely((ms_since_start - ztd->calls_since_start) > MS_LIMIT)) {
+		if (printk_ratelimit()) {
+			printk(KERN_INFO
+			       "dahdi_dummy: Detected time shift.\n");
+		}
+		ztd->calls_since_start = 0;
+		ztd->start_interval = now;
+		return;
+	}
+
 	while (ms_since_start > ztd->calls_since_start) {
 		ztd->calls_since_start++;
 		dahdi_receive(&ztd->span);




More information about the svn-commits mailing list