Author: delphij
Date: Sun Sep  9 17:12:31 2018
New Revision: 338542
URL: https://svnweb.freebsd.org/changeset/base/338542

Log:
  random(4): Squash non-error timeout codes from tsleep(9).
  
  In both scenarios a timeout (EWOULDBLOCK) is considered as a
  normal condition and the error should not pop up to upper layers.
  
  PR:           231181
  Submitted by: cem
  Reported by:  lev
  Reviewed by:  vangyzen, markm, delphij
  Approved by:  re (kib)
  Approved by:  secteam (delphij)
  Differential Revision:        https://reviews.freebsd.org/D17049

Modified:
  head/sys/dev/random/randomdev.c

Modified: head/sys/dev/random/randomdev.c
==============================================================================
--- head/sys/dev/random/randomdev.c     Sun Sep  9 07:20:15 2018        
(r338541)
+++ head/sys/dev/random/randomdev.c     Sun Sep  9 17:12:31 2018        
(r338542)
@@ -156,6 +156,10 @@ READ_RANDOM_UIO(struct uio *uio, bool nonblock)
                error = tsleep(&random_alg_context, PCATCH, "randseed", hz/10);
                if (error == ERESTART || error == EINTR)
                        break;
+               /* Squash tsleep timeout condition */
+               if (error == EWOULDBLOCK)
+                       error = 0;
+               KASSERT(error == 0, ("unexpected tsleep error %d", error));
        }
        if (error == 0) {
                read_rate_increment((uio->uio_resid + 
sizeof(uint32_t))/sizeof(uint32_t));
@@ -184,9 +188,13 @@ READ_RANDOM_UIO(struct uio *uio, bool nonblock)
                         * uninterruptible syscalls.
                         */
                        if (error == 0 && uio->uio_resid != 0 &&
-                           total_read % sigchk_period == 0)
+                           total_read % sigchk_period == 0) {
                                error = tsleep_sbt(&random_alg_context, PCATCH,
                                    "randrd", SBT_1NS, 0, C_HARDCLOCK);
+                               /* Squash tsleep timeout condition */
+                               if (error == EWOULDBLOCK)
+                                       error = 0;
+                       }
                }
                if (error == ERESTART || error == EINTR)
                        error = 0;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to