diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index 6026b8080dbf..74d6d1ebb1f9 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -2980,7 +2980,9 @@ do_sem_wait(struct thread *td, struct _usem *sem, struct _umtx_time *timeout) error = 0; else { umtxq_remove(uq); - if (error == ERESTART) + /* A relative timeout cannot be restarted. */ + if (error == ERESTART && timeout != NULL && + (timeout->_flags & UMTX_ABSTIME) == 0) error = EINTR; } umtxq_unlock(&uq->uq_key); diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c index 0ea84fde44c8..509f32e909b7 100644 --- a/sys/kern/uipc_sem.c +++ b/sys/kern/uipc_sem.c @@ -846,8 +846,6 @@ kern_sem_wait(struct thread *td, semid_t id, int tryflag, err: mtx_unlock(&sem_lock); fdrop(fp, td); - if (error == ERESTART) - error = EINTR; DP(("<<< kern_sem_wait leaving, pid=%d, error = %d\n", (int)td->td_proc->p_pid, error)); return (error);