diff options
Diffstat (limited to 'include/linux/cpumask.h')
| -rw-r--r-- | include/linux/cpumask.h | 221 |
1 files changed, 91 insertions, 130 deletions
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index d4bf52603e6b..9f315382610b 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h | |||
| @@ -144,6 +144,7 @@ | |||
| 144 | typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t; | 144 | typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t; |
| 145 | extern cpumask_t _unused_cpumask_arg_; | 145 | extern cpumask_t _unused_cpumask_arg_; |
| 146 | 146 | ||
| 147 | #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | ||
| 147 | #define cpu_set(cpu, dst) __cpu_set((cpu), &(dst)) | 148 | #define cpu_set(cpu, dst) __cpu_set((cpu), &(dst)) |
| 148 | static inline void __cpu_set(int cpu, volatile cpumask_t *dstp) | 149 | static inline void __cpu_set(int cpu, volatile cpumask_t *dstp) |
| 149 | { | 150 | { |
| @@ -267,6 +268,26 @@ static inline void __cpus_shift_left(cpumask_t *dstp, | |||
| 267 | { | 268 | { |
| 268 | bitmap_shift_left(dstp->bits, srcp->bits, n, nbits); | 269 | bitmap_shift_left(dstp->bits, srcp->bits, n, nbits); |
| 269 | } | 270 | } |
| 271 | #endif /* !CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS */ | ||
| 272 | |||
| 273 | /** | ||
| 274 | * to_cpumask - convert an NR_CPUS bitmap to a struct cpumask * | ||
| 275 | * @bitmap: the bitmap | ||
| 276 | * | ||
| 277 | * There are a few places where cpumask_var_t isn't appropriate and | ||
| 278 | * static cpumasks must be used (eg. very early boot), yet we don't | ||
| 279 | * expose the definition of 'struct cpumask'. | ||
| 280 | * | ||
| 281 | * This does the conversion, and can be used as a constant initializer. | ||
| 282 | */ | ||
| 283 | #define to_cpumask(bitmap) \ | ||
| 284 | ((struct cpumask *)(1 ? (bitmap) \ | ||
| 285 | : (void *)sizeof(__check_is_bitmap(bitmap)))) | ||
| 286 | |||
| 287 | static inline int __check_is_bitmap(const unsigned long *bitmap) | ||
| 288 | { | ||
| 289 | return 1; | ||
| 290 | } | ||
| 270 | 291 | ||
| 271 | /* | 292 | /* |
| 272 | * Special-case data structure for "single bit set only" constant CPU masks. | 293 | * Special-case data structure for "single bit set only" constant CPU masks. |
| @@ -278,13 +299,14 @@ static inline void __cpus_shift_left(cpumask_t *dstp, | |||
| 278 | extern const unsigned long | 299 | extern const unsigned long |
| 279 | cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)]; | 300 | cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)]; |
| 280 | 301 | ||
| 281 | static inline const cpumask_t *get_cpu_mask(unsigned int cpu) | 302 | static inline const struct cpumask *get_cpu_mask(unsigned int cpu) |
| 282 | { | 303 | { |
| 283 | const unsigned long *p = cpu_bit_bitmap[1 + cpu % BITS_PER_LONG]; | 304 | const unsigned long *p = cpu_bit_bitmap[1 + cpu % BITS_PER_LONG]; |
| 284 | p -= cpu / BITS_PER_LONG; | 305 | p -= cpu / BITS_PER_LONG; |
| 285 | return (const cpumask_t *)p; | 306 | return to_cpumask(p); |
| 286 | } | 307 | } |
| 287 | 308 | ||
| 309 | #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | ||
| 288 | /* | 310 | /* |
| 289 | * In cases where we take the address of the cpumask immediately, | 311 | * In cases where we take the address of the cpumask immediately, |
| 290 | * gcc optimizes it out (it's a constant) and there's no huge stack | 312 | * gcc optimizes it out (it's a constant) and there's no huge stack |
| @@ -370,19 +392,22 @@ static inline void __cpus_fold(cpumask_t *dstp, const cpumask_t *origp, | |||
| 370 | { | 392 | { |
| 371 | bitmap_fold(dstp->bits, origp->bits, sz, nbits); | 393 | bitmap_fold(dstp->bits, origp->bits, sz, nbits); |
| 372 | } | 394 | } |
| 395 | #endif /* !CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS */ | ||
| 373 | 396 | ||
| 374 | #if NR_CPUS == 1 | 397 | #if NR_CPUS == 1 |
| 375 | 398 | ||
| 376 | #define nr_cpu_ids 1 | 399 | #define nr_cpu_ids 1 |
| 400 | #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | ||
| 377 | #define first_cpu(src) ({ (void)(src); 0; }) | 401 | #define first_cpu(src) ({ (void)(src); 0; }) |
| 378 | #define next_cpu(n, src) ({ (void)(src); 1; }) | 402 | #define next_cpu(n, src) ({ (void)(src); 1; }) |
| 379 | #define any_online_cpu(mask) 0 | 403 | #define any_online_cpu(mask) 0 |
| 380 | #define for_each_cpu_mask(cpu, mask) \ | 404 | #define for_each_cpu_mask(cpu, mask) \ |
| 381 | for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) | 405 | for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) |
| 382 | 406 | #endif /* !CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS */ | |
| 383 | #else /* NR_CPUS > 1 */ | 407 | #else /* NR_CPUS > 1 */ |
| 384 | 408 | ||
| 385 | extern int nr_cpu_ids; | 409 | extern int nr_cpu_ids; |
| 410 | #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | ||
| 386 | int __first_cpu(const cpumask_t *srcp); | 411 | int __first_cpu(const cpumask_t *srcp); |
| 387 | int __next_cpu(int n, const cpumask_t *srcp); | 412 | int __next_cpu(int n, const cpumask_t *srcp); |
| 388 | int __any_online_cpu(const cpumask_t *mask); | 413 | int __any_online_cpu(const cpumask_t *mask); |
| @@ -394,8 +419,10 @@ int __any_online_cpu(const cpumask_t *mask); | |||
| 394 | for ((cpu) = -1; \ | 419 | for ((cpu) = -1; \ |
| 395 | (cpu) = next_cpu((cpu), (mask)), \ | 420 | (cpu) = next_cpu((cpu), (mask)), \ |
| 396 | (cpu) < NR_CPUS; ) | 421 | (cpu) < NR_CPUS; ) |
| 422 | #endif /* !CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS */ | ||
| 397 | #endif | 423 | #endif |
| 398 | 424 | ||
| 425 | #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | ||
| 399 | #if NR_CPUS <= 64 | 426 | #if NR_CPUS <= 64 |
| 400 | 427 | ||
| 401 | #define next_cpu_nr(n, src) next_cpu(n, src) | 428 | #define next_cpu_nr(n, src) next_cpu(n, src) |
| @@ -413,77 +440,67 @@ int __next_cpu_nr(int n, const cpumask_t *srcp); | |||
| 413 | (cpu) < nr_cpu_ids; ) | 440 | (cpu) < nr_cpu_ids; ) |
| 414 | 441 | ||
| 415 | #endif /* NR_CPUS > 64 */ | 442 | #endif /* NR_CPUS > 64 */ |
| 443 | #endif /* !CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS */ | ||
| 416 | 444 | ||
| 417 | /* | 445 | /* |
| 418 | * The following particular system cpumasks and operations manage | 446 | * The following particular system cpumasks and operations manage |
| 419 | * possible, present, active and online cpus. Each of them is a fixed size | 447 | * possible, present, active and online cpus. |
| 420 | * bitmap of size NR_CPUS. | ||
| 421 | * | 448 | * |
| 422 | * #ifdef CONFIG_HOTPLUG_CPU | 449 | * cpu_possible_mask- has bit 'cpu' set iff cpu is populatable |
| 423 | * cpu_possible_map - has bit 'cpu' set iff cpu is populatable | 450 | * cpu_present_mask - has bit 'cpu' set iff cpu is populated |
| 424 | * cpu_present_map - has bit 'cpu' set iff cpu is populated | 451 | * cpu_online_mask - has bit 'cpu' set iff cpu available to scheduler |
| 425 | * cpu_online_map - has bit 'cpu' set iff cpu available to scheduler | 452 | * cpu_active_mask - has bit 'cpu' set iff cpu available to migration |
| 426 | * cpu_active_map - has bit 'cpu' set iff cpu available to migration | ||
| 427 | * #else | ||
| 428 | * cpu_possible_map - has bit 'cpu' set iff cpu is populated | ||
| 429 | * cpu_present_map - copy of cpu_possible_map | ||
| 430 | * cpu_online_map - has bit 'cpu' set iff cpu available to scheduler | ||
| 431 | * #endif | ||
| 432 | * | 453 | * |
| 433 | * In either case, NR_CPUS is fixed at compile time, as the static | 454 | * If !CONFIG_HOTPLUG_CPU, present == possible, and active == online. |
| 434 | * size of these bitmaps. The cpu_possible_map is fixed at boot | ||
| 435 | * time, as the set of CPU id's that it is possible might ever | ||
| 436 | * be plugged in at anytime during the life of that system boot. | ||
| 437 | * The cpu_present_map is dynamic(*), representing which CPUs | ||
| 438 | * are currently plugged in. And cpu_online_map is the dynamic | ||
| 439 | * subset of cpu_present_map, indicating those CPUs available | ||
| 440 | * for scheduling. | ||
| 441 | * | 455 | * |
| 442 | * If HOTPLUG is enabled, then cpu_possible_map is forced to have | 456 | * The cpu_possible_mask is fixed at boot time, as the set of CPU id's |
| 457 | * that it is possible might ever be plugged in at anytime during the | ||
| 458 | * life of that system boot. The cpu_present_mask is dynamic(*), | ||
| 459 | * representing which CPUs are currently plugged in. And | ||
| 460 | * cpu_online_mask is the dynamic subset of cpu_present_mask, | ||
| 461 | * indicating those CPUs available for scheduling. | ||
| 462 | * | ||
| 463 | * If HOTPLUG is enabled, then cpu_possible_mask is forced to have | ||
| 443 | * all NR_CPUS bits set, otherwise it is just the set of CPUs that | 464 | * all NR_CPUS bits set, otherwise it is just the set of CPUs that |
| 444 | * ACPI reports present at boot. | 465 | * ACPI reports present at boot. |
| 445 | * | 466 | * |
| 446 | * If HOTPLUG is enabled, then cpu_present_map varies dynamically, | 467 | * If HOTPLUG is enabled, then cpu_present_mask varies dynamically, |
| 447 | * depending on what ACPI reports as currently plugged in, otherwise | 468 | * depending on what ACPI reports as currently plugged in, otherwise |
| 448 | * cpu_present_map is just a copy of cpu_possible_map. | 469 | * cpu_present_mask is just a copy of cpu_possible_mask. |
| 449 | * | 470 | * |
| 450 | * (*) Well, cpu_present_map is dynamic in the hotplug case. If not | 471 | * (*) Well, cpu_present_mask is dynamic in the hotplug case. If not |
| 451 | * hotplug, it's a copy of cpu_possible_map, hence fixed at boot. | 472 | * hotplug, it's a copy of cpu_possible_mask, hence fixed at boot. |
| 452 | * | 473 | * |
| 453 | * Subtleties: | 474 | * Subtleties: |
| 454 | * 1) UP arch's (NR_CPUS == 1, CONFIG_SMP not defined) hardcode | 475 | * 1) UP arch's (NR_CPUS == 1, CONFIG_SMP not defined) hardcode |
| 455 | * assumption that their single CPU is online. The UP | 476 | * assumption that their single CPU is online. The UP |
| 456 | * cpu_{online,possible,present}_maps are placebos. Changing them | 477 | * cpu_{online,possible,present}_masks are placebos. Changing them |
| 457 | * will have no useful affect on the following num_*_cpus() | 478 | * will have no useful affect on the following num_*_cpus() |
| 458 | * and cpu_*() macros in the UP case. This ugliness is a UP | 479 | * and cpu_*() macros in the UP case. This ugliness is a UP |
| 459 | * optimization - don't waste any instructions or memory references | 480 | * optimization - don't waste any instructions or memory references |
| 460 | * asking if you're online or how many CPUs there are if there is | 481 | * asking if you're online or how many CPUs there are if there is |
| 461 | * only one CPU. | 482 | * only one CPU. |
| 462 | * 2) Most SMP arch's #define some of these maps to be some | ||
| 463 | * other map specific to that arch. Therefore, the following | ||
| 464 | * must be #define macros, not inlines. To see why, examine | ||
| 465 | * the assembly code produced by the following. Note that | ||
| 466 | * set1() writes phys_x_map, but set2() writes x_map: | ||
| 467 | * int x_map, phys_x_map; | ||
| 468 | * #define set1(a) x_map = a | ||
| 469 | * inline void set2(int a) { x_map = a; } | ||
| 470 | * #define x_map phys_x_map | ||
| 471 | * main(){ set1(3); set2(5); } | ||
| 472 | */ | 483 | */ |
| 473 | 484 | ||
| 474 | extern cpumask_t cpu_possible_map; | 485 | extern const struct cpumask *const cpu_possible_mask; |
| 475 | extern cpumask_t cpu_online_map; | 486 | extern const struct cpumask *const cpu_online_mask; |
| 476 | extern cpumask_t cpu_present_map; | 487 | extern const struct cpumask *const cpu_present_mask; |
| 477 | extern cpumask_t cpu_active_map; | 488 | extern const struct cpumask *const cpu_active_mask; |
| 489 | |||
| 490 | /* These strip const, as traditionally they weren't const. */ | ||
| 491 | #define cpu_possible_map (*(cpumask_t *)cpu_possible_mask) | ||
| 492 | #define cpu_online_map (*(cpumask_t *)cpu_online_mask) | ||
| 493 | #define cpu_present_map (*(cpumask_t *)cpu_present_mask) | ||
| 494 | #define cpu_active_map (*(cpumask_t *)cpu_active_mask) | ||
| 478 | 495 | ||
| 479 | #if NR_CPUS > 1 | 496 | #if NR_CPUS > 1 |
| 480 | #define num_online_cpus() cpus_weight_nr(cpu_online_map) | 497 | #define num_online_cpus() cpumask_weight(cpu_online_mask) |
| 481 | #define num_possible_cpus() cpus_weight_nr(cpu_possible_map) | 498 | #define num_possible_cpus() cpumask_weight(cpu_possible_mask) |
| 482 | #define num_present_cpus() cpus_weight_nr(cpu_present_map) | 499 | #define num_present_cpus() cpumask_weight(cpu_present_mask) |
| 483 | #define cpu_online(cpu) cpu_isset((cpu), cpu_online_map) | 500 | #define cpu_online(cpu) cpumask_test_cpu((cpu), cpu_online_mask) |
| 484 | #define cpu_possible(cpu) cpu_isset((cpu), cpu_possible_map) | 501 | #define cpu_possible(cpu) cpumask_test_cpu((cpu), cpu_possible_mask) |
| 485 | #define cpu_present(cpu) cpu_isset((cpu), cpu_present_map) | 502 | #define cpu_present(cpu) cpumask_test_cpu((cpu), cpu_present_mask) |
| 486 | #define cpu_active(cpu) cpu_isset((cpu), cpu_active_map) | 503 | #define cpu_active(cpu) cpumask_test_cpu((cpu), cpu_active_mask) |
| 487 | #else | 504 | #else |
| 488 | #define num_online_cpus() 1 | 505 | #define num_online_cpus() 1 |
| 489 | #define num_possible_cpus() 1 | 506 | #define num_possible_cpus() 1 |
| @@ -496,10 +513,6 @@ extern cpumask_t cpu_active_map; | |||
| 496 | 513 | ||
| 497 | #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu)) | 514 | #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu)) |
| 498 | 515 | ||
| 499 | #define for_each_possible_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_possible_map) | ||
| 500 | #define for_each_online_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_online_map) | ||
| 501 | #define for_each_present_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_present_map) | ||
| 502 | |||
| 503 | /* These are the new versions of the cpumask operators: passed by pointer. | 516 | /* These are the new versions of the cpumask operators: passed by pointer. |
| 504 | * The older versions will be implemented in terms of these, then deleted. */ | 517 | * The older versions will be implemented in terms of these, then deleted. */ |
| 505 | #define cpumask_bits(maskp) ((maskp)->bits) | 518 | #define cpumask_bits(maskp) ((maskp)->bits) |
| @@ -687,7 +700,7 @@ static inline void cpumask_clear_cpu(int cpu, struct cpumask *dstp) | |||
| 687 | * No static inline type checking - see Subtlety (1) above. | 700 | * No static inline type checking - see Subtlety (1) above. |
| 688 | */ | 701 | */ |
| 689 | #define cpumask_test_cpu(cpu, cpumask) \ | 702 | #define cpumask_test_cpu(cpu, cpumask) \ |
| 690 | test_bit(cpumask_check(cpu), (cpumask)->bits) | 703 | test_bit(cpumask_check(cpu), cpumask_bits((cpumask))) |
| 691 | 704 | ||
| 692 | /** | 705 | /** |
| 693 | * cpumask_test_and_set_cpu - atomically test and set a cpu in a cpumask | 706 | * cpumask_test_and_set_cpu - atomically test and set a cpu in a cpumask |
| @@ -930,7 +943,7 @@ static inline void cpumask_copy(struct cpumask *dstp, | |||
| 930 | static inline int cpumask_scnprintf(char *buf, int len, | 943 | static inline int cpumask_scnprintf(char *buf, int len, |
| 931 | const struct cpumask *srcp) | 944 | const struct cpumask *srcp) |
| 932 | { | 945 | { |
| 933 | return bitmap_scnprintf(buf, len, srcp->bits, nr_cpumask_bits); | 946 | return bitmap_scnprintf(buf, len, cpumask_bits(srcp), nr_cpumask_bits); |
| 934 | } | 947 | } |
| 935 | 948 | ||
| 936 | /** | 949 | /** |
| @@ -944,7 +957,7 @@ static inline int cpumask_scnprintf(char *buf, int len, | |||
| 944 | static inline int cpumask_parse_user(const char __user *buf, int len, | 957 | static inline int cpumask_parse_user(const char __user *buf, int len, |
| 945 | struct cpumask *dstp) | 958 | struct cpumask *dstp) |
| 946 | { | 959 | { |
| 947 | return bitmap_parse_user(buf, len, dstp->bits, nr_cpumask_bits); | 960 | return bitmap_parse_user(buf, len, cpumask_bits(dstp), nr_cpumask_bits); |
| 948 | } | 961 | } |
| 949 | 962 | ||
| 950 | /** | 963 | /** |
| @@ -959,7 +972,8 @@ static inline int cpumask_parse_user(const char __user *buf, int len, | |||
| 959 | static inline int cpulist_scnprintf(char *buf, int len, | 972 | static inline int cpulist_scnprintf(char *buf, int len, |
| 960 | const struct cpumask *srcp) | 973 | const struct cpumask *srcp) |
| 961 | { | 974 | { |
| 962 | return bitmap_scnlistprintf(buf, len, srcp->bits, nr_cpumask_bits); | 975 | return bitmap_scnlistprintf(buf, len, cpumask_bits(srcp), |
| 976 | nr_cpumask_bits); | ||
| 963 | } | 977 | } |
| 964 | 978 | ||
| 965 | /** | 979 | /** |
| @@ -972,26 +986,7 @@ static inline int cpulist_scnprintf(char *buf, int len, | |||
| 972 | */ | 986 | */ |
| 973 | static inline int cpulist_parse(const char *buf, struct cpumask *dstp) | 987 | static inline int cpulist_parse(const char *buf, struct cpumask *dstp) |
| 974 | { | 988 | { |
| 975 | return bitmap_parselist(buf, dstp->bits, nr_cpumask_bits); | 989 | return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpumask_bits); |
| 976 | } | ||
| 977 | |||
| 978 | /** | ||
| 979 | * to_cpumask - convert an NR_CPUS bitmap to a struct cpumask * | ||
| 980 | * @bitmap: the bitmap | ||
| 981 | * | ||
| 982 | * There are a few places where cpumask_var_t isn't appropriate and | ||
| 983 | * static cpumasks must be used (eg. very early boot), yet we don't | ||
| 984 | * expose the definition of 'struct cpumask'. | ||
| 985 | * | ||
| 986 | * This does the conversion, and can be used as a constant initializer. | ||
| 987 | */ | ||
| 988 | #define to_cpumask(bitmap) \ | ||
| 989 | ((struct cpumask *)(1 ? (bitmap) \ | ||
| 990 | : (void *)sizeof(__check_is_bitmap(bitmap)))) | ||
| 991 | |||
| 992 | static inline int __check_is_bitmap(const unsigned long *bitmap) | ||
| 993 | { | ||
| 994 | return 1; | ||
| 995 | } | 990 | } |
| 996 | 991 | ||
| 997 | /** | 992 | /** |
| @@ -1025,6 +1020,7 @@ static inline size_t cpumask_size(void) | |||
| 1025 | #ifdef CONFIG_CPUMASK_OFFSTACK | 1020 | #ifdef CONFIG_CPUMASK_OFFSTACK |
| 1026 | typedef struct cpumask *cpumask_var_t; | 1021 | typedef struct cpumask *cpumask_var_t; |
| 1027 | 1022 | ||
| 1023 | bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node); | ||
| 1028 | bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags); | 1024 | bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags); |
| 1029 | void alloc_bootmem_cpumask_var(cpumask_var_t *mask); | 1025 | void alloc_bootmem_cpumask_var(cpumask_var_t *mask); |
| 1030 | void free_cpumask_var(cpumask_var_t mask); | 1026 | void free_cpumask_var(cpumask_var_t mask); |
| @@ -1038,6 +1034,12 @@ static inline bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags) | |||
| 1038 | return true; | 1034 | return true; |
| 1039 | } | 1035 | } |
| 1040 | 1036 | ||
| 1037 | static inline bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, | ||
| 1038 | int node) | ||
| 1039 | { | ||
| 1040 | return true; | ||
| 1041 | } | ||
| 1042 | |||
| 1041 | static inline void alloc_bootmem_cpumask_var(cpumask_var_t *mask) | 1043 | static inline void alloc_bootmem_cpumask_var(cpumask_var_t *mask) |
| 1042 | { | 1044 | { |
| 1043 | } | 1045 | } |
| @@ -1051,12 +1053,6 @@ static inline void free_bootmem_cpumask_var(cpumask_var_t mask) | |||
| 1051 | } | 1053 | } |
| 1052 | #endif /* CONFIG_CPUMASK_OFFSTACK */ | 1054 | #endif /* CONFIG_CPUMASK_OFFSTACK */ |
| 1053 | 1055 | ||
| 1054 | /* The pointer versions of the maps, these will become the primary versions. */ | ||
| 1055 | #define cpu_possible_mask ((const struct cpumask *)&cpu_possible_map) | ||
| 1056 | #define cpu_online_mask ((const struct cpumask *)&cpu_online_map) | ||
| 1057 | #define cpu_present_mask ((const struct cpumask *)&cpu_present_map) | ||
| 1058 | #define cpu_active_mask ((const struct cpumask *)&cpu_active_map) | ||
| 1059 | |||
| 1060 | /* It's common to want to use cpu_all_mask in struct member initializers, | 1056 | /* It's common to want to use cpu_all_mask in struct member initializers, |
| 1061 | * so it has to refer to an address rather than a pointer. */ | 1057 | * so it has to refer to an address rather than a pointer. */ |
| 1062 | extern const DECLARE_BITMAP(cpu_all_bits, NR_CPUS); | 1058 | extern const DECLARE_BITMAP(cpu_all_bits, NR_CPUS); |
| @@ -1065,51 +1061,16 @@ extern const DECLARE_BITMAP(cpu_all_bits, NR_CPUS); | |||
| 1065 | /* First bits of cpu_bit_bitmap are in fact unset. */ | 1061 | /* First bits of cpu_bit_bitmap are in fact unset. */ |
| 1066 | #define cpu_none_mask to_cpumask(cpu_bit_bitmap[0]) | 1062 | #define cpu_none_mask to_cpumask(cpu_bit_bitmap[0]) |
| 1067 | 1063 | ||
| 1068 | /* Wrappers for arch boot code to manipulate normally-constant masks */ | 1064 | #define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask) |
| 1069 | static inline void set_cpu_possible(unsigned int cpu, bool possible) | 1065 | #define for_each_online_cpu(cpu) for_each_cpu((cpu), cpu_online_mask) |
| 1070 | { | 1066 | #define for_each_present_cpu(cpu) for_each_cpu((cpu), cpu_present_mask) |
| 1071 | if (possible) | ||
| 1072 | cpumask_set_cpu(cpu, &cpu_possible_map); | ||
| 1073 | else | ||
| 1074 | cpumask_clear_cpu(cpu, &cpu_possible_map); | ||
| 1075 | } | ||
| 1076 | |||
| 1077 | static inline void set_cpu_present(unsigned int cpu, bool present) | ||
| 1078 | { | ||
| 1079 | if (present) | ||
| 1080 | cpumask_set_cpu(cpu, &cpu_present_map); | ||
| 1081 | else | ||
| 1082 | cpumask_clear_cpu(cpu, &cpu_present_map); | ||
| 1083 | } | ||
| 1084 | |||
| 1085 | static inline void set_cpu_online(unsigned int cpu, bool online) | ||
| 1086 | { | ||
| 1087 | if (online) | ||
| 1088 | cpumask_set_cpu(cpu, &cpu_online_map); | ||
| 1089 | else | ||
| 1090 | cpumask_clear_cpu(cpu, &cpu_online_map); | ||
| 1091 | } | ||
| 1092 | 1067 | ||
| 1093 | static inline void set_cpu_active(unsigned int cpu, bool active) | 1068 | /* Wrappers for arch boot code to manipulate normally-constant masks */ |
| 1094 | { | 1069 | void set_cpu_possible(unsigned int cpu, bool possible); |
| 1095 | if (active) | 1070 | void set_cpu_present(unsigned int cpu, bool present); |
| 1096 | cpumask_set_cpu(cpu, &cpu_active_map); | 1071 | void set_cpu_online(unsigned int cpu, bool online); |
| 1097 | else | 1072 | void set_cpu_active(unsigned int cpu, bool active); |
| 1098 | cpumask_clear_cpu(cpu, &cpu_active_map); | 1073 | void init_cpu_present(const struct cpumask *src); |
| 1099 | } | 1074 | void init_cpu_possible(const struct cpumask *src); |
| 1100 | 1075 | void init_cpu_online(const struct cpumask *src); | |
| 1101 | static inline void init_cpu_present(const struct cpumask *src) | ||
| 1102 | { | ||
| 1103 | cpumask_copy(&cpu_present_map, src); | ||
| 1104 | } | ||
| 1105 | |||
| 1106 | static inline void init_cpu_possible(const struct cpumask *src) | ||
| 1107 | { | ||
| 1108 | cpumask_copy(&cpu_possible_map, src); | ||
| 1109 | } | ||
| 1110 | |||
| 1111 | static inline void init_cpu_online(const struct cpumask *src) | ||
| 1112 | { | ||
| 1113 | cpumask_copy(&cpu_online_map, src); | ||
| 1114 | } | ||
| 1115 | #endif /* __LINUX_CPUMASK_H */ | 1076 | #endif /* __LINUX_CPUMASK_H */ |
