Date: Sun, 12 Jan 2020 13:38:51 +0000 (UTC) From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r356658 - in head/sys: compat/linux kern sys Message-ID: <202001121338.00CDcpwG021053@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: trasz Date: Sun Jan 12 13:38:51 2020 New Revision: 356658 URL: https://svnweb.freebsd.org/changeset/base/356658 Log: Add kern_setpriority(), use it in Linuxulator. Reviewed by: kib MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D22841 Modified: head/sys/compat/linux/linux_misc.c head/sys/kern/kern_resource.c head/sys/sys/syscallsubr.h Modified: head/sys/compat/linux/linux_misc.c ============================================================================== --- head/sys/compat/linux/linux_misc.c Sun Jan 12 06:13:52 2020 (r356657) +++ head/sys/compat/linux/linux_misc.c Sun Jan 12 13:38:51 2020 (r356658) @@ -1207,12 +1207,8 @@ linux_getitimer(struct thread *td, struct linux_getiti int linux_nice(struct thread *td, struct linux_nice_args *args) { - struct setpriority_args bsd_args; - bsd_args.which = PRIO_PROCESS; - bsd_args.who = 0; /* current process */ - bsd_args.prio = args->inc; - return (sys_setpriority(td, &bsd_args)); + return (kern_setpriority(td, PRIO_PROCESS, 0, args->inc)); } #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */ Modified: head/sys/kern/kern_resource.c ============================================================================== --- head/sys/kern/kern_resource.c Sun Jan 12 06:13:52 2020 (r356657) +++ head/sys/kern/kern_resource.c Sun Jan 12 13:38:51 2020 (r356658) @@ -175,24 +175,31 @@ struct setpriority_args { int sys_setpriority(struct thread *td, struct setpriority_args *uap) { + + return (kern_setpriority(td, uap->which, uap->who, uap->prio)); +} + +int +kern_setpriority(struct thread *td, int which, int who, int prio) +{ struct proc *curp, *p; struct pgrp *pg; int found = 0, error = 0; curp = td->td_proc; - switch (uap->which) { + switch (which) { case PRIO_PROCESS: - if (uap->who == 0) { + if (who == 0) { PROC_LOCK(curp); - error = donice(td, curp, uap->prio); + error = donice(td, curp, prio); PROC_UNLOCK(curp); } else { - p = pfind(uap->who); + p = pfind(who); if (p == NULL) break; error = p_cansee(td, p); if (error == 0) - error = donice(td, p, uap->prio); + error = donice(td, p, prio); PROC_UNLOCK(p); } found++; @@ -200,11 +207,11 @@ sys_setpriority(struct thread *td, struct setpriority_ case PRIO_PGRP: sx_slock(&proctree_lock); - if (uap->who == 0) { + if (who == 0) { pg = curp->p_pgrp; PGRP_LOCK(pg); } else { - pg = pgfind(uap->who); + pg = pgfind(who); if (pg == NULL) { sx_sunlock(&proctree_lock); break; @@ -215,7 +222,7 @@ sys_setpriority(struct thread *td, struct setpriority_ PROC_LOCK(p); if (p->p_state == PRS_NORMAL && p_cansee(td, p) == 0) { - error = donice(td, p, uap->prio); + error = donice(td, p, prio); found++; } PROC_UNLOCK(p); @@ -224,15 +231,15 @@ sys_setpriority(struct thread *td, struct setpriority_ break; case PRIO_USER: - if (uap->who == 0) - uap->who = td->td_ucred->cr_uid; + if (who == 0) + who = td->td_ucred->cr_uid; sx_slock(&allproc_lock); FOREACH_PROC_IN_SYSTEM(p) { PROC_LOCK(p); if (p->p_state == PRS_NORMAL && - p->p_ucred->cr_uid == uap->who && + p->p_ucred->cr_uid == who && p_cansee(td, p) == 0) { - error = donice(td, p, uap->prio); + error = donice(td, p, prio); found++; } PROC_UNLOCK(p); Modified: head/sys/sys/syscallsubr.h ============================================================================== --- head/sys/sys/syscallsubr.h Sun Jan 12 06:13:52 2020 (r356657) +++ head/sys/sys/syscallsubr.h Sun Jan 12 13:38:51 2020 (r356658) @@ -251,6 +251,7 @@ int kern_sendit(struct thread *td, int s, struct msghd int kern_setgroups(struct thread *td, u_int ngrp, gid_t *groups); int kern_setitimer(struct thread *, u_int, struct itimerval *, struct itimerval *); +int kern_setpriority(struct thread *td, int which, int who, int prio); int kern_setrlimit(struct thread *, u_int, struct rlimit *); int kern_setsockopt(struct thread *td, int s, int level, int name, const void *optval, enum uio_seg valseg, socklen_t valsize);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202001121338.00CDcpwG021053>