summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordchagin <dchagin@FreeBSD.org>2016-01-09 14:47:08 +0000
committerdchagin <dchagin@FreeBSD.org>2016-01-09 14:47:08 +0000
commit31e61f67492a11c512c20a8287816fab97f9e44b (patch)
treef4dbafaa603bb145f9138f3bddb7d9f5f211ac70
parent65d490113d4e8fad5cc1981ca0da891aa7516c0a (diff)
downloadFreeBSD-src-31e61f67492a11c512c20a8287816fab97f9e44b.zip
FreeBSD-src-31e61f67492a11c512c20a8287816fab97f9e44b.tar.gz
MFC r283379:
Implement a Linux version of sched_getparam() && sched_setparam(). Temporarily use the first thread in proc.
-rw-r--r--sys/amd64/linux32/syscalls.master8
-rw-r--r--sys/compat/linux/linux_misc.c72
-rw-r--r--sys/i386/linux/syscalls.master8
3 files changed, 80 insertions, 8 deletions
diff --git a/sys/amd64/linux32/syscalls.master b/sys/amd64/linux32/syscalls.master
index f7faa45..7d3c11b 100644
--- a/sys/amd64/linux32/syscalls.master
+++ b/sys/amd64/linux32/syscalls.master
@@ -267,10 +267,10 @@
151 AUE_MUNLOCK NOPROTO { int munlock(const void *addr, size_t len); }
152 AUE_MLOCKALL NOPROTO { int mlockall(int how); }
153 AUE_MUNLOCKALL NOPROTO { int munlockall(void); }
-154 AUE_SCHED_SETPARAM NOPROTO { int sched_setparam(pid_t pid, \
- const struct sched_param *param); }
-155 AUE_SCHED_GETPARAM NOPROTO { int sched_getparam(pid_t pid, \
- struct sched_param *param); }
+154 AUE_SCHED_SETPARAM STD { int linux_sched_setparam(l_pid_t pid, \
+ struct l_sched_param *param); }
+155 AUE_SCHED_GETPARAM STD { int linux_sched_getparam(l_pid_t pid, \
+ struct l_sched_param *param); }
156 AUE_SCHED_SETSCHEDULER STD { int linux_sched_setscheduler( \
l_pid_t pid, l_int policy, \
struct l_sched_param *param); }
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index cb6c038..f6e6d96 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -1871,6 +1871,78 @@ linux_prctl(struct thread *td, struct linux_prctl_args *args)
return (error);
}
+int
+linux_sched_setparam(struct thread *td,
+ struct linux_sched_setparam_args *uap)
+{
+ struct sched_param sched_param;
+ struct thread *tdt;
+ struct proc *p;
+ int error;
+
+#ifdef DEBUG
+ if (ldebug(sched_setparam))
+ printf(ARGS(sched_setparam, "%d, *"), uap->pid);
+#endif
+
+ error = copyin(uap->param, &sched_param, sizeof(sched_param));
+ if (error)
+ return (error);
+
+ if (uap->pid == 0) {
+ tdt = td;
+ p = tdt->td_proc;
+ PROC_LOCK(p);
+ } else {
+ p = pfind(uap->pid);
+ if (p == NULL)
+ return (ESRCH);
+ /*
+ * XXX. Scheduling parameters are in fact per-thread
+ * attributes in Linux. Temporarily use the first
+ * thread in proc. The same for get_param().
+ */
+ tdt = FIRST_THREAD_IN_PROC(p);
+ }
+
+ error = kern_sched_setparam(td, tdt, &sched_param);
+ PROC_UNLOCK(p);
+ return (error);
+}
+
+int
+linux_sched_getparam(struct thread *td,
+ struct linux_sched_getparam_args *uap)
+{
+ struct sched_param sched_param;
+ struct thread *tdt;
+ struct proc *p;
+ int error;
+
+#ifdef DEBUG
+ if (ldebug(sched_getparam))
+ printf(ARGS(sched_getparam, "%d, *"), uap->pid);
+#endif
+
+ if (uap->pid == 0) {
+ tdt = td;
+ p = tdt->td_proc;
+ PROC_LOCK(p);
+ } else {
+ p = pfind(uap->pid);
+ if (p == NULL)
+ return (ESRCH);
+ tdt = FIRST_THREAD_IN_PROC(p);
+ }
+
+ error = kern_sched_getparam(td, tdt, &sched_param);
+ PROC_UNLOCK(p);
+ if (error == 0)
+ error = copyout(&sched_param, uap->param,
+ sizeof(sched_param));
+ return (error);
+}
+
/*
* Get affinity of a process.
*/
diff --git a/sys/i386/linux/syscalls.master b/sys/i386/linux/syscalls.master
index 4de3487..b5e1706 100644
--- a/sys/i386/linux/syscalls.master
+++ b/sys/i386/linux/syscalls.master
@@ -269,10 +269,10 @@
151 AUE_MUNLOCK NOPROTO { int munlock(const void *addr, size_t len); }
152 AUE_MLOCKALL NOPROTO { int mlockall(int how); }
153 AUE_MUNLOCKALL NOPROTO { int munlockall(void); }
-154 AUE_SCHED_SETPARAM NOPROTO { int sched_setparam(pid_t pid, \
- const struct sched_param *param); }
-155 AUE_SCHED_GETPARAM NOPROTO { int sched_getparam(pid_t pid, \
- struct sched_param *param); }
+154 AUE_SCHED_SETPARAM STD { int linux_sched_setparam(l_pid_t pid, \
+ struct l_sched_param *param); }
+155 AUE_SCHED_GETPARAM STD { int linux_sched_getparam(l_pid_t pid, \
+ struct l_sched_param *param); }
156 AUE_SCHED_SETSCHEDULER STD { int linux_sched_setscheduler( \
l_pid_t pid, l_int policy, \
struct l_sched_param *param); }
OpenPOWER on IntegriCloud