git: 307a3dd35cd4 - main - umtx: Expose struct abs_timeout to the rest of the kernel.

Dmitry Chagin dchagin at FreeBSD.org
Thu Jul 29 09:46:08 UTC 2021


The branch main has been updated by dchagin:

URL: https://cgit.FreeBSD.org/src/commit/?id=307a3dd35cd48ae39849192e0d7a7d34ac7e6ac8

commit 307a3dd35cd48ae39849192e0d7a7d34ac7e6ac8
Author:     Dmitry Chagin <dchagin at FreeBSD.org>
AuthorDate: 2021-07-29 09:41:58 +0000
Commit:     Dmitry Chagin <dchagin at FreeBSD.org>
CommitDate: 2021-07-29 09:41:58 +0000

    umtx: Expose struct abs_timeout to the rest of the kernel.
    
    Add umtx_ prefix to all abs_timeout facility and add declaration for it.
    For consistency with others abs_timeout mark inline abs_timeout_init2.
    
    Reviewed by:            kib
    Differential Revision:  https://reviews.freebsd.org/D31249
    MFC after:              2 weeks
---
 sys/kern/kern_umtx.c | 95 ++++++++++++++++++++++++++--------------------------
 sys/sys/umtxvar.h    |  9 +++++
 2 files changed, 56 insertions(+), 48 deletions(-)

diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c
index c7f9afeb6c4d..5d2523c422d8 100644
--- a/sys/kern/kern_umtx.c
+++ b/sys/kern/kern_umtx.c
@@ -213,13 +213,6 @@ struct umtxq_chain {
 
 #define BUSY_SPINS		200
 
-struct abs_timeout {
-	int clockid;
-	bool is_abs_real;	/* TIMER_ABSTIME && CLOCK_REALTIME* */
-	struct timespec cur;
-	struct timespec end;
-};
-
 struct umtx_copyops {
 	int	(*copyin_timeout)(const void *uaddr, struct timespec *tsp);
 	int	(*copyin_umtx_time)(const void *uaddr, size_t size,
@@ -267,7 +260,10 @@ static SYSCTL_NODE(_debug_umtx, OID_AUTO, chains, CTLFLAG_RD | CTLFLAG_MPSAFE, 0
     "umtx chain stats");
 #endif
 
-static void abs_timeout_update(struct abs_timeout *timo);
+static inline void umtx_abs_timeout_init2(struct umtx_abs_timeout *timo,
+    const struct _umtx_time *umtxtime);
+static int umtx_abs_timeout_gethz(struct umtx_abs_timeout *timo);
+static inline void umtx_abs_timeout_update(struct umtx_abs_timeout *timo);
 
 static void umtx_shm_init(void);
 static void umtxq_sysinit(void *);
@@ -278,7 +274,8 @@ static void umtxq_busy(struct umtx_key *key);
 static void umtxq_unbusy(struct umtx_key *key);
 static void umtxq_insert_queue(struct umtx_q *uq, int q);
 static void umtxq_remove_queue(struct umtx_q *uq, int q);
-static int umtxq_sleep(struct umtx_q *uq, const char *wmesg, struct abs_timeout *);
+static int umtxq_sleep(struct umtx_q *uq, const char *wmesg,
+    struct umtx_abs_timeout *);
 static int umtxq_count(struct umtx_key *key);
 static struct umtx_pi *umtx_pi_alloc(int);
 static void umtx_pi_free(struct umtx_pi *pi);
@@ -741,15 +738,15 @@ tstohz(const struct timespec *tsp)
 	return tvtohz(&tv);
 }
 
-static void
-abs_timeout_init(struct abs_timeout *timo, int clockid, int absolute,
-	const struct timespec *timeout)
+void
+umtx_abs_timeout_init(struct umtx_abs_timeout *timo, int clockid,
+    int absolute, const struct timespec *timeout)
 {
 
 	timo->clockid = clockid;
 	if (!absolute) {
 		timo->is_abs_real = false;
-		abs_timeout_update(timo);
+		umtx_abs_timeout_update(timo);
 		timespecadd(&timo->cur, timeout, &timo->end);
 	} else {
 		timo->end = *timeout;
@@ -761,28 +758,29 @@ abs_timeout_init(struct abs_timeout *timo, int clockid, int absolute,
 		 * after setting td_rtcgen; otherwise, read it here.
 		 */
 		if (!timo->is_abs_real) {
-			abs_timeout_update(timo);
+			umtx_abs_timeout_update(timo);
 		}
 	}
 }
 
 static void
-abs_timeout_init2(struct abs_timeout *timo, const struct _umtx_time *umtxtime)
+umtx_abs_timeout_init2(struct umtx_abs_timeout *timo,
+    const struct _umtx_time *umtxtime)
 {
 
-	abs_timeout_init(timo, umtxtime->_clockid,
+	umtx_abs_timeout_init(timo, umtxtime->_clockid,
 	    (umtxtime->_flags & UMTX_ABSTIME) != 0, &umtxtime->_timeout);
 }
 
-static inline void
-abs_timeout_update(struct abs_timeout *timo)
+static void
+umtx_abs_timeout_update(struct umtx_abs_timeout *timo)
 {
 
 	kern_clock_gettime(curthread, timo->clockid, &timo->cur);
 }
 
 static int
-abs_timeout_gethz(struct abs_timeout *timo)
+umtx_abs_timeout_gethz(struct umtx_abs_timeout *timo)
 {
 	struct timespec tts;
 
@@ -810,14 +808,15 @@ umtx_unlock_val(uint32_t flags, bool rb)
  * thread was removed from umtx queue.
  */
 static inline int
-umtxq_sleep(struct umtx_q *uq, const char *wmesg, struct abs_timeout *abstime)
+umtxq_sleep(struct umtx_q *uq, const char *wmesg,
+    struct umtx_abs_timeout *abstime)
 {
 	struct umtxq_chain *uc;
 	int error, timo;
 
 	if (abstime != NULL && abstime->is_abs_real) {
 		curthread->td_rtcgen = atomic_load_acq_int(&rtc_generation);
-		abs_timeout_update(abstime);
+		umtx_abs_timeout_update(abstime);
 	}
 
 	uc = umtxq_getchain(&uq->uq_key);
@@ -828,7 +827,7 @@ umtxq_sleep(struct umtx_q *uq, const char *wmesg, struct abs_timeout *abstime)
 			break;
 		}
 		if (abstime != NULL) {
-			timo = abs_timeout_gethz(abstime);
+			timo = umtx_abs_timeout_gethz(abstime);
 			if (timo < 0) {
 				error = ETIMEDOUT;
 				break;
@@ -844,7 +843,7 @@ umtxq_sleep(struct umtx_q *uq, const char *wmesg, struct abs_timeout *abstime)
 			if (abstime->is_abs_real)
 				curthread->td_rtcgen =
 				    atomic_load_acq_int(&rtc_generation);
-			abs_timeout_update(abstime);
+			umtx_abs_timeout_update(abstime);
 		}
 		umtxq_lock(&uq->uq_key);
 	}
@@ -917,7 +916,7 @@ static int
 do_lock_umtx(struct thread *td, struct umtx *umtx, u_long id,
     const struct timespec *timeout)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq;
 	u_long owner;
 	u_long old;
@@ -925,7 +924,7 @@ do_lock_umtx(struct thread *td, struct umtx *umtx, u_long id,
 
 	uq = td->td_umtxq;
 	if (timeout != NULL)
-		abs_timeout_init(&timo, CLOCK_REALTIME, 0, timeout);
+		umtx_abs_timeout_init(&timo, CLOCK_REALTIME, 0, timeout);
 
 	/*
 	 * Care must be exercised when dealing with umtx structure. It
@@ -1098,7 +1097,7 @@ static int
 do_lock_umtx32(struct thread *td, uint32_t *m, uint32_t id,
 	const struct timespec *timeout)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq;
 	uint32_t owner;
 	uint32_t old;
@@ -1107,7 +1106,7 @@ do_lock_umtx32(struct thread *td, uint32_t *m, uint32_t id,
 	uq = td->td_umtxq;
 
 	if (timeout != NULL)
-		abs_timeout_init(&timo, CLOCK_REALTIME, 0, timeout);
+		umtx_abs_timeout_init(&timo, CLOCK_REALTIME, 0, timeout);
 
 	/*
 	 * Care must be exercised when dealing with umtx structure. It
@@ -1279,7 +1278,7 @@ static int
 do_wait(struct thread *td, void *addr, u_long id,
     struct _umtx_time *timeout, int compat32, int is_private)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq;
 	u_long tmp;
 	uint32_t tmp32;
@@ -1291,7 +1290,7 @@ do_wait(struct thread *td, void *addr, u_long id,
 		return (error);
 
 	if (timeout != NULL)
-		abs_timeout_init2(&timo, timeout);
+		umtx_abs_timeout_init2(&timo, timeout);
 
 	umtxq_lock(&uq->uq_key);
 	umtxq_insert(uq);
@@ -1352,7 +1351,7 @@ static int
 do_lock_normal(struct thread *td, struct umutex *m, uint32_t flags,
     struct _umtx_time *timeout, int mode)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq;
 	uint32_t owner, old, id;
 	int error, rv;
@@ -1361,7 +1360,7 @@ do_lock_normal(struct thread *td, struct umutex *m, uint32_t flags,
 	uq = td->td_umtxq;
 	error = 0;
 	if (timeout != NULL)
-		abs_timeout_init2(&timo, timeout);
+		umtx_abs_timeout_init2(&timo, timeout);
 
 	/*
 	 * Care must be exercised when dealing with umtx structure. It
@@ -2020,7 +2019,7 @@ umtx_pi_adjust(struct thread *td, u_char oldpri)
  */
 static int
 umtxq_sleep_pi(struct umtx_q *uq, struct umtx_pi *pi, uint32_t owner,
-    const char *wmesg, struct abs_timeout *timo, bool shared)
+    const char *wmesg, struct umtx_abs_timeout *timo, bool shared)
 {
 	struct thread *td, *td1;
 	struct umtx_q *uq1;
@@ -2158,7 +2157,7 @@ static int
 do_lock_pi(struct thread *td, struct umutex *m, uint32_t flags,
     struct _umtx_time *timeout, int try)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq;
 	struct umtx_pi *pi, *new_pi;
 	uint32_t id, old_owner, owner, old;
@@ -2173,7 +2172,7 @@ do_lock_pi(struct thread *td, struct umutex *m, uint32_t flags,
 		return (error);
 
 	if (timeout != NULL)
-		abs_timeout_init2(&timo, timeout);
+		umtx_abs_timeout_init2(&timo, timeout);
 
 	umtxq_lock(&uq->uq_key);
 	pi = umtx_pi_lookup(&uq->uq_key);
@@ -2494,7 +2493,7 @@ static int
 do_lock_pp(struct thread *td, struct umutex *m, uint32_t flags,
     struct _umtx_time *timeout, int try)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq, *uq2;
 	struct umtx_pi *pi;
 	uint32_t ceiling;
@@ -2509,7 +2508,7 @@ do_lock_pp(struct thread *td, struct umutex *m, uint32_t flags,
 		return (error);
 
 	if (timeout != NULL)
-		abs_timeout_init2(&timo, timeout);
+		umtx_abs_timeout_init2(&timo, timeout);
 
 	su = (priv_check(td, PRIV_SCHED_RTPRIO) == 0);
 	for (;;) {
@@ -2899,7 +2898,7 @@ static int
 do_cv_wait(struct thread *td, struct ucond *cv, struct umutex *m,
     struct timespec *timeout, u_long wflags)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq;
 	uint32_t flags, clockid, hasw;
 	int error;
@@ -2946,8 +2945,8 @@ do_cv_wait(struct thread *td, struct ucond *cv, struct umutex *m,
 	error = do_unlock_umutex(td, m, false);
 
 	if (timeout != NULL)
-		abs_timeout_init(&timo, clockid, (wflags & CVWAIT_ABSTIME) != 0,
-		    timeout);
+		umtx_abs_timeout_init(&timo, clockid,
+		    (wflags & CVWAIT_ABSTIME) != 0, timeout);
 
 	umtxq_lock(&uq->uq_key);
 	if (error == 0) {
@@ -3047,7 +3046,7 @@ static int
 do_rw_rdlock(struct thread *td, struct urwlock *rwlock, long fflag,
     struct _umtx_time *timeout)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq;
 	uint32_t flags, wrflags;
 	int32_t state, oldstate;
@@ -3063,7 +3062,7 @@ do_rw_rdlock(struct thread *td, struct urwlock *rwlock, long fflag,
 		return (error);
 
 	if (timeout != NULL)
-		abs_timeout_init2(&timo, timeout);
+		umtx_abs_timeout_init2(&timo, timeout);
 
 	wrflags = URWLOCK_WRITE_OWNER;
 	if (!(fflag & URWLOCK_PREFER_READER) && !(flags & URWLOCK_PREFER_READER))
@@ -3232,7 +3231,7 @@ sleep:
 static int
 do_rw_wrlock(struct thread *td, struct urwlock *rwlock, struct _umtx_time *timeout)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq;
 	uint32_t flags;
 	int32_t state, oldstate;
@@ -3249,7 +3248,7 @@ do_rw_wrlock(struct thread *td, struct urwlock *rwlock, struct _umtx_time *timeo
 		return (error);
 
 	if (timeout != NULL)
-		abs_timeout_init2(&timo, timeout);
+		umtx_abs_timeout_init2(&timo, timeout);
 
 	blocked_readers = 0;
 	for (;;) {
@@ -3527,7 +3526,7 @@ out:
 static int
 do_sem_wait(struct thread *td, struct _usem *sem, struct _umtx_time *timeout)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq;
 	uint32_t flags, count, count1;
 	int error, rv, rv1;
@@ -3541,7 +3540,7 @@ do_sem_wait(struct thread *td, struct _usem *sem, struct _umtx_time *timeout)
 		return (error);
 
 	if (timeout != NULL)
-		abs_timeout_init2(&timo, timeout);
+		umtx_abs_timeout_init2(&timo, timeout);
 
 again:
 	umtxq_lock(&uq->uq_key);
@@ -3632,7 +3631,7 @@ do_sem_wake(struct thread *td, struct _usem *sem)
 static int
 do_sem2_wait(struct thread *td, struct _usem2 *sem, struct _umtx_time *timeout)
 {
-	struct abs_timeout timo;
+	struct umtx_abs_timeout timo;
 	struct umtx_q *uq;
 	uint32_t count, flags;
 	int error, rv;
@@ -3640,7 +3639,7 @@ do_sem2_wait(struct thread *td, struct _usem2 *sem, struct _umtx_time *timeout)
 	uq = td->td_umtxq;
 	flags = fuword32(&sem->_flags);
 	if (timeout != NULL)
-		abs_timeout_init2(&timo, timeout);
+		umtx_abs_timeout_init2(&timo, timeout);
 
 again:
 	error = umtx_key_get(sem, TYPE_SEM, GET_SHARE(flags), &uq->uq_key);
@@ -3699,7 +3698,7 @@ again:
 			if (error == ERESTART)
 				error = EINTR;
 			if (error == EINTR) {
-				abs_timeout_update(&timo);
+				umtx_abs_timeout_update(&timo);
 				timespecsub(&timo.end, &timo.cur,
 				    &timeout->_timeout);
 			}
diff --git a/sys/sys/umtxvar.h b/sys/sys/umtxvar.h
index b898c263201e..3f2c0d9e29ec 100644
--- a/sys/sys/umtxvar.h
+++ b/sys/sys/umtxvar.h
@@ -78,6 +78,13 @@ struct umtx_key {
 #define PROCESS_SHARE		1
 #define AUTO_SHARE		2
 
+struct umtx_abs_timeout {
+	int clockid;
+	bool is_abs_real;	/* TIMER_ABSTIME && CLOCK_REALTIME* */
+	struct timespec cur;
+	struct timespec end;
+};
+
 struct thread;
 
 static inline int
@@ -89,6 +96,8 @@ umtx_key_match(const struct umtx_key *k1, const struct umtx_key *k2)
 	    k1->info.both.b == k2->info.both.b);
 }
 
+void umtx_abs_timeout_init(struct umtx_abs_timeout *, int, int,
+    const struct timespec *);
 int umtx_copyin_timeout(const void *, struct timespec *);
 void umtx_exec(struct proc *p);
 int umtx_key_get(const void *, int, int, struct umtx_key *);


More information about the dev-commits-src-main mailing list