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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to