diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index 1e93a66805b1..31a5cb1964e7 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -756,6 +756,5 @@ _umtx_op(struct thread *td, struct _umtx_op_args *uap) error = EINVAL; break; } - td->td_retval[0] = -error; - return (0); + return (error); } diff --git a/sys/sys/umtx.h b/sys/sys/umtx.h index c9cfcb702359..527beb9234e3 100644 --- a/sys/sys/umtx.h +++ b/sys/sys/umtx.h @@ -81,7 +81,8 @@ umtx_lock(struct umtx *umtx, long id) { if (atomic_cmpset_acq_ptr(&umtx->u_owner, (void *)UMTX_UNOWNED, (void *)id) == 0) - return (- _umtx_op(umtx, UMTX_OP_LOCK, id, 0, 0)); + if (_umtx_op(umtx, UMTX_OP_LOCK, id, 0, 0) == -1) + return (errno); return (0); } @@ -99,7 +100,8 @@ umtx_timedlock(struct umtx *umtx, long id, const struct timespec *timeout) { if (atomic_cmpset_acq_ptr(&umtx->u_owner, (void *)UMTX_UNOWNED, (void *)id) == 0) - return (- _umtx_op(umtx, UMTX_OP_LOCK, id, 0, (void *)timeout)); + if (_umtx_op(umtx, UMTX_OP_LOCK, id, 0, (void *)timeout) == -1) + return (errno); return (0); } @@ -108,21 +110,26 @@ umtx_unlock(struct umtx *umtx, long id) { if (atomic_cmpset_rel_ptr(&umtx->u_owner, (void *)id, (void *)UMTX_UNOWNED) == 0) - return (- _umtx_op(umtx, UMTX_OP_UNLOCK, id, 0, 0)); + if (_umtx_op(umtx, UMTX_OP_UNLOCK, id, 0, 0) == -1) + return (errno); return (0); } static __inline int umtx_wait(struct umtx *umtx, long id, const struct timespec *timeout) { - return (- _umtx_op(umtx, UMTX_OP_WAIT, id, 0, (void *)timeout)); + if (_umtx_op(umtx, UMTX_OP_WAIT, id, 0, (void *)timeout) == -1) + return (errno); + return (0); } /* Wake threads waiting on a user address. */ static __inline int umtx_wake(struct umtx *umtx, int nr_wakeup) { - return (- _umtx_op(umtx, UMTX_OP_WAKE, nr_wakeup, 0, 0)); + if (_umtx_op(umtx, UMTX_OP_WAKE, nr_wakeup, 0, 0) == -1) + return (errno); + return (0); } #endif /* !_KERNEL */