From 12d7e7a980ee03197f053043ecfd24d7f45dac3b Mon Sep 17 00:00:00 2001 From: kib Date: Mon, 15 Jul 2019 19:18:25 +0000 Subject: [PATCH] In do_sem2_wait(), balance umtx_key_get() with umtx_key_release() on retry. Reported by: ler Bisected and reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 12 days --- sys/kern/kern_umtx.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index 840344fd61df..bb9984579753 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -3316,14 +3316,13 @@ do_sem2_wait(struct thread *td, struct _usem2 *sem, struct _umtx_time *timeout) uq = td->td_umtxq; flags = fuword32(&sem->_flags); - error = umtx_key_get(sem, TYPE_SEM, GET_SHARE(flags), &uq->uq_key); - if (error != 0) - return (error); - if (timeout != NULL) abs_timeout_init2(&timo, timeout); again: + error = umtx_key_get(sem, TYPE_SEM, GET_SHARE(flags), &uq->uq_key); + if (error != 0) + return (error); umtxq_lock(&uq->uq_key); umtxq_busy(&uq->uq_key); umtxq_insert(uq);