highest_possible_processor_id() has to be a macro
PATCH 1/1 highest_possible_processor_id() has to be a macro
... 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.
----
include/linux/cpumask.h +7 -9
@@ -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 */
From: Al Viro <[email protected]>
Date: Sun, 16 Oct 2005 00:51:12 +0100
Quoted 3 lines
... otherwise, things like alpha and sparc64 break and break
badly. They definecpu_possible_mapto something else insmp.h*AFTER* having includedcpumask.h.
So ugly...
But, it's the best fix for now.
Longer term we might want to make an asm/cpumask.h that can help allow the platforms to cleanly say "well, mask X is equivalent to Y, so only instantiate X and define Y to X" which is all that these two platforms are trying to accomplish.
If you don't support cpu hotplug, present == possible afterall.
Quoted 9 lines · David S. Miller
So ugly...
But, it's the best fix for now.
Longer term we might want to make an
asm/cpumask.hthat can help allow the platforms to cleanly say "well, mask X is equivalent to Y, so only instantiate X and define Y to X" which is all that these two platforms are trying to accomplish.
The other thing you could is have an inline function called highest_processor_id (or perhaps last_cpu) that calculates the biggest CPU ID for any map and then define highest_possible_processor_id as a macro that just calls the function with the right arguments.
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtQuoted 7 lines · David S. Miller
From: Al Viro <[email protected]>
Date: Sun, 16 Oct 2005 00:51:12 +0100Quoted 3 lines
... otherwise, things like alpha and sparc64 break and break
badly. They definecpu_possible_mapto something else insmp.h*AFTER* having includedcpumask.h.
Quoted 7 lines
So ugly...
But, it's the best fix for now.
Longer term we might want to make an
asm/cpumask.hthat can help allow the platforms to cleanly say "well, mask X is equivalent to Y, so only instantiate X and define Y to X"
Indeed, but playing with moving stuff from smp.h is definitely post-2.6.14 fodder...