Index: sys/kern/p1003_1b.c =================================================================== --- sys/kern/p1003_1b.c +++ sys/kern/p1003_1b.c @@ -112,12 +112,12 @@ { struct thread *targettd; struct proc *targetp; - int e; + int error; struct sched_param sched_param; - e = copyin(uap->param, &sched_param, sizeof(sched_param)); - if (e) - return (e); + error = copyin(uap->param, &sched_param, sizeof(sched_param)); + if (error) + return (error); if (uap->pid == 0) { targetp = td->td_proc; @@ -130,19 +130,30 @@ targettd = FIRST_THREAD_IN_PROC(targetp); } - e = p_cansched(td, targetp); - if (e == 0) { - e = ksched_setparam(ksched, targettd, - (const struct sched_param *)&sched_param); - } + return (kern_sched_setparam(td, targettd, &sched_param)); +} + +int +kern_sched_setparam(struct thread *td, struct thread *targettd, + struct sched_param *param) +{ + struct proc *targetp; + int error; + + targetp = targettd->td_proc; + PROC_LOCK_ASSERT(targetp, MA_OWNED); + + error = p_cansched(td, targetp); + if (error == 0) + error = ksched_setparam(ksched, targettd, param); PROC_UNLOCK(targetp); - return (e); + return (error); } int sys_sched_getparam(struct thread *td, struct sched_getparam_args *uap) { - int e; + int error; struct sched_param sched_param; struct thread *targettd; struct proc *targetp; @@ -159,32 +170,40 @@ targettd = FIRST_THREAD_IN_PROC(targetp); } - e = p_cansee(td, targetp); - if (e == 0) { - e = ksched_getparam(ksched, targettd, &sched_param); - } + error = kern_sched_getparam(td, targettd, &sched_param); + if (error == 0) + error = copyout(&sched_param, uap->param, sizeof(sched_param)); + return (error); +} + +int +kern_sched_getparam(struct thread *td, struct thread *targettd, + struct sched_param *param) +{ + struct proc *targetp; + int error; + + targetp = targettd->td_proc; + PROC_LOCK_ASSERT(targetp, MA_OWNED); + + error = p_cansee(td, targetp); + if (error == 0) + error = ksched_getparam(ksched, targettd, param); PROC_UNLOCK(targetp); - if (e == 0) - e = copyout(&sched_param, uap->param, sizeof(sched_param)); - return (e); + return (error); } int sys_sched_setscheduler(struct thread *td, struct sched_setscheduler_args *uap) { - int e; + int error; struct sched_param sched_param; struct thread *targettd; struct proc *targetp; - /* Don't allow non root user to set a scheduler policy. */ - e = priv_check(td, PRIV_SCHED_SET); - if (e) - return (e); - - e = copyin(uap->param, &sched_param, sizeof(sched_param)); - if (e) - return (e); + error = copyin(uap->param, &sched_param, sizeof(sched_param)); + if (error) + return (error); if (uap->pid == 0) { targetp = td->td_proc; @@ -197,19 +216,39 @@ targettd = FIRST_THREAD_IN_PROC(targetp); } - e = p_cansched(td, targetp); - if (e == 0) { - e = ksched_setscheduler(ksched, targettd, - uap->policy, (const struct sched_param *)&sched_param); + return (kern_sched_setscheduler(td, targettd, uap->policy, + &sched_param)); +} + +int +kern_sched_setscheduler(struct thread *td, struct thread *targettd, + int policy, struct sched_param *param) +{ + struct proc *targetp; + int error; + + targetp = targettd->td_proc; + PROC_LOCK_ASSERT(targetp, MA_OWNED); + + /* Don't allow non root user to set a scheduler policy. */ + error = priv_check(td, PRIV_SCHED_SET); + if (error) { + PROC_UNLOCK(targetp); + return (error); } + + error = p_cansched(td, targetp); + if (error == 0) + error = ksched_setscheduler(ksched, targettd, policy, + param); PROC_UNLOCK(targetp); - return (e); + return (error); } int sys_sched_getscheduler(struct thread *td, struct sched_getscheduler_args *uap) { - int e, policy; + int error, policy; struct thread *targettd; struct proc *targetp; @@ -224,14 +263,29 @@ targettd = FIRST_THREAD_IN_PROC(targetp); } - e = p_cansee(td, targetp); - if (e == 0) { - e = ksched_getscheduler(ksched, targettd, &policy); + error = kern_sched_getscheduler(td, targettd, &policy); + if (error == 0) td->td_retval[0] = policy; - } + + return (error); +} + +int +kern_sched_getscheduler(struct thread *td, struct thread *targettd, + int *policy) +{ + struct proc *targetp; + int error; + + targetp = td->td_proc; + PROC_LOCK_ASSERT(targetp, MA_OWNED); + + error = p_cansee(td, targetp); + if (error == 0) + error = ksched_getscheduler(ksched, targettd, policy); PROC_UNLOCK(targetp); - return (e); + return (error); } int Index: sys/sys/syscallsubr.h =================================================================== --- sys/sys/syscallsubr.h +++ sys/sys/syscallsubr.h @@ -54,6 +54,7 @@ struct sockaddr; struct stat; struct thr_param; +struct sched_param; struct __wrusage; int kern___getcwd(struct thread *td, u_char *buf, enum uio_seg bufseg, @@ -190,6 +191,14 @@ int kern_rmdir(struct thread *td, char *path, enum uio_seg pathseg); int kern_rmdirat(struct thread *td, int fd, char *path, enum uio_seg pathseg); +int kern_sched_getparam(struct thread *td, struct thread *targettd, + struct sched_param *param); +int kern_sched_getscheduler(struct thread *td, struct thread *targettd, + int *policy); +int kern_sched_setparam(struct thread *td, struct thread *targettd, + struct sched_param *param); +int kern_sched_setscheduler(struct thread *td, struct thread *targettd, + int policy, struct sched_param *param); int kern_sched_rr_get_interval(struct thread *td, pid_t pid, struct timespec *ts); int kern_sched_rr_get_interval_td(struct thread *td, struct thread *targettd,