[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