summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorStephen Rothwell <sfr@canb.auug.org.au>2008-10-28 13:55:56 +1100
committerStephen Rothwell <sfr@canb.auug.org.au>2008-10-28 13:55:56 +1100
commitfe20ab0196014a1e74da5173f0af8b4c6a9ffb09 (patch)
treedab9ea16fbf6f61be93522ceb74911be1e1ee957 /lib
parentaa3e16f10dacf84f5b5753e9547b76e362ded90b (diff)
parenta7df98c8760980d72a6ab239a3a78465bff2adcd (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.debug6
-rw-r--r--lib/cpumask.c68
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