From nobody Mon Oct 05 22:49:29 2026 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 4hzF2141Lwz6vXsl for ; Mon, 05 Oct 2026 22:49:29 +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 "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hzF213W1Pz3LGG for ; Mon, 05 Oct 2026 22:49:29 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791240569; 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=lRebtpZCFAzMSEwnSEx091yYr5KHL3dwHX+0X9yXW/Q=; b=rRgI6NO/go0mOXMrkYQEr7zgAJBOGY1ek9X/MrAAh9WQnOGPjAmVLMKJPfKKo878dOgS/B 0rnUCegBiVUs7Gi7XOmlYXa17npM79DK8GxOXQqQepi8hMGtF1QuYGmSRAyt1RxxD4POPZ T2xVZWBmX3+afHzzn/DN0ksY5isAcKXKMwh0JvxxvlF0+AQCoul+KyWh0KNNW+V2s7ayKj cxW6wlKdKSfYnGkQ06Z56xlkXVPu/PWtfhlG1rrelZWzp9zYjfl4e/HKKIfQ5rxBBLvn2x 1TruY/dC+RmPxoNd1ppo3DRxUNNq11RkiHZMpcRSsmmLfu8vDxb3ini1Xyoz5A== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1791240569; b=Z3SbYCFghDMsyLPqcMssc2Xuazfl3ijx9m3yqDGDFFUwMlCqbjSfXIJdkm4RyD+ywXi1E5 NLegm0A2Rqp92wfAASq/YjBkkK+y8f8d59AbD0FhqLQrkcL8rXA2s91bsBEyl3eJTH7n3Q Lfs3uxZxNxmYW5X5NqhInZ9xxWYUUshdwg2jgQokY3YAJlYmyUWOMs2c+lyQ88+yhCgEMJ D0juWa1Gh/W7B2ScWvNbbOOdyQGWUGpLbpvXWZLRRB56aa7idMqpg4XZaBTvUaNWjA5Bd6 bcRqnjE8u8pOwnsHRm4e1I+xo8mGsh80ImWUsA828J11jCGGaO66c7vqgjLMjA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791240569; 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=lRebtpZCFAzMSEwnSEx091yYr5KHL3dwHX+0X9yXW/Q=; b=jsY4LFRP/oxE2BHHfgYasj9bWJgb+e/zoCTmHKThE6tLFsyJSY9Q/0Ti2NmAlzJvyQvzcf HA9qqn0z20GE9W1WFIBvDcaCnA7t1YubnJICqdFswr9+Ch+3OBSoZtwbvzSG8HU88bpesl 39FhhcjT/Z6m3Hi6CShpt14UQB5wmpX4kwh1olh2zOvBw5EQG9H3SO8ZeeFH9HQJelNJkC rK2SgDDgL4YPtsprIRQG42q8DO0ZUl64XvGLh+05RcOoa54Bx2AM+0EPPbwgCTiC+uIyvo 0z/aQIpk7kjd9dMiRfkUTn6yJFsdFx3E3KyKxoGC/Y8zQTcSIcRGy/Rmt7nh6w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hzF212ZW9zh20 for ; Mon, 05 Oct 2026 22:49:29 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 2608d by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 05 Oct 2026 22:49:29 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Enji Cooper Subject: git: bb5f10e51bd5 - main - linux: implement sched_getattr() 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: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: ngie X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: bb5f10e51bd53771f1a438f36f554256fcbd7d08 Auto-Submitted: auto-generated Date: Mon, 05 Oct 2026 22:49:29 +0000 Message-Id: <6ac42979.2608d.d368a5e@gitrepo.freebsd.org> The branch main has been updated by ngie: URL: https://cgit.FreeBSD.org/src/commit/?id=bb5f10e51bd53771f1a438f36f554256fcbd7d08 commit bb5f10e51bd53771f1a438f36f554256fcbd7d08 Author: Enji Cooper AuthorDate: 2026-10-05 22:48:22 +0000 Commit: Enji Cooper CommitDate: 2026-10-05 22:49:09 +0000 linux: implement sched_getattr() This change adds the necessary glue to translate Linux scheduler policy and priority from FreeBSD so this information is available to Linux applications. This unbreaks using the Linux version of Chromium on FreeBSD. This change was originally submitted via [freebsd/freebsd-src#2370][github-pr]. MFC after: 2 weeks PR: 297468 Co-Authored-By: Enji Cooper Signed-off-by: Joao Bonifacio [github-pr]: https://github.com/freebsd/freebsd-src/pull/2370 Differential Revision: https://reviews.freebsd.org/D60214 --- sys/compat/linux/linux_dummy.c | 1 - sys/compat/linux/linux_misc.c | 89 ++++++++++++++++++++++++++++++++++++++++++ sys/compat/linux/linux_misc.h | 19 ++++++++- 3 files changed, 106 insertions(+), 3 deletions(-) diff --git a/sys/compat/linux/linux_dummy.c b/sys/compat/linux/linux_dummy.c index dfb1c90e9abf..873e2cef3879 100644 --- a/sys/compat/linux/linux_dummy.c +++ b/sys/compat/linux/linux_dummy.c @@ -97,7 +97,6 @@ DUMMY(process_vm_writev); /* Linux 3.8: */ DUMMY(finit_module); DUMMY(sched_setattr); -DUMMY(sched_getattr); /* Linux 3.18: */ DUMMY(bpf); /* Linux 3.19: */ diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index 65c9044dd3bd..9e7f6411df17 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -29,6 +29,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include @@ -116,6 +117,39 @@ struct l_pselect6arg { l_size_t ss_len; }; +/** + * `SCHED_ATTR_SIZE_VER0` represents the size of the initial published structure. + * + * See `linux/kernel/sched/syscalls.c` for more details. + */ +#define LINUX_SCHED_ATTR_SIZE_VER0 48 +/** + * Linux struct sched_attr + */ +struct linux_sched_attr { + l_uint size; + l_uint sched_policy; + uint64_t sched_flags; + int32_t sched_nice; + l_uint sched_priority; + + uint64_t sched_runtime; + uint64_t sched_deadline; + uint64_t sched_period; + + l_uint sched_util_min; + l_uint sched_util_max; +}; +/** + * `.size` must be checked at runtime as well in the syscall to match the + * Linux implementation. + * + * This `_Static_assert(..)` is a sanity check to ensure that the structure + * meets the minimum expected bar. + */ +_Static_assert(sizeof(struct linux_sched_attr) >= LINUX_SCHED_ATTR_SIZE_VER0, + "struct linux_sched_attr size"); + static int linux_utimensat_lts_to_ts(struct l_timespec *, struct timespec *); #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) @@ -1350,6 +1384,61 @@ linux_sched_getscheduler(struct thread *td, return (error); } +int +linux_sched_getattr(struct thread *td, struct linux_sched_getattr_args *args) +{ + struct linux_sched_attr attr; + struct sched_param sched_param; + struct thread *tdt; + int error, policy; + + if (args->attr == NULL || args->pid < 0 || args->flags != 0 || + args->size < LINUX_SCHED_ATTR_SIZE_VER0 || args->size > PAGE_SIZE) + return (EINVAL); + + tdt = linux_tdfind(td, args->pid, -1); + if (tdt == NULL) + return (ESRCH); + + error = kern_sched_getscheduler(td, tdt, &policy); + if (error) { + PROC_UNLOCK(tdt->td_proc); + return (error); + } + + error = kern_sched_getparam(td, tdt, &sched_param); + PROC_UNLOCK(tdt->td_proc); + if (error) + return (error); + + memset(&attr, 0, sizeof(attr)); + + attr.size = MIN(args->size, sizeof(attr)); + + if (linux_map_sched_prio) { + switch (policy) { + case SCHED_OTHER: + sched_param.sched_priority = 0; + break; + case SCHED_FIFO: + case SCHED_RR: + /** + * Map [0, RTP_PRIO_MAX - RTP_PRIO_MIN] to + * [1, LINUX_MAX_RT_PRIO - 1] (rounding up). + */ + sched_param.sched_priority = + (sched_param.sched_priority * + (LINUX_MAX_RT_PRIO - 1) + + (RTP_PRIO_MAX - RTP_PRIO_MIN - 1)) / + (RTP_PRIO_MAX - RTP_PRIO_MIN) + 1; + break; + } + } + attr.sched_priority = sched_param.sched_priority; + + return (copyout(&attr, args->attr, args->size)); +} + int linux_sched_get_priority_max(struct thread *td, struct linux_sched_get_priority_max_args *args) diff --git a/sys/compat/linux/linux_misc.h b/sys/compat/linux/linux_misc.h index fb77784ddea8..44dd8e06fcb7 100644 --- a/sys/compat/linux/linux_misc.h +++ b/sys/compat/linux/linux_misc.h @@ -109,10 +109,25 @@ #define __LINUX_NPXCW__ 0x37f #endif -/* Scheduling policies */ -#define LINUX_SCHED_OTHER 0 +/** + * Linux scheduling policies. + * + * Ref: `linux/include/uapi/linux/sched.h` + */ +#define LINUX_SCHED_NORMAL 0 +/* `SCHED_OTHER` is a legacy alias for `SCHED_NORMAL`. */ +#define LINUX_SCHED_OTHER LINUX_SCHED_NORMAL #define LINUX_SCHED_FIFO 1 #define LINUX_SCHED_RR 2 +/** + * FreeBSD does not implement analogs for these Linux scheduling policies. This + * is mostly here for reference and to be self-documenting in `sched_set*()`. + */ +#define LINUX_SCHED_BATCH 3 +/* LINUX_SCHED_ISO: slot reserved, but not implemented upstream. */ +#define LINUX_SCHED_IDLE 5 +#define LINUX_SCHED_DEADLINE 6 +#define LINUX_SCHED_EXT 7 #define LINUX_MAX_RT_PRIO 100