Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Sep 2015 09:27:15 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r287354 - head/sys/kern
Message-ID:  <201509010927.t819RFEM010627@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Tue Sep  1 09:27:14 2015
New Revision: 287354
URL: https://svnweb.freebsd.org/changeset/base/287354

Log:
  callout_reset: fix a reversed check for cc_exec_cancel
  
  The typo was introduced in r278469 / 344ecf88af2dfb.
  
  As a result of the bug there was a timing window where callout_reset()
  would fail to cancel a concurrent execution of a callout that is about
  to start and would schedule the callout again.
  The callout would fire more times than it is scheduled.
  That would happen even if the callout is initialized with a lock.
  
  For example, the bug triggered the "Stray timeout" assertion in
  taskqueue_timeout_func().
  
  MFC after:	5 days

Modified:
  head/sys/kern/kern_timeout.c

Modified: head/sys/kern/kern_timeout.c
==============================================================================
--- head/sys/kern/kern_timeout.c	Tue Sep  1 09:22:24 2015	(r287353)
+++ head/sys/kern/kern_timeout.c	Tue Sep  1 09:27:14 2015	(r287354)
@@ -1032,7 +1032,7 @@ callout_reset_sbt_on(struct callout *c, 
 		 * currently in progress.  If there is a lock then we
 		 * can cancel the callout if it has not really started.
 		 */
-		if (c->c_lock != NULL && cc_exec_cancel(cc, direct))
+		if (c->c_lock != NULL && !cc_exec_cancel(cc, direct))
 			cancelled = cc_exec_cancel(cc, direct) = true;
 		if (cc_exec_waiting(cc, direct)) {
 			/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201509010927.t819RFEM010627>