[PATCH] highest_possible_processor_id() has to be a macro

From: Al Viro
Date: Sat Oct 15 2005 - 18:55:47 EST


... otherwise, things like alpha and sparc64 break and break
badly. They define cpu_possible_map to something else in smp.h
*AFTER* having included cpumask.h.

If that puppy is a macro, expansion will happen at the actual
caller, when we'd already seen #define cpu_possible_map ... and we will
get the right thing used.

As an inline helper it will be tokenized before we get to that
define and that's it; no matter what we define later, it won't affect
anything. We get modules with dependency on cpu_possible_map instead
of the right symbol (phys_cpu_present_map in case of sparc64), or outright
link errors if they are built-in.

Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx>
----
diff -urN RC14-rc4-git4-base/include/linux/cpumask.h current/include/linux/cpumask.h
--- RC14-rc4-git4-base/include/linux/cpumask.h 2005-10-15 16:21:34.000000000 -0400
+++ current/include/linux/cpumask.h 2005-10-15 19:46:34.000000000 -0400
@@ -393,15 +393,13 @@
#define for_each_present_cpu(cpu) for_each_cpu_mask((cpu), cpu_present_map)

/* Find the highest possible smp_processor_id() */
-static inline unsigned int highest_possible_processor_id(void)
-{
- unsigned int cpu, highest = 0;
-
- for_each_cpu_mask(cpu, cpu_possible_map)
- highest = cpu;
-
- return highest;
-}
+#define highest_possible_processor_id() \
+({ \
+ unsigned int cpu, highest = 0; \
+ for_each_cpu_mask(cpu, cpu_possible_map) \
+ highest = cpu; \
+ highest; \
+})


#endif /* __LINUX_CPUMASK_H */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/