aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorRuchi Kandoi <kandoiruchi@google.com>2014-04-18 14:07:28 -0700
committerZiyann <jaraidaniel@gmail.com>2014-11-26 21:10:50 +0100
commitc620fdb741eaec1776e3e84e88e2676002901b14 (patch)
treeaa4cf6b474c0476571db85db195a3f874c58f9ad /kernel
parent10d2f7fe16c390e686260828847fa6f0fffd2b78 (diff)
downloadkernel_samsung_tuna-c620fdb741eaec1776e3e84e88e2676002901b14.zip
kernel_samsung_tuna-c620fdb741eaec1776e3e84e88e2676002901b14.tar.gz
kernel_samsung_tuna-c620fdb741eaec1776e3e84e88e2676002901b14.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')
-rw-r--r--kernel/sys.c19
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;