sched: convert sys_sched_getaffinity() to cpumask_var_t.

Previous thread: sched: convert rebalance_domains() to cpumask_var_t. by Linux Kernel Mailing List on Friday, January 2, 2009 - 2:04 pm. (1 message)

Next thread: sched: avoid stack var in move_task_off_dead_cpu by Linux Kernel Mailing List on Friday, January 2, 2009 - 2:04 pm. (1 message)
From: Linux Kernel Mailing List
Date: Friday, January 2, 2009 - 2:04 pm

Gitweb:     http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f17c86...
Commit:     f17c860760927c2a8e41a021eab3317e4415e962
Parent:     a0e902452da16b79d7c9230630ed8a595d14fa85
Author:     Rusty Russell <rusty@rustcorp.com.au>
AuthorDate: Tue Nov 25 02:35:11 2008 +1030
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Mon Nov 24 17:51:45 2008 +0100

    sched: convert sys_sched_getaffinity() to cpumask_var_t.
    
    Impact: stack usage reduction
    
    Dynamically allocating cpumasks (when CONFIG_CPUMASK_OFFSTACK) saves
    space in the stack.  cpumask_var_t is just a struct cpumask for
    !CONFIG_CPUMASK_OFFSTACK.
    
    Some jiggling here to make sure we always exit at the bottom (so we hit
    the free_cpumask_var there).
    
    Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 kernel/sched.c |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/kernel/sched.c b/kernel/sched.c
index 67383e7..6deff24 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -5499,19 +5499,24 @@ asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len,
 				      unsigned long __user *user_mask_ptr)
 {
 	int ret;
-	cpumask_t mask;
+	cpumask_var_t mask;
 
-	if (len < sizeof(cpumask_t))
+	if (len < cpumask_size())
 		return -EINVAL;
 
-	ret = sched_getaffinity(pid, &mask);
-	if (ret < 0)
-		return ret;
+	if (!alloc_cpumask_var(&mask, GFP_KERNEL))
+		return -ENOMEM;
 
-	if (copy_to_user(user_mask_ptr, &mask, sizeof(cpumask_t)))
-		return -EFAULT;
+	ret = sched_getaffinity(pid, mask);
+	if (ret == 0) {
+		if (copy_to_user(user_mask_ptr, mask, cpumask_size()))
+			ret = -EFAULT;
+		else
+			ret = cpumask_size();
+	}
+	free_cpumask_var(mask);
 
-	return sizeof(cpumask_t);
+	return ret;
 }
 
 /**
--

Previous thread: sched: convert rebalance_domains() to cpumask_var_t. by Linux Kernel Mailing List on Friday, January 2, 2009 - 2:04 pm. (1 message)

Next thread: sched: avoid stack var in move_task_off_dead_cpu by Linux Kernel Mailing List on Friday, January 2, 2009 - 2:04 pm. (1 message)