Implement a Linux version of sched_getparam() && sched_setparam().

Temporarily use the first thread in proc.

Differential Revision:	https://reviews.freebsd.org/D1036
Reviewed by:	trasz
This commit is contained in:
Dmitry Chagin 2015-05-24 14:45:57 +00:00
parent 111c86e3d1
commit 2003907d45
3 changed files with 80 additions and 8 deletions

View File

@ -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); }

View File

@ -1873,6 +1873,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.
*/

View File

@ -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); }