diff options
author | Ruchi Kandoi <kandoiruchi@google.com> | 2014-04-18 14:07:28 -0700 |
---|---|---|
committer | Ziyan <jaraidaniel@gmail.com> | 2016-03-11 15:56:49 +0100 |
commit | 1cdac799d156780dbbc4db5fc9ca2f68ddc1297c (patch) | |
tree | 435434db018eab658144ad065e60657df69916b3 /kernel/sys.c | |
parent | 00b44ccd051cb74179e504e3843a7959cb8fa387 (diff) | |
download | kernel_samsung_espresso10-1cdac799d156780dbbc4db5fc9ca2f68ddc1297c.zip kernel_samsung_espresso10-1cdac799d156780dbbc4db5fc9ca2f68ddc1297c.tar.gz kernel_samsung_espresso10-1cdac799d156780dbbc4db5fc9ca2f68ddc1297c.tar.bz2 |
prctl: adds PR_SET_TIMERSLACK_PID for setting timer slack of an arbitrary thread.
Second argument is similar to PR_SET_TIMERSLACK, if non-zero then the
slack is set to that value otherwise sets it to the default for the thread.
Takes PID of the thread as the third argument.
This allows power/performance management software to set timer slack for
other threads according to its policy for the thread (such as when the
thread is designated foreground vs. background activity)
Change-Id: I744d451ff4e60dae69f38f53948ff36c51c14a3f
Signed-off-by: Ruchi Kandoi <kandoiruchi@google.com>
Conflicts:
include/linux/prctl.h
kernel/sys.c
Diffstat (limited to 'kernel/sys.c')
-rw-r--r-- | kernel/sys.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/sys.c b/kernel/sys.c index 1c69aa7..8d1142a 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -40,6 +40,7 @@ #include <linux/syscore_ops.h> #include <linux/version.h> #include <linux/ctype.h> +#include <linux/sched.h> #include <linux/compat.h> #include <linux/syscalls.h> @@ -1660,6 +1661,7 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5) { struct task_struct *me = current; + struct task_struct *tsk; unsigned char comm[sizeof(me->comm)]; long error; @@ -1804,6 +1806,23 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, else error = PR_MCE_KILL_DEFAULT; break; + case PR_SET_TIMERSLACK_PID: + rcu_read_lock(); + tsk = find_task_by_pid_ns((pid_t)arg3, &init_pid_ns); + if (tsk == NULL) { + rcu_read_unlock(); + return -EINVAL; + } + get_task_struct(tsk); + rcu_read_unlock(); + if (arg2 <= 0) + tsk->timer_slack_ns = + tsk->default_timer_slack_ns; + else + tsk->timer_slack_ns = arg2; + put_task_struct(tsk); + error = 0; + break; default: error = -EINVAL; break; |