Page MenuHomeFreeBSD

D60214.id188451.diff
No OneTemporary

D60214.id188451.diff

diff --git a/sys/compat/linux/linux_dummy.c b/sys/compat/linux/linux_dummy.c
--- a/sys/compat/linux/linux_dummy.c
+++ b/sys/compat/linux/linux_dummy.c
@@ -97,7 +97,6 @@
/* 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.h b/sys/compat/linux/linux_misc.h
--- a/sys/compat/linux/linux_misc.h
+++ b/sys/compat/linux/linux_misc.h
@@ -109,10 +109,26 @@
#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 just here for reference.
+ */
+#if 0
+/* LINUX_SCHED_ISO: slot reserved, but not implemented upstream. */
+#define LINUX_SCHED_IDLE 5
+#define LINUX_SCHED_DEADLINE 6
+#define LINUX_SCHED_EXT 7
+#endif
#define LINUX_MAX_RT_PRIO 100
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
--- 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 <sys/cdefs.h>
#include <sys/param.h>
#include <sys/fcntl.h>
#include <sys/jail.h>
@@ -116,6 +117,39 @@
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 @@
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)

File Metadata

Mime Type
text/plain
Expires
Sat, Oct 3, 9:09 PM (21 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40142049
Default Alt Text
D60214.id188451.diff (3 KB)

Event Timeline