From nobody Mon Oct 19 20:27:42 2026 X-Original-To: dev-commits-src-all@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 4j7nD35LXrz6wKvC for ; Mon, 19 Oct 2026 20:27:47 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4j7nD34gXYz3RC6 for ; Mon, 19 Oct 2026 20:27:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792441667; 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=jA2MrfLxvAuarrGXkDve00ZQbqbaoMqSsD8ezcyc2gI=; b=hxbqXP/tphvDuzUowrBYRuZiS19FXM7r0NoN18L4bXUkiNTzNbV8Aigo6rKd1zEjrqAAl8 opyIBEMA/SXufifWyXJEjxSP5ghhtMH1SX/7+f/5Wvjqqy1N7CPaxlLIurK2egG4rp+Vqi +vzktowWyuaWFc+zHRlpoCQ9QxgFXmm3GK+QQB59wUOs6zR588fAnmueX2jZ6KW7PrPUZt Bz30xcjRqqWTNOfPZrmZoHkWXVBoBnhJRgmgRR8Y6XMDgD4oWNGG1OwBMAlUSC1gE9T7eF fzmn+6E6hIJiY4p3dy71O78L+VRw2TO4xMCp8zFdCdZWMZpkLhIjFTSg+LPayg== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792441667; b=ifOGKTVWfBwxKzYuL63VmOzlYuj5qgKUPKyNP1C4wsQnLk4x1g19LzjfbMzetYdQDxsK+/ fEK4F1AfFuhKBzrLWkMbAZ2XgayO74UfxPAmjYdAay/yofFJWuGyTxljYjzpF4g4XQeiJI QnNvIOs8wV+ThQChtqs8kpxghP2MwYUEst3PZG0UwrOvEkWKyif9Ivc2NLuKdip6xkKHl5 5J99Y+6MG64xqGXZSHByFEk4q5qFmFCKe1qEw6it9DcSBqj+W+F+efbO5JJWFWTHkUfBoT l02qbBNScclXmphRk50+5GoTTBXlZckLv7J5iMdxEPOjipBxvi/xvVTitX0LIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792441667; 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=jA2MrfLxvAuarrGXkDve00ZQbqbaoMqSsD8ezcyc2gI=; b=snXe1U6FPa4DMCTOVCoFvrz8ku2YrjhJZ5ItSH7ZM3K6TXoiRokXlE1PE5ZRbQAT1uR6ZJ 3rd4VWjNXeCkvbrrea1vNM4R9CcdtkAYRF2nMZHLP3pHU/83ACzmg5ubVxQIx4Lh9QMk5q ZZtAkRV1jYL2jT1U57ARTpRykE68dP23Yct01sT4NtO2peVjVkLNeAjFfniGTChLoUZpqX 4tKBSIO/JKwJ+dg2FhLrkH+xxTxTBVO7u5jTa8twL8a5oaAs0OtZmYTRZaE+hutyKM4oiQ ZVhdH9lh7awVOVPidiZ3KYFUfygb02GB4tpvnQzwXlXT3w+LMEBzzst0AlRB3Q== 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 4j7nD33qMvzcpc for ; Mon, 19 Oct 2026 20:27:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3c947 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 19 Oct 2026 20:27:42 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Enji Cooper Subject: git: e45c7bc6115e - main - linux: implement sched_getattr() List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: Commit messages for all branches of the src repository 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: e45c7bc6115ef3cd9567a397e1351c608c0269a7 Auto-Submitted: auto-generated Date: Mon, 19 Oct 2026 20:27:42 +0000 Message-Id: <6ad67d3e.3c947.3a2c5ad1@gitrepo.freebsd.org> The branch main has been updated by ngie: URL: https://cgit.FreeBSD.org/src/commit/?id=e45c7bc6115ef3cd9567a397e1351c608c0269a7 commit e45c7bc6115ef3cd9567a397e1351c608c0269a7 Author: Enji Cooper AuthorDate: 2026-10-10 18:18:23 +0000 Commit: Enji Cooper CommitDate: 2026-10-19 20:27:24 +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. Please note that this change does not fill in the `.sched_nice` property: this will be handled in a follow up commit (see bug 299617 for more details). This unbreaks using the Linux version of Chromium on FreeBSD. PR: 297468 Signed-off-by: Joao Bonifacio Pull Request: https://github.com/freebsd/freebsd-src/pull/2370 Reviewed by: olce Differential Revision: https://reviews.freebsd.org/D60214 --- sys/compat/linux/linux_dummy.c | 1 - sys/compat/linux/linux_misc.c | 112 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-) 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..e9441a31e8ac 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,41 @@ 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 bsd_sched_policy_to_linux_sched_policy(int); + static int linux_utimensat_lts_to_ts(struct l_timespec *, struct timespec *); #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) @@ -1350,6 +1386,82 @@ linux_sched_getscheduler(struct thread *td, return (error); } +static int +bsd_sched_policy_to_linux_sched_policy(int bsd_policy) +{ + + switch (bsd_policy) { + case SCHED_FIFO: + return (LINUX_SCHED_FIFO); + case SCHED_RR: + return (LINUX_SCHED_RR); + case SCHED_OTHER: + /* FALLTHROUGH */ + default: + return (LINUX_SCHED_OTHER); + } +} + +int +linux_sched_getattr(struct thread *td, struct linux_sched_getattr_args *args) +{ + struct linux_sched_attr lattr; + struct sched_param bsd; + 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 != 0) { + PROC_UNLOCK(tdt->td_proc); + return (error); + } + + error = kern_sched_getparam(td, tdt, &bsd); + PROC_UNLOCK(tdt->td_proc); + if (error != 0) + return (error); + + memset(&lattr, 0, sizeof(lattr)); + lattr.size = MIN(args->size, sizeof(lattr)); + lattr.sched_policy = bsd_sched_policy_to_linux_sched_policy(policy); + /* + * TODO(PR#299617,ngie): fill in `.sched_nice` with policies like + * `LINUX_SCHED_NORMAL`, etc. + */ + + if (linux_map_sched_prio) { + switch (lattr.sched_policy) { + case LINUX_SCHED_OTHER: + lattr.sched_priority = 0; + break; + case LINUX_SCHED_FIFO: + case LINUX_SCHED_RR: + /** + * Map [0, RTP_PRIO_MAX - RTP_PRIO_MIN] to + * [1, LINUX_MAX_RT_PRIO - 1] (rounding up). + */ + lattr.sched_priority = + (bsd.sched_priority * + (LINUX_MAX_RT_PRIO - 1) + + (RTP_PRIO_MAX - RTP_PRIO_MIN - 1)) / + (RTP_PRIO_MAX - RTP_PRIO_MIN) + 1; + break; + } + } else { + lattr.sched_priority = bsd.sched_priority; + } + + return (copyout(&lattr, args->attr, lattr.size)); +} + int linux_sched_get_priority_max(struct thread *td, struct linux_sched_get_priority_max_args *args)