svn commit: r356658 - in head/sys: compat/linux kern sys
Edward Tomasz Napierala
trasz at FreeBSD.org
Sun Jan 12 13:38:52 UTC 2020
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);
More information about the svn-src-all
mailing list