cpumask: switch over to cpu_online/possible/active/present_mask: core
Impact: cleanup This implements the obsolescent cpu_online_map in terms of cpu_online_mask, rather than the other way around. Same for the other maps. The documentation comments are also updated to refer to _mask rather than _map. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Mike Travis <travis@sgi.com>
This commit is contained in:
@@ -416,65 +416,54 @@ int __next_cpu_nr(int n, const cpumask_t *srcp);
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* The following particular system cpumasks and operations manage
|
* The following particular system cpumasks and operations manage
|
||||||
* possible, present, active and online cpus. Each of them is a fixed size
|
* possible, present, active and online cpus.
|
||||||
* bitmap of size NR_CPUS.
|
|
||||||
*
|
*
|
||||||
* #ifdef CONFIG_HOTPLUG_CPU
|
* cpu_possible_mask- has bit 'cpu' set iff cpu is populatable
|
||||||
* cpu_possible_map - has bit 'cpu' set iff cpu is populatable
|
* cpu_present_mask - has bit 'cpu' set iff cpu is populated
|
||||||
* cpu_present_map - has bit 'cpu' set iff cpu is populated
|
* cpu_online_mask - has bit 'cpu' set iff cpu available to scheduler
|
||||||
* cpu_online_map - has bit 'cpu' set iff cpu available to scheduler
|
* cpu_active_mask - has bit 'cpu' set iff cpu available to migration
|
||||||
* cpu_active_map - has bit 'cpu' set iff cpu available to migration
|
|
||||||
* #else
|
|
||||||
* cpu_possible_map - has bit 'cpu' set iff cpu is populated
|
|
||||||
* cpu_present_map - copy of cpu_possible_map
|
|
||||||
* cpu_online_map - has bit 'cpu' set iff cpu available to scheduler
|
|
||||||
* #endif
|
|
||||||
*
|
*
|
||||||
* In either case, NR_CPUS is fixed at compile time, as the static
|
* If !CONFIG_HOTPLUG_CPU, present == possible, and active == online.
|
||||||
* size of these bitmaps. The cpu_possible_map is fixed at boot
|
|
||||||
* time, as the set of CPU id's that it is possible might ever
|
|
||||||
* be plugged in at anytime during the life of that system boot.
|
|
||||||
* The cpu_present_map is dynamic(*), representing which CPUs
|
|
||||||
* are currently plugged in. And cpu_online_map is the dynamic
|
|
||||||
* subset of cpu_present_map, indicating those CPUs available
|
|
||||||
* for scheduling.
|
|
||||||
*
|
*
|
||||||
* If HOTPLUG is enabled, then cpu_possible_map is forced to have
|
* The cpu_possible_mask is fixed at boot time, as the set of CPU id's
|
||||||
|
* that it is possible might ever be plugged in at anytime during the
|
||||||
|
* life of that system boot. The cpu_present_mask is dynamic(*),
|
||||||
|
* representing which CPUs are currently plugged in. And
|
||||||
|
* cpu_online_mask is the dynamic subset of cpu_present_mask,
|
||||||
|
* indicating those CPUs available for scheduling.
|
||||||
|
*
|
||||||
|
* If HOTPLUG is enabled, then cpu_possible_mask is forced to have
|
||||||
* all NR_CPUS bits set, otherwise it is just the set of CPUs that
|
* all NR_CPUS bits set, otherwise it is just the set of CPUs that
|
||||||
* ACPI reports present at boot.
|
* ACPI reports present at boot.
|
||||||
*
|
*
|
||||||
* If HOTPLUG is enabled, then cpu_present_map varies dynamically,
|
* If HOTPLUG is enabled, then cpu_present_mask varies dynamically,
|
||||||
* depending on what ACPI reports as currently plugged in, otherwise
|
* depending on what ACPI reports as currently plugged in, otherwise
|
||||||
* cpu_present_map is just a copy of cpu_possible_map.
|
* cpu_present_mask is just a copy of cpu_possible_mask.
|
||||||
*
|
*
|
||||||
* (*) Well, cpu_present_map is dynamic in the hotplug case. If not
|
* (*) Well, cpu_present_mask is dynamic in the hotplug case. If not
|
||||||
* hotplug, it's a copy of cpu_possible_map, hence fixed at boot.
|
* hotplug, it's a copy of cpu_possible_mask, hence fixed at boot.
|
||||||
*
|
*
|
||||||
* Subtleties:
|
* Subtleties:
|
||||||
* 1) UP arch's (NR_CPUS == 1, CONFIG_SMP not defined) hardcode
|
* 1) UP arch's (NR_CPUS == 1, CONFIG_SMP not defined) hardcode
|
||||||
* assumption that their single CPU is online. The UP
|
* assumption that their single CPU is online. The UP
|
||||||
* cpu_{online,possible,present}_maps are placebos. Changing them
|
* cpu_{online,possible,present}_masks are placebos. Changing them
|
||||||
* will have no useful affect on the following num_*_cpus()
|
* will have no useful affect on the following num_*_cpus()
|
||||||
* and cpu_*() macros in the UP case. This ugliness is a UP
|
* and cpu_*() macros in the UP case. This ugliness is a UP
|
||||||
* optimization - don't waste any instructions or memory references
|
* optimization - don't waste any instructions or memory references
|
||||||
* asking if you're online or how many CPUs there are if there is
|
* asking if you're online or how many CPUs there are if there is
|
||||||
* only one CPU.
|
* only one CPU.
|
||||||
* 2) Most SMP arch's #define some of these maps to be some
|
|
||||||
* other map specific to that arch. Therefore, the following
|
|
||||||
* must be #define macros, not inlines. To see why, examine
|
|
||||||
* the assembly code produced by the following. Note that
|
|
||||||
* set1() writes phys_x_map, but set2() writes x_map:
|
|
||||||
* int x_map, phys_x_map;
|
|
||||||
* #define set1(a) x_map = a
|
|
||||||
* inline void set2(int a) { x_map = a; }
|
|
||||||
* #define x_map phys_x_map
|
|
||||||
* main(){ set1(3); set2(5); }
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern cpumask_t cpu_possible_map;
|
extern const struct cpumask *const cpu_possible_mask;
|
||||||
extern cpumask_t cpu_online_map;
|
extern const struct cpumask *const cpu_online_mask;
|
||||||
extern cpumask_t cpu_present_map;
|
extern const struct cpumask *const cpu_present_mask;
|
||||||
extern cpumask_t cpu_active_map;
|
extern const struct cpumask *const cpu_active_mask;
|
||||||
|
|
||||||
|
/* These strip const, as traditionally they weren't const. */
|
||||||
|
#define cpu_possible_map (*(cpumask_t *)cpu_possible_mask)
|
||||||
|
#define cpu_online_map (*(cpumask_t *)cpu_online_mask)
|
||||||
|
#define cpu_present_map (*(cpumask_t *)cpu_present_mask)
|
||||||
|
#define cpu_active_map (*(cpumask_t *)cpu_active_mask)
|
||||||
|
|
||||||
#if NR_CPUS > 1
|
#if NR_CPUS > 1
|
||||||
#define num_online_cpus() cpus_weight_nr(cpu_online_map)
|
#define num_online_cpus() cpus_weight_nr(cpu_online_map)
|
||||||
@@ -1058,12 +1047,6 @@ static inline void free_bootmem_cpumask_var(cpumask_var_t mask)
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_CPUMASK_OFFSTACK */
|
#endif /* CONFIG_CPUMASK_OFFSTACK */
|
||||||
|
|
||||||
/* The pointer versions of the maps, these will become the primary versions. */
|
|
||||||
#define cpu_possible_mask ((const struct cpumask *)&cpu_possible_map)
|
|
||||||
#define cpu_online_mask ((const struct cpumask *)&cpu_online_map)
|
|
||||||
#define cpu_present_mask ((const struct cpumask *)&cpu_present_map)
|
|
||||||
#define cpu_active_mask ((const struct cpumask *)&cpu_active_map)
|
|
||||||
|
|
||||||
/* It's common to want to use cpu_all_mask in struct member initializers,
|
/* It's common to want to use cpu_all_mask in struct member initializers,
|
||||||
* so it has to refer to an address rather than a pointer. */
|
* so it has to refer to an address rather than a pointer. */
|
||||||
extern const DECLARE_BITMAP(cpu_all_bits, NR_CPUS);
|
extern const DECLARE_BITMAP(cpu_all_bits, NR_CPUS);
|
||||||
|
49
kernel/cpu.c
49
kernel/cpu.c
@@ -15,30 +15,8 @@
|
|||||||
#include <linux/stop_machine.h>
|
#include <linux/stop_machine.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* Represents all cpu's present in the system
|
|
||||||
* In systems capable of hotplug, this map could dynamically grow
|
|
||||||
* as new cpu's are detected in the system via any platform specific
|
|
||||||
* method, such as ACPI for e.g.
|
|
||||||
*/
|
|
||||||
cpumask_t cpu_present_map __read_mostly;
|
|
||||||
EXPORT_SYMBOL(cpu_present_map);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Represents all cpu's that are currently online.
|
|
||||||
*/
|
|
||||||
cpumask_t cpu_online_map __read_mostly;
|
|
||||||
EXPORT_SYMBOL(cpu_online_map);
|
|
||||||
|
|
||||||
#ifdef CONFIG_INIT_ALL_POSSIBLE
|
|
||||||
cpumask_t cpu_possible_map __read_mostly = CPU_MASK_ALL;
|
|
||||||
#else
|
|
||||||
cpumask_t cpu_possible_map __read_mostly;
|
|
||||||
#endif
|
|
||||||
EXPORT_SYMBOL(cpu_possible_map);
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/* Serializes the updates to cpu_online_map, cpu_present_map */
|
/* Serializes the updates to cpu_online_mask, cpu_present_mask */
|
||||||
static DEFINE_MUTEX(cpu_add_remove_lock);
|
static DEFINE_MUTEX(cpu_add_remove_lock);
|
||||||
|
|
||||||
static __cpuinitdata RAW_NOTIFIER_HEAD(cpu_chain);
|
static __cpuinitdata RAW_NOTIFIER_HEAD(cpu_chain);
|
||||||
@@ -65,8 +43,6 @@ void __init cpu_hotplug_init(void)
|
|||||||
cpu_hotplug.refcount = 0;
|
cpu_hotplug.refcount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpumask_t cpu_active_map;
|
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
|
||||||
void get_online_cpus(void)
|
void get_online_cpus(void)
|
||||||
@@ -97,7 +73,7 @@ EXPORT_SYMBOL_GPL(put_online_cpus);
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* The following two API's must be used when attempting
|
* The following two API's must be used when attempting
|
||||||
* to serialize the updates to cpu_online_map, cpu_present_map.
|
* to serialize the updates to cpu_online_mask, cpu_present_mask.
|
||||||
*/
|
*/
|
||||||
void cpu_maps_update_begin(void)
|
void cpu_maps_update_begin(void)
|
||||||
{
|
{
|
||||||
@@ -503,3 +479,24 @@ EXPORT_SYMBOL_GPL(cpu_bit_bitmap);
|
|||||||
|
|
||||||
const DECLARE_BITMAP(cpu_all_bits, NR_CPUS) = CPU_BITS_ALL;
|
const DECLARE_BITMAP(cpu_all_bits, NR_CPUS) = CPU_BITS_ALL;
|
||||||
EXPORT_SYMBOL(cpu_all_bits);
|
EXPORT_SYMBOL(cpu_all_bits);
|
||||||
|
|
||||||
|
#ifdef CONFIG_INIT_ALL_POSSIBLE
|
||||||
|
static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly
|
||||||
|
= CPU_BITS_ALL;
|
||||||
|
#else
|
||||||
|
static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly;
|
||||||
|
#endif
|
||||||
|
const struct cpumask *const cpu_possible_mask = to_cpumask(cpu_possible_bits);
|
||||||
|
EXPORT_SYMBOL(cpu_possible_mask);
|
||||||
|
|
||||||
|
static DECLARE_BITMAP(cpu_online_bits, CONFIG_NR_CPUS) __read_mostly;
|
||||||
|
const struct cpumask *const cpu_online_mask = to_cpumask(cpu_online_bits);
|
||||||
|
EXPORT_SYMBOL(cpu_online_mask);
|
||||||
|
|
||||||
|
static DECLARE_BITMAP(cpu_present_bits, CONFIG_NR_CPUS) __read_mostly;
|
||||||
|
const struct cpumask *const cpu_present_mask = to_cpumask(cpu_present_bits);
|
||||||
|
EXPORT_SYMBOL(cpu_present_mask);
|
||||||
|
|
||||||
|
static DECLARE_BITMAP(cpu_active_bits, CONFIG_NR_CPUS) __read_mostly;
|
||||||
|
const struct cpumask *const cpu_active_mask = to_cpumask(cpu_active_bits);
|
||||||
|
EXPORT_SYMBOL(cpu_active_mask);
|
||||||
|
Reference in New Issue
Block a user