aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyan Moeller <[email protected]>2020-06-16 12:59:31 -0400
committerGitHub <[email protected]>2020-06-16 09:59:31 -0700
commitc13facb9c4a036034ff8d898857a81c64c83dc09 (patch)
tree3a5507513c978aa8ccc84df655aa81d38322ca74
parent883a40fff427d200be41d3faabab1dca9a84b353 (diff)
Fix FreeBSD condvar semantics
We should return -1 instead of negative deltas, and 0 if signaled. Reviewed-by: Alexander Motin <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Jorgen Lundman <[email protected]> Signed-off-by: Ryan Moeller <[email protected]> Closes #10460
-rw-r--r--include/os/freebsd/spl/sys/condvar.h27
1 files changed, 20 insertions, 7 deletions
diff --git a/include/os/freebsd/spl/sys/condvar.h b/include/os/freebsd/spl/sys/condvar.h
index b21940166..ff5f308e2 100644
--- a/include/os/freebsd/spl/sys/condvar.h
+++ b/include/os/freebsd/spl/sys/condvar.h
@@ -134,12 +134,17 @@ cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t tim, hrtime_t res,
tim += hrtime;
if (hrtime >= tim)
- return (tim - hrtime);
+ return (-1);
+
rc = cv_timedwait_sbt(cvp, mp, zfs_nstosbt(tim),
zfs_nstosbt(res), C_ABSOLUTE);
- KASSERT(rc == EWOULDBLOCK || rc == 0, ("unexpected rc value %d", rc));
- return (tim - gethrtime());
+ if (rc == EWOULDBLOCK)
+ return (-1);
+
+ KASSERT(rc == 0, ("unexpected rc value %d", rc));
+ hrtime = tim - gethrtime();
+ return ((hrtime > 0) ? hrtime : -1);
}
static inline clock_t
@@ -157,14 +162,22 @@ cv_timedwait_sig_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t tim,
tim += hrtime;
if (hrtime >= tim)
- return (tim - hrtime);
+ return (-1);
sbt = zfs_nstosbt(tim);
rc = cv_timedwait_sig_sbt(cvp, mp, sbt, zfs_nstosbt(res), C_ABSOLUTE);
- KASSERT(rc == EWOULDBLOCK || rc == EINTR || rc == ERESTART ||
- rc == 0, ("unexpected rc value %d", rc));
- return (tim - gethrtime());
+ switch (rc) {
+ case EWOULDBLOCK:
+ return (-1);
+ case EINTR:
+ case ERESTART:
+ return (0);
+ default:
+ KASSERT(rc == 0, ("unexpected rc value %d", rc));
+ hrtime = tim - gethrtime();
+ return ((hrtime > 0) ? hrtime : -1);
+ }
}
#endif /* _OPENSOLARIS_SYS_CONDVAR_H_ */