From nobody Tue Apr 18 23:22:56 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Q1Khw3kLcz45qr9; Tue, 18 Apr 2023 23:22:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Q1Khw37Yhz4Vrw; Tue, 18 Apr 2023 23:22:56 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1681860176; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=gy+TYwjoEvK4SNaEiBAaStSSisPhq9x1xabtx1yS+50=; b=Nmk0BrBqI/VfmR08tBugriAz0kH6Am/0YYf6rACQoK+vmqfMu0kBFjqUzYDhHNwtXPXBHV ljhg5AtTQn9vrdlOrdoGw+s+DU04Jw7/GQ06sGR2+grhGPg9jMmaYidjtrb9pwNauQL3ma 1NNDALUmtq1XxeOMPz//WdW0LoWt5RhcFUpR+127U1mK9iMvszVYpphsm124KkpRcc3a9N 7h4Fi5MYmS8qBhQoprj5lNa6fNq5fiNf205JjDxFLa5KKkwcjDv1GZyAH1Eay6x4CWkQbb eSlZOU787gng+hLk+Nz8zhp9c8iKm2ryAUup2xJR+gQTdO6ZFbUDSGCvOl8Mhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1681860176; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=gy+TYwjoEvK4SNaEiBAaStSSisPhq9x1xabtx1yS+50=; b=Sh7RnuhToG57lSeWXBoSMzCItLiYzV+grFy1zMQ01yxX92UgBsjnpl96aRd1cWp8zBkmGy qwYkHSVajlI2CHQbLjofHP7y19mjRiQk2u5YJO6R/Xls/6ktApGiGszEGApNt9IDvFDeTn DMf88glRjFRu2XeeJdxJSXxcL4C2HLDa1DUgdEofjnqs1Omct04X9uepNkTBTi3l3LSciF Vl5lFFQ6inHBUJEsuyrZqU6YOwDyhSIwMHMLHoANj92d7prF6c/0F9zmfDx1MjlkfvuiFx PtPKfkqLpUYGY+gQoi+TAniOYb8aUdXfhxI0fEgXEt4P66y5S5qCBKwsKQtLvQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1681860176; a=rsa-sha256; cv=none; b=PyOQmwy/djCD7dlnaIGpeJJTdAp+qPQgyWUuqz0YxZ1C/uLhqLCXGz9s9XfsCdUM5k/uIx HzDof1xob/+bJNFSEJOuKYSohqE1Btz09oWA2VW2bCe0g0LPCkxM6b7SkOo4hxj5XOP22V A2vu4MzNxTxdwHi4QqknpzaLQM4k3zlJCLB+hSCk9ZcHaKAVymqrtttXP1dayn+DJtS0FT yuaQhUP4JpPjMbmos+62UVtCbbLpMZwJFDNI89YA9bu/eO8lt1dzNSuQFpIY4q9fwJMWRl NTPQmadZZJyWK7y0cCmltUGO81NhEH9DKrB1PAVYSKZyVtel2XiEsblgqemy8g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Q1Khw2FkzzXDg; Tue, 18 Apr 2023 23:22:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 33INMuAc011695; Tue, 18 Apr 2023 23:22:56 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 33INMuNL011694; Tue, 18 Apr 2023 23:22:56 GMT (envelope-from git) Date: Tue, 18 Apr 2023 23:22:56 GMT Message-Id: <202304182322.33INMuNL011694@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 93ca6ff2958c - main - umtx: allow to configure minimal timeout (in nanoseconds) List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 93ca6ff2958cace3b7b883ed797ea6539881a6a2 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=93ca6ff2958cace3b7b883ed797ea6539881a6a2 commit 93ca6ff2958cace3b7b883ed797ea6539881a6a2 Author: Konstantin Belousov AuthorDate: 2023-04-15 17:46:12 +0000 Commit: Konstantin Belousov CommitDate: 2023-04-18 23:22:28 +0000 umtx: allow to configure minimal timeout (in nanoseconds) PR: 270785 Reviewed by: markj, mav Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D39584 --- lib/libc/sys/_umtx_op.2 | 11 +++++++++++ lib/libthr/libthr.3 | 6 ++++++ lib/libthr/thread/thr_init.c | 11 +++++++++++ sys/kern/kern_thread.c | 4 ++-- sys/kern/kern_umtx.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ sys/sys/proc.h | 1 + sys/sys/umtx.h | 2 ++ 7 files changed, 78 insertions(+), 2 deletions(-) diff --git a/lib/libc/sys/_umtx_op.2 b/lib/libc/sys/_umtx_op.2 index f4a908b85017..93078a765495 100644 --- a/lib/libc/sys/_umtx_op.2 +++ b/lib/libc/sys/_umtx_op.2 @@ -1270,6 +1270,17 @@ in which case list processing is continued. See .Sx ROBUST UMUTEXES subsection for details. +.It Dv UMTX_OP_GET_MIN_TIMEOUT +Writes out the current value of minimal umtx operations timeout, +in nanoseconds, into the long integer variable pointed to by +.Fa uaddr1 . +.It Dv UMTX_OP_SET_MIN_TIMEOUT +Set the minimal amount of time, in nanoseconds, the thread is required +to sleep for umtx operations specifying a timeout using absolute clocks. +The value is taken from the +.Fa val +argument of the call. +Zero means no minimum. .El .Pp The diff --git a/lib/libthr/libthr.3 b/lib/libthr/libthr.3 index 3018a6f20b86..0477ac0647a8 100644 --- a/lib/libthr/libthr.3 +++ b/lib/libthr/libthr.3 @@ -196,6 +196,12 @@ The integer value of the variable specifies how often blocked threads are inserted at the head of the sleep queue, instead of its tail. Bigger values reduce the frequency of the FIFO discipline. The value must be between 0 and 255. +.It Dv LIBPTHREAD_UMTX_MIN_TIMEOUT +The minimal amount of time, in nanoseconds, the thread is required to sleep +for pthread operations specifying a timeout. +If the operation requests a timeout less than the value provided, +it is silently increased to the value. +The value of zero means no minimum (default). .Pp .El The following diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c index 1c4867cb8185..6010dd4c0451 100644 --- a/lib/libthr/thread/thr_init.c +++ b/lib/libthr/thread/thr_init.c @@ -522,6 +522,17 @@ init_private(void) if (env) _thr_queuefifo = atoi(env); TAILQ_INIT(&_thr_atfork_list); + env = getenv("LIBPTHREAD_UMTX_MIN_TIMEOUT"); + if (env) { + char *endptr; + long mint; + + mint = strtol(env, &endptr, 0); + if (*endptr == '\0' && mint >= 0) { + _umtx_op(NULL, UMTX_OP_SET_MIN_TIMEOUT, + mint, NULL, NULL); + } + } } init_once = 1; } diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index ad54783dd4a9..0e432d6978e6 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -101,7 +101,7 @@ _Static_assert(offsetof(struct proc, p_filemon) == 0x3c8, "struct proc KBI p_filemon"); _Static_assert(offsetof(struct proc, p_comm) == 0x3e0, "struct proc KBI p_comm"); -_Static_assert(offsetof(struct proc, p_emuldata) == 0x4c8, +_Static_assert(offsetof(struct proc, p_emuldata) == 0x4d0, "struct proc KBI p_emuldata"); #endif #ifdef __i386__ @@ -121,7 +121,7 @@ _Static_assert(offsetof(struct proc, p_filemon) == 0x270, "struct proc KBI p_filemon"); _Static_assert(offsetof(struct proc, p_comm) == 0x284, "struct proc KBI p_comm"); -_Static_assert(offsetof(struct proc, p_emuldata) == 0x310, +_Static_assert(offsetof(struct proc, p_emuldata) == 0x318, "struct proc KBI p_emuldata"); #endif diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index 86d644c835c7..92c7de6f2a2c 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -700,6 +700,19 @@ umtx_abs_timeout_init2(struct umtx_abs_timeout *timo, (umtxtime->_flags & UMTX_ABSTIME) != 0, &umtxtime->_timeout); } +static void +umtx_abs_timeout_enforce_min(sbintime_t *sbt) +{ + sbintime_t when, mint; + + mint = curproc->p_umtx_min_timeout; + if (__predict_false(mint != 0)) { + when = sbinuptime() + mint; + if (*sbt < when) + *sbt = when; + } +} + static int umtx_abs_timeout_getsbt(struct umtx_abs_timeout *timo, sbintime_t *sbt, int *flags) @@ -739,6 +752,7 @@ umtx_abs_timeout_getsbt(struct umtx_abs_timeout *timo, sbintime_t *sbt, return (0); } *sbt = bttosbt(bt); + umtx_abs_timeout_enforce_min(sbt); /* * Check if the absolute time should be aligned to @@ -4594,6 +4608,33 @@ __umtx_op_robust_lists(struct thread *td, struct _umtx_op_args *uap, return (0); } +static int +__umtx_op_get_min_timeout(struct thread *td, struct _umtx_op_args *uap, + const struct umtx_copyops *ops) +{ + long val; + int error, val1; + + val = sbttons(td->td_proc->p_umtx_min_timeout); + if (ops->compat32) { + val1 = (int)val; + error = copyout(&val1, uap->uaddr1, sizeof(val1)); + } else { + error = copyout(&val, uap->uaddr1, sizeof(val)); + } + return (error); +} + +static int +__umtx_op_set_min_timeout(struct thread *td, struct _umtx_op_args *uap, + const struct umtx_copyops *ops) +{ + if (uap->val < 0) + return (EINVAL); + td->td_proc->p_umtx_min_timeout = nstosbt(uap->val); + return (0); +} + #if defined(__i386__) || defined(__amd64__) /* * Provide the standard 32-bit definitions for x86, since native/compat32 use a @@ -4816,6 +4857,8 @@ static const _umtx_op_func op_table[] = { [UMTX_OP_SEM2_WAKE] = __umtx_op_sem2_wake, [UMTX_OP_SHM] = __umtx_op_shm, [UMTX_OP_ROBUST_LISTS] = __umtx_op_robust_lists, + [UMTX_OP_GET_MIN_TIMEOUT] = __umtx_op_get_min_timeout, + [UMTX_OP_SET_MIN_TIMEOUT] = __umtx_op_set_min_timeout, }; static const struct umtx_copyops umtx_native_ops = { @@ -4990,6 +5033,8 @@ umtx_exec(struct proc *p) umtx_thread_cleanup(td); td->td_rb_list = td->td_rbp_list = td->td_rb_inact = 0; } + + p->p_umtx_min_timeout = 0; } /* diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 172e716d8785..1292315990b3 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -741,6 +741,7 @@ struct proc { uint64_t p_elf_flags; /* (x) ELF flags */ void *p_elf_brandinfo; /* (x) Elf_Brandinfo, NULL for non ELF binaries. */ + sbintime_t p_umtx_min_timeout; /* End area that is copied on creation. */ #define p_endcopy p_xexit diff --git a/sys/sys/umtx.h b/sys/sys/umtx.h index 82a8e0e4b0f0..ddd3bd387099 100644 --- a/sys/sys/umtx.h +++ b/sys/sys/umtx.h @@ -103,6 +103,8 @@ #define UMTX_OP_SEM2_WAKE 24 #define UMTX_OP_SHM 25 #define UMTX_OP_ROBUST_LISTS 26 +#define UMTX_OP_GET_MIN_TIMEOUT 27 +#define UMTX_OP_SET_MIN_TIMEOUT 28 /* * Flags for ops; the double-underbar convention must be maintained for future