diff options
author | Mike Travis <travis@sgi.com> | 2008-04-04 21:11:08 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-19 13:44:59 -0400 |
commit | b53e921ba1cff8453dc9a87a84052fa12d5b30bd (patch) | |
tree | 021cadb6c58543ecccd95b55fc319f249ebf176e | |
parent | f9a86fcbbb1e5542eabf45c9144ac4b6330861a4 (diff) |
generic: reduce stack pressure in sched_affinity
* Modify sched_affinity functions to pass cpumask_t variables by reference
instead of by value.
* Use new set_cpus_allowed_ptr function.
Depends on:
[sched-devel]: sched: add new set_cpus_allowed_ptr function
Cc: Paul Jackson <pj@sgi.com>
Cc: Cliff Wickman <cpw@sgi.com>
Signed-off-by: Mike Travis <travis@sgi.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_amd_64.c | 46 | ||||
-rw-r--r-- | include/linux/sched.h | 2 | ||||
-rw-r--r-- | kernel/compat.c | 2 | ||||
-rw-r--r-- | kernel/rcupreempt.c | 4 | ||||
-rw-r--r-- | kernel/sched.c | 5 |
5 files changed, 30 insertions, 29 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c index 32671da8184e..7c9a813e1193 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c | |||
@@ -251,18 +251,18 @@ struct threshold_attr { | |||
251 | ssize_t(*store) (struct threshold_block *, const char *, size_t count); | 251 | ssize_t(*store) (struct threshold_block *, const char *, size_t count); |
252 | }; | 252 | }; |
253 | 253 | ||
254 | static cpumask_t affinity_set(unsigned int cpu) | 254 | static void affinity_set(unsigned int cpu, cpumask_t *oldmask, |
255 | cpumask_t *newmask) | ||
255 | { | 256 | { |
256 | cpumask_t oldmask = current->cpus_allowed; | 257 | *oldmask = current->cpus_allowed; |
257 | cpumask_t newmask = CPU_MASK_NONE; | 258 | cpus_clear(*newmask); |
258 | cpu_set(cpu, newmask); | 259 | cpu_set(cpu, *newmask); |
259 | set_cpus_allowed(current, newmask); | 260 | set_cpus_allowed_ptr(current, newmask); |
260 | return oldmask; | ||
261 | } | 261 | } |
262 | 262 | ||
263 | static void affinity_restore(cpumask_t oldmask) | 263 | static void affinity_restore(const cpumask_t *oldmask) |
264 | { | 264 | { |
265 | set_cpus_allowed(current, oldmask); | 265 | set_cpus_allowed_ptr(current, oldmask); |
266 | } | 266 | } |
267 | 267 | ||
268 | #define SHOW_FIELDS(name) \ | 268 | #define SHOW_FIELDS(name) \ |
@@ -277,15 +277,15 @@ static ssize_t store_interrupt_enable(struct threshold_block *b, | |||
277 | const char *buf, size_t count) | 277 | const char *buf, size_t count) |
278 | { | 278 | { |
279 | char *end; | 279 | char *end; |
280 | cpumask_t oldmask; | 280 | cpumask_t oldmask, newmask; |
281 | unsigned long new = simple_strtoul(buf, &end, 0); | 281 | unsigned long new = simple_strtoul(buf, &end, 0); |
282 | if (end == buf) | 282 | if (end == buf) |
283 | return -EINVAL; | 283 | return -EINVAL; |
284 | b->interrupt_enable = !!new; | 284 | b->interrupt_enable = !!new; |
285 | 285 | ||
286 | oldmask = affinity_set(b->cpu); | 286 | affinity_set(b->cpu, &oldmask, &newmask); |
287 | threshold_restart_bank(b, 0, 0); | 287 | threshold_restart_bank(b, 0, 0); |
288 | affinity_restore(oldmask); | 288 | affinity_restore(&oldmask); |
289 | 289 | ||
290 | return end - buf; | 290 | return end - buf; |
291 | } | 291 | } |
@@ -294,7 +294,7 @@ static ssize_t store_threshold_limit(struct threshold_block *b, | |||
294 | const char *buf, size_t count) | 294 | const char *buf, size_t count) |
295 | { | 295 | { |
296 | char *end; | 296 | char *end; |
297 | cpumask_t oldmask; | 297 | cpumask_t oldmask, newmask; |
298 | u16 old; | 298 | u16 old; |
299 | unsigned long new = simple_strtoul(buf, &end, 0); | 299 | unsigned long new = simple_strtoul(buf, &end, 0); |
300 | if (end == buf) | 300 | if (end == buf) |
@@ -306,9 +306,9 @@ static ssize_t store_threshold_limit(struct threshold_block *b, | |||
306 | old = b->threshold_limit; | 306 | old = b->threshold_limit; |
307 | b->threshold_limit = new; | 307 | b->threshold_limit = new; |
308 | 308 | ||
309 | oldmask = affinity_set(b->cpu); | 309 | affinity_set(b->cpu, &oldmask, &newmask); |
310 | threshold_restart_bank(b, 0, old); | 310 | threshold_restart_bank(b, 0, old); |
311 | affinity_restore(oldmask); | 311 | affinity_restore(&oldmask); |
312 | 312 | ||
313 | return end - buf; | 313 | return end - buf; |
314 | } | 314 | } |
@@ -316,10 +316,10 @@ static ssize_t store_threshold_limit(struct threshold_block *b, | |||
316 | static ssize_t show_error_count(struct threshold_block *b, char *buf) | 316 | static ssize_t show_error_count(struct threshold_block *b, char *buf) |
317 | { | 317 | { |
318 | u32 high, low; | 318 | u32 high, low; |
319 | cpumask_t oldmask; | 319 | cpumask_t oldmask, newmask; |
320 | oldmask = affinity_set(b->cpu); | 320 | affinity_set(b->cpu, &oldmask, &newmask); |
321 | rdmsr(b->address, low, high); | 321 | rdmsr(b->address, low, high); |
322 | affinity_restore(oldmask); | 322 | affinity_restore(&oldmask); |
323 | return sprintf(buf, "%x\n", | 323 | return sprintf(buf, "%x\n", |
324 | (high & 0xFFF) - (THRESHOLD_MAX - b->threshold_limit)); | 324 | (high & 0xFFF) - (THRESHOLD_MAX - b->threshold_limit)); |
325 | } | 325 | } |
@@ -327,10 +327,10 @@ static ssize_t show_error_count(struct threshold_block *b, char *buf) | |||
327 | static ssize_t store_error_count(struct threshold_block *b, | 327 | static ssize_t store_error_count(struct threshold_block *b, |
328 | const char *buf, size_t count) | 328 | const char *buf, size_t count) |
329 | { | 329 | { |
330 | cpumask_t oldmask; | 330 | cpumask_t oldmask, newmask; |
331 | oldmask = affinity_set(b->cpu); | 331 | affinity_set(b->cpu, &oldmask, &newmask); |
332 | threshold_restart_bank(b, 1, 0); | 332 | threshold_restart_bank(b, 1, 0); |
333 | affinity_restore(oldmask); | 333 | affinity_restore(&oldmask); |
334 | return 1; | 334 | return 1; |
335 | } | 335 | } |
336 | 336 | ||
@@ -468,7 +468,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
468 | { | 468 | { |
469 | int i, err = 0; | 469 | int i, err = 0; |
470 | struct threshold_bank *b = NULL; | 470 | struct threshold_bank *b = NULL; |
471 | cpumask_t oldmask = CPU_MASK_NONE; | 471 | cpumask_t oldmask, newmask; |
472 | char name[32]; | 472 | char name[32]; |
473 | 473 | ||
474 | sprintf(name, "threshold_bank%i", bank); | 474 | sprintf(name, "threshold_bank%i", bank); |
@@ -519,10 +519,10 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
519 | 519 | ||
520 | per_cpu(threshold_banks, cpu)[bank] = b; | 520 | per_cpu(threshold_banks, cpu)[bank] = b; |
521 | 521 | ||
522 | oldmask = affinity_set(cpu); | 522 | affinity_set(cpu, &oldmask, &newmask); |
523 | err = allocate_threshold_blocks(cpu, bank, 0, | 523 | err = allocate_threshold_blocks(cpu, bank, 0, |
524 | MSR_IA32_MC0_MISC + bank * 4); | 524 | MSR_IA32_MC0_MISC + bank * 4); |
525 | affinity_restore(oldmask); | 525 | affinity_restore(&oldmask); |
526 | 526 | ||
527 | if (err) | 527 | if (err) |
528 | goto out_free; | 528 | goto out_free; |
diff --git a/include/linux/sched.h b/include/linux/sched.h index be5d31752dbd..383502dfda17 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -2034,7 +2034,7 @@ static inline void arch_pick_mmap_layout(struct mm_struct *mm) | |||
2034 | } | 2034 | } |
2035 | #endif | 2035 | #endif |
2036 | 2036 | ||
2037 | extern long sched_setaffinity(pid_t pid, cpumask_t new_mask); | 2037 | extern long sched_setaffinity(pid_t pid, const cpumask_t *new_mask); |
2038 | extern long sched_getaffinity(pid_t pid, cpumask_t *mask); | 2038 | extern long sched_getaffinity(pid_t pid, cpumask_t *mask); |
2039 | 2039 | ||
2040 | extern int sched_mc_power_savings, sched_smt_power_savings; | 2040 | extern int sched_mc_power_savings, sched_smt_power_savings; |
diff --git a/kernel/compat.c b/kernel/compat.c index 9c48abfcd4a5..e1ef04870c2a 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
@@ -445,7 +445,7 @@ asmlinkage long compat_sys_sched_setaffinity(compat_pid_t pid, | |||
445 | if (retval) | 445 | if (retval) |
446 | return retval; | 446 | return retval; |
447 | 447 | ||
448 | return sched_setaffinity(pid, new_mask); | 448 | return sched_setaffinity(pid, &new_mask); |
449 | } | 449 | } |
450 | 450 | ||
451 | asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid, unsigned int len, | 451 | asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid, unsigned int len, |
diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c index e9517014b57c..e1cdf196a515 100644 --- a/kernel/rcupreempt.c +++ b/kernel/rcupreempt.c | |||
@@ -1007,10 +1007,10 @@ void __synchronize_sched(void) | |||
1007 | if (sched_getaffinity(0, &oldmask) < 0) | 1007 | if (sched_getaffinity(0, &oldmask) < 0) |
1008 | oldmask = cpu_possible_map; | 1008 | oldmask = cpu_possible_map; |
1009 | for_each_online_cpu(cpu) { | 1009 | for_each_online_cpu(cpu) { |
1010 | sched_setaffinity(0, cpumask_of_cpu(cpu)); | 1010 | sched_setaffinity(0, &cpumask_of_cpu(cpu)); |
1011 | schedule(); | 1011 | schedule(); |
1012 | } | 1012 | } |
1013 | sched_setaffinity(0, oldmask); | 1013 | sched_setaffinity(0, &oldmask); |
1014 | } | 1014 | } |
1015 | EXPORT_SYMBOL_GPL(__synchronize_sched); | 1015 | EXPORT_SYMBOL_GPL(__synchronize_sched); |
1016 | 1016 | ||
diff --git a/kernel/sched.c b/kernel/sched.c index ccc23a9cd264..1a8252385c4d 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -4908,9 +4908,10 @@ out_unlock: | |||
4908 | return retval; | 4908 | return retval; |
4909 | } | 4909 | } |
4910 | 4910 | ||
4911 | long sched_setaffinity(pid_t pid, cpumask_t new_mask) | 4911 | long sched_setaffinity(pid_t pid, const cpumask_t *in_mask) |
4912 | { | 4912 | { |
4913 | cpumask_t cpus_allowed; | 4913 | cpumask_t cpus_allowed; |
4914 | cpumask_t new_mask = *in_mask; | ||
4914 | struct task_struct *p; | 4915 | struct task_struct *p; |
4915 | int retval; | 4916 | int retval; |
4916 | 4917 | ||
@@ -4991,7 +4992,7 @@ asmlinkage long sys_sched_setaffinity(pid_t pid, unsigned int len, | |||
4991 | if (retval) | 4992 | if (retval) |
4992 | return retval; | 4993 | return retval; |
4993 | 4994 | ||
4994 | return sched_setaffinity(pid, new_mask); | 4995 | return sched_setaffinity(pid, &new_mask); |
4995 | } | 4996 | } |
4996 | 4997 | ||
4997 | /* | 4998 | /* |