diff options
author | Peter Zijlstra <peterz@infradead.org> | 2014-02-14 11:19:29 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2014-02-21 15:27:10 -0500 |
commit | 6d35ab48090b10c5ea5604ed5d6e91f302dc6060 (patch) | |
tree | 6900ab1355dfd47fcb2c0e1a76f752d36995c925 | |
parent | 4efbc454ba68def5ef285b26ebfcfdb605b52755 (diff) |
sched: Add 'flags' argument to sched_{set,get}attr() syscalls
Because of a recent syscall design debate; its deemed appropriate for
each syscall to have a flags argument for future extension; without
immediately requiring new syscalls.
Cc: juri.lelli@gmail.com
Cc: Ingo Molnar <mingo@redhat.com>
Suggested-by: Michael Kerrisk <mtk.manpages@gmail.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20140214161929.GL27965@twins.programming.kicks-ass.net
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | include/linux/syscalls.h | 6 | ||||
-rw-r--r-- | kernel/sched/core.c | 11 |
2 files changed, 10 insertions, 7 deletions
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 40ed9e9a77e5..a747a77ea584 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -281,13 +281,15 @@ asmlinkage long sys_sched_setscheduler(pid_t pid, int policy, | |||
281 | asmlinkage long sys_sched_setparam(pid_t pid, | 281 | asmlinkage long sys_sched_setparam(pid_t pid, |
282 | struct sched_param __user *param); | 282 | struct sched_param __user *param); |
283 | asmlinkage long sys_sched_setattr(pid_t pid, | 283 | asmlinkage long sys_sched_setattr(pid_t pid, |
284 | struct sched_attr __user *attr); | 284 | struct sched_attr __user *attr, |
285 | unsigned int flags); | ||
285 | asmlinkage long sys_sched_getscheduler(pid_t pid); | 286 | asmlinkage long sys_sched_getscheduler(pid_t pid); |
286 | asmlinkage long sys_sched_getparam(pid_t pid, | 287 | asmlinkage long sys_sched_getparam(pid_t pid, |
287 | struct sched_param __user *param); | 288 | struct sched_param __user *param); |
288 | asmlinkage long sys_sched_getattr(pid_t pid, | 289 | asmlinkage long sys_sched_getattr(pid_t pid, |
289 | struct sched_attr __user *attr, | 290 | struct sched_attr __user *attr, |
290 | unsigned int size); | 291 | unsigned int size, |
292 | unsigned int flags); | ||
291 | asmlinkage long sys_sched_setaffinity(pid_t pid, unsigned int len, | 293 | asmlinkage long sys_sched_setaffinity(pid_t pid, unsigned int len, |
292 | unsigned long __user *user_mask_ptr); | 294 | unsigned long __user *user_mask_ptr); |
293 | asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len, | 295 | asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len, |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index a6e7470166c7..6edbef296ece 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -3661,13 +3661,14 @@ SYSCALL_DEFINE2(sched_setparam, pid_t, pid, struct sched_param __user *, param) | |||
3661 | * @pid: the pid in question. | 3661 | * @pid: the pid in question. |
3662 | * @uattr: structure containing the extended parameters. | 3662 | * @uattr: structure containing the extended parameters. |
3663 | */ | 3663 | */ |
3664 | SYSCALL_DEFINE2(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr) | 3664 | SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr, |
3665 | unsigned int, flags) | ||
3665 | { | 3666 | { |
3666 | struct sched_attr attr; | 3667 | struct sched_attr attr; |
3667 | struct task_struct *p; | 3668 | struct task_struct *p; |
3668 | int retval; | 3669 | int retval; |
3669 | 3670 | ||
3670 | if (!uattr || pid < 0) | 3671 | if (!uattr || pid < 0 || flags) |
3671 | return -EINVAL; | 3672 | return -EINVAL; |
3672 | 3673 | ||
3673 | if (sched_copy_attr(uattr, &attr)) | 3674 | if (sched_copy_attr(uattr, &attr)) |
@@ -3804,8 +3805,8 @@ err_size: | |||
3804 | * @uattr: structure containing the extended parameters. | 3805 | * @uattr: structure containing the extended parameters. |
3805 | * @size: sizeof(attr) for fwd/bwd comp. | 3806 | * @size: sizeof(attr) for fwd/bwd comp. |
3806 | */ | 3807 | */ |
3807 | SYSCALL_DEFINE3(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr, | 3808 | SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr, |
3808 | unsigned int, size) | 3809 | unsigned int, size, unsigned int, flags) |
3809 | { | 3810 | { |
3810 | struct sched_attr attr = { | 3811 | struct sched_attr attr = { |
3811 | .size = sizeof(struct sched_attr), | 3812 | .size = sizeof(struct sched_attr), |
@@ -3814,7 +3815,7 @@ SYSCALL_DEFINE3(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr, | |||
3814 | int retval; | 3815 | int retval; |
3815 | 3816 | ||
3816 | if (!uattr || pid < 0 || size > PAGE_SIZE || | 3817 | if (!uattr || pid < 0 || size > PAGE_SIZE || |
3817 | size < SCHED_ATTR_SIZE_VER0) | 3818 | size < SCHED_ATTR_SIZE_VER0 || flags) |
3818 | return -EINVAL; | 3819 | return -EINVAL; |
3819 | 3820 | ||
3820 | rcu_read_lock(); | 3821 | rcu_read_lock(); |