diff options
author | Christoph Lameter <cl@linux.com> | 2014-08-26 20:12:21 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2014-08-28 08:58:57 -0400 |
commit | 4ba2968420fa9d0604b6a6a5c61bfa8d0fa84ae0 (patch) | |
tree | a1051b2a4a23ae8f943f3ae97c0adf6b594e2df0 | |
parent | 23f66e2d661b4d3226d16e25910a9e9472ce2410 (diff) |
percpu: Resolve ambiguities in __get_cpu_var/cpumask_var_t
__get_cpu_var can paper over differences in the definitions of
cpumask_var_t and either use the address of the cpumask variable
directly or perform a fetch of the address of the struct cpumask
allocated elsewhere. This is important particularly when using per cpu
cpumask_var_t declarations because in one case we have an offset into
a per cpu area to handle and in the other case we need to fetch a
pointer from the offset.
This patch introduces a new macro
this_cpu_cpumask_var_ptr()
that is defined where cpumask_var_t is defined and performs the proper
actions. All use cases where __get_cpu_var is used with cpumask_var_t
are converted to the use of this_cpu_cpumask_var_ptr().
Signed-off-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
-rw-r--r-- | arch/x86/include/asm/perf_event_p4.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/x2apic_cluster.c | 3 | ||||
-rw-r--r-- | arch/x86/oprofile/op_model_p4.c | 2 | ||||
-rw-r--r-- | include/linux/cpumask.h | 11 | ||||
-rw-r--r-- | kernel/sched/deadline.c | 2 | ||||
-rw-r--r-- | kernel/sched/fair.c | 2 | ||||
-rw-r--r-- | kernel/sched/rt.c | 2 |
7 files changed, 17 insertions, 7 deletions
diff --git a/arch/x86/include/asm/perf_event_p4.h b/arch/x86/include/asm/perf_event_p4.h index 85e13ccf15c4..d725382c2ae0 100644 --- a/arch/x86/include/asm/perf_event_p4.h +++ b/arch/x86/include/asm/perf_event_p4.h | |||
@@ -189,7 +189,7 @@ static inline int p4_ht_thread(int cpu) | |||
189 | { | 189 | { |
190 | #ifdef CONFIG_SMP | 190 | #ifdef CONFIG_SMP |
191 | if (smp_num_siblings == 2) | 191 | if (smp_num_siblings == 2) |
192 | return cpu != cpumask_first(__get_cpu_var(cpu_sibling_map)); | 192 | return cpu != cpumask_first(this_cpu_cpumask_var_ptr(cpu_sibling_map)); |
193 | #endif | 193 | #endif |
194 | return 0; | 194 | return 0; |
195 | } | 195 | } |
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 6ce600f9bc78..1f5d5f2ffae6 100644 --- a/arch/x86/kernel/apic/x2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c | |||
@@ -42,8 +42,7 @@ __x2apic_send_IPI_mask(const struct cpumask *mask, int vector, int apic_dest) | |||
42 | * We are to modify mask, so we need an own copy | 42 | * We are to modify mask, so we need an own copy |
43 | * and be sure it's manipulated with irq off. | 43 | * and be sure it's manipulated with irq off. |
44 | */ | 44 | */ |
45 | ipi_mask_ptr = __raw_get_cpu_var(ipi_mask); | 45 | ipi_mask_ptr = this_cpu_cpumask_var_ptr(ipi_mask); |
46 | cpumask_copy(ipi_mask_ptr, mask); | ||
47 | 46 | ||
48 | /* | 47 | /* |
49 | * The idea is to send one IPI per cluster. | 48 | * The idea is to send one IPI per cluster. |
diff --git a/arch/x86/oprofile/op_model_p4.c b/arch/x86/oprofile/op_model_p4.c index 98ab13058f89..ad1d91f475ab 100644 --- a/arch/x86/oprofile/op_model_p4.c +++ b/arch/x86/oprofile/op_model_p4.c | |||
@@ -372,7 +372,7 @@ static unsigned int get_stagger(void) | |||
372 | { | 372 | { |
373 | #ifdef CONFIG_SMP | 373 | #ifdef CONFIG_SMP |
374 | int cpu = smp_processor_id(); | 374 | int cpu = smp_processor_id(); |
375 | return cpu != cpumask_first(__get_cpu_var(cpu_sibling_map)); | 375 | return cpu != cpumask_first(this_cpu_cpumask_var_ptr(cpu_sibling_map)); |
376 | #endif | 376 | #endif |
377 | return 0; | 377 | return 0; |
378 | } | 378 | } |
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index 2997af6d2ccd..0a9a6da21e74 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h | |||
@@ -666,10 +666,19 @@ static inline size_t cpumask_size(void) | |||
666 | * | 666 | * |
667 | * This code makes NR_CPUS length memcopy and brings to a memory corruption. | 667 | * This code makes NR_CPUS length memcopy and brings to a memory corruption. |
668 | * cpumask_copy() provide safe copy functionality. | 668 | * cpumask_copy() provide safe copy functionality. |
669 | * | ||
670 | * Note that there is another evil here: If you define a cpumask_var_t | ||
671 | * as a percpu variable then the way to obtain the address of the cpumask | ||
672 | * structure differently influences what this_cpu_* operation needs to be | ||
673 | * used. Please use this_cpu_cpumask_var_t in those cases. The direct use | ||
674 | * of this_cpu_ptr() or this_cpu_read() will lead to failures when the | ||
675 | * other type of cpumask_var_t implementation is configured. | ||
669 | */ | 676 | */ |
670 | #ifdef CONFIG_CPUMASK_OFFSTACK | 677 | #ifdef CONFIG_CPUMASK_OFFSTACK |
671 | typedef struct cpumask *cpumask_var_t; | 678 | typedef struct cpumask *cpumask_var_t; |
672 | 679 | ||
680 | #define this_cpu_cpumask_var_ptr(x) this_cpu_read(x) | ||
681 | |||
673 | bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node); | 682 | bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node); |
674 | bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags); | 683 | bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags); |
675 | bool zalloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node); | 684 | bool zalloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node); |
@@ -681,6 +690,8 @@ void free_bootmem_cpumask_var(cpumask_var_t mask); | |||
681 | #else | 690 | #else |
682 | typedef struct cpumask cpumask_var_t[1]; | 691 | typedef struct cpumask cpumask_var_t[1]; |
683 | 692 | ||
693 | #define this_cpu_cpumask_var_ptr(x) this_cpu_ptr(x) | ||
694 | |||
684 | static inline bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags) | 695 | static inline bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags) |
685 | { | 696 | { |
686 | return true; | 697 | return true; |
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 255ce138b652..4a608cfaecbd 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c | |||
@@ -1158,7 +1158,7 @@ static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask_dl); | |||
1158 | static int find_later_rq(struct task_struct *task) | 1158 | static int find_later_rq(struct task_struct *task) |
1159 | { | 1159 | { |
1160 | struct sched_domain *sd; | 1160 | struct sched_domain *sd; |
1161 | struct cpumask *later_mask = __get_cpu_var(local_cpu_mask_dl); | 1161 | struct cpumask *later_mask = this_cpu_cpumask_var_ptr(local_cpu_mask_dl); |
1162 | int this_cpu = smp_processor_id(); | 1162 | int this_cpu = smp_processor_id(); |
1163 | int best_cpu, cpu = task_cpu(task); | 1163 | int best_cpu, cpu = task_cpu(task); |
1164 | 1164 | ||
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index bfa3c86d0d68..197d659c144c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
@@ -6539,7 +6539,7 @@ static int load_balance(int this_cpu, struct rq *this_rq, | |||
6539 | struct sched_group *group; | 6539 | struct sched_group *group; |
6540 | struct rq *busiest; | 6540 | struct rq *busiest; |
6541 | unsigned long flags; | 6541 | unsigned long flags; |
6542 | struct cpumask *cpus = __get_cpu_var(load_balance_mask); | 6542 | struct cpumask *cpus = this_cpu_cpumask_var_ptr(load_balance_mask); |
6543 | 6543 | ||
6544 | struct lb_env env = { | 6544 | struct lb_env env = { |
6545 | .sd = sd, | 6545 | .sd = sd, |
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 5f6edca4fafd..a4c50fce9b90 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c | |||
@@ -1526,7 +1526,7 @@ static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask); | |||
1526 | static int find_lowest_rq(struct task_struct *task) | 1526 | static int find_lowest_rq(struct task_struct *task) |
1527 | { | 1527 | { |
1528 | struct sched_domain *sd; | 1528 | struct sched_domain *sd; |
1529 | struct cpumask *lowest_mask = __get_cpu_var(local_cpu_mask); | 1529 | struct cpumask *lowest_mask = this_cpu_cpumask_var_ptr(local_cpu_mask); |
1530 | int this_cpu = smp_processor_id(); | 1530 | int this_cpu = smp_processor_id(); |
1531 | int cpu = task_cpu(task); | 1531 | int cpu = task_cpu(task); |
1532 | 1532 | ||