Skip site navigation (1)Skip section navigation (2)
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>