summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoreadler <eadler@FreeBSD.org>2011-12-13 14:00:27 +0000
committereadler <eadler@FreeBSD.org>2011-12-13 14:00:27 +0000
commit036b3a534b9846a059e610aff7167bf252da5fdd (patch)
tree6abe4637e2f8b2b278e50eeee75d211b9698c1dc /sys
parentcb983d98e7772d8d6e1742277b6061d98eb57099 (diff)
downloadFreeBSD-src-036b3a534b9846a059e610aff7167bf252da5fdd.zip
FreeBSD-src-036b3a534b9846a059e610aff7167bf252da5fdd.tar.gz
- Add a sysctl to allow non-root users the ability to set idle
priorities. - While here fix up some style nits. Discussed with: cperciva (breifly) Reviewed by: pjd (earlier version) Reviewed by: bde Approved by: jhb MFC after: 1 month
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_resource.c58
1 files changed, 33 insertions, 25 deletions
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c
index cccb040..e0bb453 100644
--- a/sys/kern/kern_resource.c
+++ b/sys/kern/kern_resource.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sched.h>
#include <sys/sx.h>
#include <sys/syscallsubr.h>
+#include <sys/sysctl.h>
#include <sys/sysent.h>
#include <sys/time.h>
#include <sys/umtx.h>
@@ -273,6 +274,10 @@ donice(struct thread *td, struct proc *p, int n)
return (0);
}
+static int unprivileged_idprio;
+SYSCTL_INT(_security_bsd, OID_AUTO, unprivileged_idprio, CTLFLAG_RW,
+ &unprivileged_idprio, 0, "Allow non-root users to set an idle priority");
+
/*
* Set realtime priority for LWP.
*/
@@ -321,18 +326,26 @@ sys_rtprio_thread(struct thread *td, struct rtprio_thread_args *uap)
break;
/* Disallow setting rtprio in most cases if not superuser. */
-/*
- * Realtime priority has to be restricted for reasons which should be
- * obvious. However, for idle priority, there is a potential for
- * system deadlock if an idleprio process gains a lock on a resource
- * that other processes need (and the idleprio process can't run
- * due to a CPU-bound normal process). Fix me! XXX
- */
-#if 0
- if (RTP_PRIO_IS_REALTIME(rtp.type)) {
-#else
- if (rtp.type != RTP_PRIO_NORMAL) {
-#endif
+
+ /*
+ * Realtime priority has to be restricted for reasons which
+ * should be obvious. However, for idleprio processes, there is
+ * a potential for system deadlock if an idleprio process gains
+ * a lock on a resource that other processes need (and the
+ * idleprio process can't run due to a CPU-bound normal
+ * process). Fix me! XXX
+ *
+ * This problem is not only related to idleprio process.
+ * A user level program can obtain a file lock and hold it
+ * indefinitely. Additionally, without idleprio processes it is
+ * still conceivable that a program with low priority will never
+ * get to run. In short, allowing this feature might make it
+ * easier to lock a resource indefinitely, but it is not the
+ * only thing that makes it possible.
+ */
+ if (RTP_PRIO_BASE(rtp.type) == RTP_PRIO_REALTIME ||
+ (RTP_PRIO_BASE(rtp.type) == RTP_PRIO_IDLE &&
+ unprivileged_idprio == 0)) {
error = priv_check(td, PRIV_SCHED_RTPRIO);
if (error)
break;
@@ -417,19 +430,14 @@ sys_rtprio(td, uap)
if ((error = p_cansched(td, p)) || (error = cierror))
break;
- /* Disallow setting rtprio in most cases if not superuser. */
-/*
- * Realtime priority has to be restricted for reasons which should be
- * obvious. However, for idle priority, there is a potential for
- * system deadlock if an idleprio process gains a lock on a resource
- * that other processes need (and the idleprio process can't run
- * due to a CPU-bound normal process). Fix me! XXX
- */
-#if 0
- if (RTP_PRIO_IS_REALTIME(rtp.type)) {
-#else
- if (rtp.type != RTP_PRIO_NORMAL) {
-#endif
+ /*
+ * Disallow setting rtprio in most cases if not superuser.
+ * See the comment in sys_rtprio_thread about idprio
+ * threads holding a lock.
+ */
+ if (RTP_PRIO_BASE(rtp.type) == RTP_PRIO_REALTIME ||
+ (RTP_PRIO_BASE(rtp.type) == RTP_PRIO_IDLE &&
+ !unprivileged_idprio)) {
error = priv_check(td, PRIV_SCHED_RTPRIO);
if (error)
break;
OpenPOWER on IntegriCloud