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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to