Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F174391009
D60214.id188451.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D60214.id188451.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D60214: linux: implement sched_getattr()
Attached
Detach File
Event Timeline
Log In to Comment