svn commit: r214858 - stable/8/sys/sys
Lawrence Stewart
lstewart at FreeBSD.org
Sat Nov 6 09:23:50 UTC 2010
Author: lstewart
Date: Sat Nov 6 09:23:49 2010
New Revision: 214858
URL: http://svn.freebsd.org/changeset/base/214858
Log:
MFC r209050 (originally committed by jhb):
Add helper macros to iterate over available CPUs in the system.
CPU_FOREACH(i) iterates over the CPU IDs of all available CPUs. The
CPU_FIRST() and CPU_NEXT(i) macros can also be used to iterate over
available CPU IDs. CPU_NEXT(i) wraps around to CPU_FIRST() rather than
returning some sort of terminator.
Requested by: rwatson
Reviewed by: attilio
Modified:
stable/8/sys/sys/smp.h
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
Modified: stable/8/sys/sys/smp.h
==============================================================================
--- stable/8/sys/sys/smp.h Sat Nov 6 03:59:21 2010 (r214857)
+++ stable/8/sys/sys/smp.h Sat Nov 6 09:23:49 2010 (r214858)
@@ -91,6 +91,44 @@ extern cpumask_t all_cpus;
*/
#define CPU_ABSENT(x_cpu) ((all_cpus & (1 << (x_cpu))) == 0)
+/*
+ * Macros to iterate over non-absent CPUs. CPU_FOREACH() takes an
+ * integer iterator and iterates over the available set of CPUs.
+ * CPU_FIRST() returns the id of the first non-absent CPU. CPU_NEXT()
+ * returns the id of the next non-absent CPU. It will wrap back to
+ * CPU_FIRST() once the end of the list is reached. The iterators are
+ * currently implemented via inline functions.
+ */
+#define CPU_FOREACH(i) \
+ for ((i) = 0; (i) <= mp_maxid; (i)++) \
+ if (!CPU_ABSENT((i)))
+
+static __inline int
+cpu_first(void)
+{
+ int i;
+
+ for (i = 0;; i++)
+ if (!CPU_ABSENT(i))
+ return (i);
+}
+
+static __inline int
+cpu_next(int i)
+{
+
+ for (;;) {
+ i++;
+ if (i > mp_maxid)
+ i = 0;
+ if (!CPU_ABSENT(i))
+ return (i);
+ }
+}
+
+#define CPU_FIRST() cpu_first()
+#define CPU_NEXT(i) cpu_next((i))
+
#ifdef SMP
/*
* Machine dependent functions used to initialize MP support.
More information about the svn-src-stable
mailing list