... 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.
Showing the changes to include/linux (1 of 1 file). Show all
Unified · Split
| @@ -393,15 +393,13 @@ extern cpumask_t cpu_present_map; · 392 unmodified lines | ||
| 393 | 393 | #define for_each_present_cpu(cpu) for_each_cpu_mask((cpu), cpu_present_map) |
| 394 | 394 | |
| 395 | 395 | /* Find the highest possible smp_processor_id() */ |
| 396 | −static inline unsigned int highest_possible_processor_id(void) | |
| 397 | −{ | |
| 398 | − unsigned int cpu, highest = 0; | |
| 399 | − | |
| 400 | − for_each_cpu_mask(cpu, cpu_possible_map) | |
| 401 | − highest = cpu; | |
| 402 | − | |
| 403 | − return highest; | |
| 404 | −} | |
| 396 | +#define highest_possible_processor_id() \ | |
| 397 | +({ \ | |
| 398 | + unsigned int cpu, highest = 0; \ | |
| 399 | + for_each_cpu_mask(cpu, cpu_possible_map) \ | |
| 400 | + highest = cpu; \ | |
| 401 | + highest; \ | |
| 402 | +}) | |
| 405 | 403 | |
| 406 | 404 | |
| 407 | 405 | #endif /* __LINUX_CPUMASK_H */ |