Re: svn commit: r358483 - head/sys/compat/linux
On Thu, 5 Mar 2020 16:15:10 +0300 Yuri Pankov wrote: > Tijl Coosemans wrote: >> Author: tijl >> Date: Sun Mar 1 13:12:04 2020 >> New Revision: 358483 >> URL: https://svnweb.freebsd.org/changeset/base/358483 >> >> Log: >>linuxulator: Map scheduler priorities to Linux priorities. >> >>On Linux the valid range of priorities for the SCHED_FIFO and SCHED_RR >>scheduling policies is [1,99]. For SCHED_OTHER the single valid priority >> is >>0. On FreeBSD it is [0,31] for all policies. Programs are supposed to >>query the valid range using sched_get_priority_(min|max), but of course >> some >>programs assume the Linux values are valid. >> >>This commit adds a tunable compat.linux.map_sched_prio. When enabled >>sched_get_priority_(min|max) return the Linux values and >> sched_setscheduler >>and sched_(get|set)param translate between FreeBSD and Linux values. >> >>Because there are more Linux levels than FreeBSD levels, multiple Linux >>levels map to a single FreeBSD level, which means pre-emption might not >>happen as it does on Linux, so the tunable allows to disable this >> behaviour. >>It is enabled by default because I think it is unlikely that anyone runs >>real-time software under Linux emulation on FreeBSD that critically relies >>on correct pre-emption. >> >>This fixes FMOD, a commercial sound library used by several games. >> >>PR: 240043 >>Tested by:Alex S >>Reviewed by: dchagin >>MFC after:2 weeks >>Differential Revision:https://reviews.freebsd.org/D23790 >> >> Modified: >>head/sys/compat/linux/linux_misc.c >>head/sys/compat/linux/linux_misc.h >> >> Modified: head/sys/compat/linux/linux_misc.c >> == >> --- head/sys/compat/linux/linux_misc.c Sun Mar 1 12:34:27 2020 >> (r358482) >> +++ head/sys/compat/linux/linux_misc.c Sun Mar 1 13:12:04 2020 >> (r358483) >> @@ -144,6 +144,11 @@ struct l_pselect6arg { >> l_size_tss_len; >> }; >> >> +static bool map_sched_prio = true; >> +SYSCTL_BOOL(_compat_linux, OID_AUTO, map_sched_prio, CTLFLAG_RDTUN, >> +&map_sched_prio, 0, "Map scheduler priorities to Linux priorities " >> +"(not POSIX compliant)"); > > I'm seeing the following in the log: > > sysctl_warn_reuse: can't re-use a leaf (compat.linux.map_sched_prio)! > > Should this be done for both linux and linux32 (when one exists) or made > to install one time only? Ah, thanks for the report, I've moved it to linux_common in r358673. ___ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"
Re: svn commit: r358483 - head/sys/compat/linux
Tijl Coosemans wrote: Author: tijl Date: Sun Mar 1 13:12:04 2020 New Revision: 358483 URL: https://svnweb.freebsd.org/changeset/base/358483 Log: linuxulator: Map scheduler priorities to Linux priorities. On Linux the valid range of priorities for the SCHED_FIFO and SCHED_RR scheduling policies is [1,99]. For SCHED_OTHER the single valid priority is 0. On FreeBSD it is [0,31] for all policies. Programs are supposed to query the valid range using sched_get_priority_(min|max), but of course some programs assume the Linux values are valid. This commit adds a tunable compat.linux.map_sched_prio. When enabled sched_get_priority_(min|max) return the Linux values and sched_setscheduler and sched_(get|set)param translate between FreeBSD and Linux values. Because there are more Linux levels than FreeBSD levels, multiple Linux levels map to a single FreeBSD level, which means pre-emption might not happen as it does on Linux, so the tunable allows to disable this behaviour. It is enabled by default because I think it is unlikely that anyone runs real-time software under Linux emulation on FreeBSD that critically relies on correct pre-emption. This fixes FMOD, a commercial sound library used by several games. PR: 240043 Tested by: Alex S Reviewed by: dchagin MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D23790 Modified: head/sys/compat/linux/linux_misc.c head/sys/compat/linux/linux_misc.h Modified: head/sys/compat/linux/linux_misc.c == --- head/sys/compat/linux/linux_misc.c Sun Mar 1 12:34:27 2020 (r358482) +++ head/sys/compat/linux/linux_misc.c Sun Mar 1 13:12:04 2020 (r358483) @@ -144,6 +144,11 @@ struct l_pselect6arg { l_size_tss_len; }; +static bool map_sched_prio = true; +SYSCTL_BOOL(_compat_linux, OID_AUTO, map_sched_prio, CTLFLAG_RDTUN, +&map_sched_prio, 0, "Map scheduler priorities to Linux priorities " +"(not POSIX compliant)"); I'm seeing the following in the log: sysctl_warn_reuse: can't re-use a leaf (compat.linux.map_sched_prio)! Should this be done for both linux and linux32 (when one exists) or made to install one time only? ___ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"
svn commit: r358483 - head/sys/compat/linux
Author: tijl Date: Sun Mar 1 13:12:04 2020 New Revision: 358483 URL: https://svnweb.freebsd.org/changeset/base/358483 Log: linuxulator: Map scheduler priorities to Linux priorities. On Linux the valid range of priorities for the SCHED_FIFO and SCHED_RR scheduling policies is [1,99]. For SCHED_OTHER the single valid priority is 0. On FreeBSD it is [0,31] for all policies. Programs are supposed to query the valid range using sched_get_priority_(min|max), but of course some programs assume the Linux values are valid. This commit adds a tunable compat.linux.map_sched_prio. When enabled sched_get_priority_(min|max) return the Linux values and sched_setscheduler and sched_(get|set)param translate between FreeBSD and Linux values. Because there are more Linux levels than FreeBSD levels, multiple Linux levels map to a single FreeBSD level, which means pre-emption might not happen as it does on Linux, so the tunable allows to disable this behaviour. It is enabled by default because I think it is unlikely that anyone runs real-time software under Linux emulation on FreeBSD that critically relies on correct pre-emption. This fixes FMOD, a commercial sound library used by several games. PR: 240043 Tested by:Alex S Reviewed by: dchagin MFC after:2 weeks Differential Revision:https://reviews.freebsd.org/D23790 Modified: head/sys/compat/linux/linux_misc.c head/sys/compat/linux/linux_misc.h Modified: head/sys/compat/linux/linux_misc.c == --- head/sys/compat/linux/linux_misc.c Sun Mar 1 12:34:27 2020 (r358482) +++ head/sys/compat/linux/linux_misc.c Sun Mar 1 13:12:04 2020 (r358483) @@ -144,6 +144,11 @@ struct l_pselect6arg { l_size_tss_len; }; +static bool map_sched_prio = true; +SYSCTL_BOOL(_compat_linux, OID_AUTO, map_sched_prio, CTLFLAG_RDTUN, +&map_sched_prio, 0, "Map scheduler priorities to Linux priorities " +"(not POSIX compliant)"); + static int linux_utimensat_nsec_valid(l_long); @@ -1419,6 +1424,33 @@ linux_sched_setscheduler(struct thread *td, if (error) return (error); + if (map_sched_prio) { + switch (policy) { + case SCHED_OTHER: + if (sched_param.sched_priority != 0) + return (EINVAL); + + sched_param.sched_priority = + PRI_MAX_TIMESHARE - PRI_MIN_TIMESHARE; + break; + case SCHED_FIFO: + case SCHED_RR: + if (sched_param.sched_priority < 1 || + sched_param.sched_priority >= LINUX_MAX_RT_PRIO) + return (EINVAL); + + /* +* Map [1, LINUX_MAX_RT_PRIO - 1] to +* [0, RTP_PRIO_MAX - RTP_PRIO_MIN] (rounding down). +*/ + sched_param.sched_priority = + (sched_param.sched_priority - 1) * + (RTP_PRIO_MAX - RTP_PRIO_MIN + 1) / + (LINUX_MAX_RT_PRIO - 1); + break; + } + } + tdt = linux_tdfind(td, args->pid, -1); if (tdt == NULL) return (ESRCH); @@ -1462,6 +1494,20 @@ linux_sched_get_priority_max(struct thread *td, { struct sched_get_priority_max_args bsd; + if (map_sched_prio) { + switch (args->policy) { + case LINUX_SCHED_OTHER: + td->td_retval[0] = 0; + return (0); + case LINUX_SCHED_FIFO: + case LINUX_SCHED_RR: + td->td_retval[0] = LINUX_MAX_RT_PRIO - 1; + return (0); + default: + return (EINVAL); + } + } + switch (args->policy) { case LINUX_SCHED_OTHER: bsd.policy = SCHED_OTHER; @@ -1484,6 +1530,20 @@ linux_sched_get_priority_min(struct thread *td, { struct sched_get_priority_min_args bsd; + if (map_sched_prio) { + switch (args->policy) { + case LINUX_SCHED_OTHER: + td->td_retval[0] = 0; + return (0); + case LINUX_SCHED_FIFO: + case LINUX_SCHED_RR: + td->td_retval[0] = 1; + return (0); + default: + return (EINVAL); + } + } + switch (args->policy) { case LINUX_SCHED_OTHER: bsd.policy = SCHED_OTHER; @@ -1864,7 +1924,7 @@ linux_sched_setparam(struct thread *td, { struct sched_param sched_param; struct thread *tdt; - int error; + int err