Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 31 Jul 2019 19:16:49 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r350478 - head/sys/kern
Message-ID:  <201907311916.x6VJGnjo051757@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Wed Jul 31 19:16:49 2019
New Revision: 350478
URL: https://svnweb.freebsd.org/changeset/base/350478

Log:
  Fix handling of transient casueword(9) failures in do_sem_wait().
  
  In particular, restart should be only done when the failure is
  transient.  For this, recheck the count1 value after the operation.
  
  Note that do_sem_wait() is older usem interface.
  
  Reported and tested by:	bdrewery
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week

Modified:
  head/sys/kern/kern_umtx.c

Modified: head/sys/kern/kern_umtx.c
==============================================================================
--- head/sys/kern/kern_umtx.c	Wed Jul 31 18:44:20 2019	(r350477)
+++ head/sys/kern/kern_umtx.c	Wed Jul 31 19:16:49 2019	(r350478)
@@ -3229,7 +3229,8 @@ again:
 	rv = casueword32(&sem->_has_waiters, 0, &count1, 1);
 	if (rv == 0)
 		rv1 = fueword32(&sem->_count, &count);
-	if (rv == -1 || (rv == 0 && (rv1 == -1 || count != 0)) || rv == 1) {
+	if (rv == -1 || (rv == 0 && (rv1 == -1 || count != 0)) ||
+	    (rv == 1 && count1 == 0)) {
 		umtxq_lock(&uq->uq_key);
 		umtxq_unbusy(&uq->uq_key);
 		umtxq_remove(uq);



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