diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2008-10-28 13:55:56 +1100 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2008-10-28 13:55:56 +1100 |
commit | fe20ab0196014a1e74da5173f0af8b4c6a9ffb09 (patch) | |
tree | dab9ea16fbf6f61be93522ceb74911be1e1ee957 /lib | |
parent | aa3e16f10dacf84f5b5753e9547b76e362ded90b (diff) | |
parent | a7df98c8760980d72a6ab239a3a78465bff2adcd (diff) |
Merge branch 'quilt/rr'
Conflicts:
arch/s390/Kconfig
arch/x86/Kconfig
arch/x86/include/asm/ipi.h
kernel/params.c
kernel/sched.c
kernel/stop_machine.c
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Kconfig.debug | 6 | ||||
-rw-r--r-- | lib/cpumask.c | 68 |
2 files changed, 56 insertions, 18 deletions
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 1668fa12143f..c22aa4002683 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -680,6 +680,12 @@ config SYSCTL_SYSCALL_CHECK to properly maintain and use. This enables checks that help you to keep things correct. +config DEBUG_PER_CPU_MAPS + bool "Cpumask debug checks" + ---help--- + Extra debugging for cpumasks. + eg. to make sure accesses to cpumasks are < nr_cpu_ids. + source kernel/trace/Kconfig config PROVIDE_OHCI1394_DMA_INIT diff --git a/lib/cpumask.c b/lib/cpumask.c index 5f97dc25ef9c..48f475fd0b89 100644 --- a/lib/cpumask.c +++ b/lib/cpumask.c @@ -3,35 +3,67 @@ #include <linux/cpumask.h> #include <linux/module.h> -int __first_cpu(const cpumask_t *srcp) +int cpumask_first(const cpumask_t *srcp) { - return min_t(int, NR_CPUS, find_first_bit(srcp->bits, NR_CPUS)); + return find_first_bit(cpumask_bits(srcp), nr_cpumask_bits); } -EXPORT_SYMBOL(__first_cpu); +EXPORT_SYMBOL(cpumask_first); -int __next_cpu(int n, const cpumask_t *srcp) +int cpumask_next(int n, const cpumask_t *srcp) { - return min_t(int, NR_CPUS, find_next_bit(srcp->bits, NR_CPUS, n+1)); + /* -1 is a legal arg here. */ + if (n != -1) + cpumask_check(n); + return find_next_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1); } -EXPORT_SYMBOL(__next_cpu); +EXPORT_SYMBOL(cpumask_next); -#if NR_CPUS > 64 -int __next_cpu_nr(int n, const cpumask_t *srcp) +int cpumask_next_and(int n, const cpumask_t *srcp, const cpumask_t *andp) { - return min_t(int, nr_cpu_ids, - find_next_bit(srcp->bits, nr_cpu_ids, n+1)); + while ((n = cpumask_next(n, srcp)) < nr_cpu_ids) + if (cpumask_test_cpu(n, andp)) + break; + return n; } -EXPORT_SYMBOL(__next_cpu_nr); -#endif +EXPORT_SYMBOL(cpumask_next_and); -int __any_online_cpu(const cpumask_t *mask) +int cpumask_any_but(const struct cpumask *mask, unsigned int cpu) { - int cpu; + unsigned int i; - for_each_cpu_mask(cpu, *mask) { - if (cpu_online(cpu)) + for_each_cpu(i, mask) + if (i != cpu) break; + return i; +} + +/* These are not inline because of header tangles. */ +#ifdef CONFIG_CPUMASK_OFFSTACK +bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags) +{ + if (likely(slab_is_available())) + *mask = kmalloc(cpumask_size(), flags); + else { +#ifdef CONFIG_DEBUG_PER_CPU_MAPS + printk(KERN_ERR + "=> alloc_cpumask_var: kmalloc not available!\n"); + dump_stack(); +#endif + *mask = NULL; } - return cpu; +#ifdef CONFIG_DEBUG_PER_CPU_MAPS + if (!*mask) { + printk(KERN_ERR "=> alloc_cpumask_var: failed!\n"); + dump_stack(); + } +#endif + return *mask != NULL; +} +EXPORT_SYMBOL(alloc_cpumask_var); + +void free_cpumask_var(cpumask_var_t mask) +{ + kfree(mask); } -EXPORT_SYMBOL(__any_online_cpu); +EXPORT_SYMBOL(free_cpumask_var); +#endif |