Commit bfe5d834195b3089b8846577311340376cc0f450

Authored by Paul Mackerras
Committed by Linus Torvalds
1 parent 6ceab8a936

[PATCH] Define __raw_get_cpu_var and use it

There are several instances of per_cpu(foo, raw_smp_processor_id()), which
is semantically equivalent to __get_cpu_var(foo) but without the warning
that smp_processor_id() can give if CONFIG_DEBUG_PREEMPT is enabled.  For
those architectures with optimized per-cpu implementations, namely ia64,
powerpc, s390, sparc64 and x86_64, per_cpu() turns into more and slower
code than __get_cpu_var(), so it would be preferable to use __get_cpu_var
on those platforms.

This defines a __raw_get_cpu_var(x) macro which turns into per_cpu(x,
raw_smp_processor_id()) on architectures that use the generic per-cpu
implementation, and turns into __get_cpu_var(x) on the architectures that
have an optimized per-cpu implementation.

Signed-off-by: Paul Mackerras <paulus@samba.org>
Acked-by: David S. Miller <davem@davemloft.net>
Acked-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 11 changed files with 19 additions and 7 deletions Side-by-side Diff

include/asm-generic/percpu.h
... ... @@ -14,6 +14,7 @@
14 14 /* var is in discarded region: offset to particular copy we want */
15 15 #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
16 16 #define __get_cpu_var(var) per_cpu(var, smp_processor_id())
  17 +#define __raw_get_cpu_var(var) per_cpu(var, raw_smp_processor_id())
17 18  
18 19 /* A macro to avoid #include hell... */
19 20 #define percpu_modcopy(pcpudst, src, size) \
... ... @@ -30,6 +31,7 @@
30 31  
31 32 #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var))
32 33 #define __get_cpu_var(var) per_cpu__##var
  34 +#define __raw_get_cpu_var(var) per_cpu__##var
33 35  
34 36 #endif /* SMP */
35 37  
include/asm-ia64/percpu.h
... ... @@ -42,6 +42,7 @@
42 42  
43 43 #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
44 44 #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset)))
  45 +#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset)))
45 46  
46 47 extern void percpu_modcopy(void *pcpudst, const void *src, unsigned long size);
47 48 extern void setup_per_cpu_areas (void);
... ... @@ -51,6 +52,7 @@
51 52  
52 53 #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var))
53 54 #define __get_cpu_var(var) per_cpu__##var
  55 +#define __raw_get_cpu_var(var) per_cpu__##var
54 56 #define per_cpu_init() (__phys_per_cpu_start)
55 57  
56 58 #endif /* SMP */
include/asm-powerpc/percpu.h
... ... @@ -22,6 +22,7 @@
22 22 /* var is in discarded region: offset to particular copy we want */
23 23 #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu)))
24 24 #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()))
  25 +#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()))
25 26  
26 27 /* A macro to avoid #include hell... */
27 28 #define percpu_modcopy(pcpudst, src, size) \
... ... @@ -41,6 +42,7 @@
41 42  
42 43 #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var))
43 44 #define __get_cpu_var(var) per_cpu__##var
  45 +#define __raw_get_cpu_var(var) per_cpu__##var
44 46  
45 47 #endif /* SMP */
46 48  
include/asm-s390/percpu.h
... ... @@ -40,6 +40,7 @@
40 40 __typeof__(type) per_cpu__##name
41 41  
42 42 #define __get_cpu_var(var) __reloc_hide(var,S390_lowcore.percpu_offset)
  43 +#define __raw_get_cpu_var(var) __reloc_hide(var,S390_lowcore.percpu_offset)
43 44 #define per_cpu(var,cpu) __reloc_hide(var,__per_cpu_offset[cpu])
44 45  
45 46 /* A macro to avoid #include hell... */
... ... @@ -57,6 +58,7 @@
57 58 __typeof__(type) per_cpu__##name
58 59  
59 60 #define __get_cpu_var(var) __reloc_hide(var,0)
  61 +#define __raw_get_cpu_var(var) __reloc_hide(var,0)
60 62 #define per_cpu(var,cpu) __reloc_hide(var,0)
61 63  
62 64 #endif /* SMP */
include/asm-sparc64/percpu.h
... ... @@ -21,6 +21,7 @@
21 21 /* var is in discarded region: offset to particular copy we want */
22 22 #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu)))
23 23 #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __local_per_cpu_offset))
  24 +#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __local_per_cpu_offset))
24 25  
25 26 /* A macro to avoid #include hell... */
26 27 #define percpu_modcopy(pcpudst, src, size) \
... ... @@ -37,6 +38,7 @@
37 38  
38 39 #define per_cpu(var, cpu) (*((void)cpu, &per_cpu__##var))
39 40 #define __get_cpu_var(var) per_cpu__##var
  41 +#define __raw_get_cpu_var(var) per_cpu__##var
40 42  
41 43 #endif /* SMP */
42 44  
include/asm-x86_64/percpu.h
... ... @@ -21,6 +21,7 @@
21 21 /* var is in discarded region: offset to particular copy we want */
22 22 #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu)))
23 23 #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()))
  24 +#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()))
24 25  
25 26 /* A macro to avoid #include hell... */
26 27 #define percpu_modcopy(pcpudst, src, size) \
... ... @@ -40,6 +41,7 @@
40 41  
41 42 #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var))
42 43 #define __get_cpu_var(var) per_cpu__##var
  44 +#define __raw_get_cpu_var(var) per_cpu__##var
43 45  
44 46 #endif /* SMP */
45 47  
... ... @@ -576,7 +576,7 @@
576 576  
577 577 memset(timer, 0, sizeof(struct hrtimer));
578 578  
579   - bases = per_cpu(hrtimer_bases, raw_smp_processor_id());
  579 + bases = __raw_get_cpu_var(hrtimer_bases);
580 580  
581 581 if (clock_id == CLOCK_REALTIME && mode != HRTIMER_ABS)
582 582 clock_id = CLOCK_MONOTONIC;
... ... @@ -599,7 +599,7 @@
599 599 {
600 600 struct hrtimer_base *bases;
601 601  
602   - bases = per_cpu(hrtimer_bases, raw_smp_processor_id());
  602 + bases = __raw_get_cpu_var(hrtimer_bases);
603 603 *tp = ktime_to_timespec(bases[which_clock].resolution);
604 604  
605 605 return 0;
... ... @@ -4152,7 +4152,7 @@
4152 4152 */
4153 4153 void __sched io_schedule(void)
4154 4154 {
4155   - struct runqueue *rq = &per_cpu(runqueues, raw_smp_processor_id());
  4155 + struct runqueue *rq = &__raw_get_cpu_var(runqueues);
4156 4156  
4157 4157 atomic_inc(&rq->nr_iowait);
4158 4158 schedule();
... ... @@ -4163,7 +4163,7 @@
4163 4163  
4164 4164 long __sched io_schedule_timeout(long timeout)
4165 4165 {
4166   - struct runqueue *rq = &per_cpu(runqueues, raw_smp_processor_id());
  4166 + struct runqueue *rq = &__raw_get_cpu_var(runqueues);
4167 4167 long ret;
4168 4168  
4169 4169 atomic_inc(&rq->nr_iowait);
... ... @@ -36,7 +36,7 @@
36 36  
37 37 void touch_softlockup_watchdog(void)
38 38 {
39   - per_cpu(touch_timestamp, raw_smp_processor_id()) = jiffies;
  39 + __raw_get_cpu_var(touch_timestamp) = jiffies;
40 40 }
41 41 EXPORT_SYMBOL(touch_softlockup_watchdog);
42 42  
... ... @@ -146,7 +146,7 @@
146 146 void fastcall init_timer(struct timer_list *timer)
147 147 {
148 148 timer->entry.next = NULL;
149   - timer->base = per_cpu(tvec_bases, raw_smp_processor_id());
  149 + timer->base = __raw_get_cpu_var(tvec_bases);
150 150 }
151 151 EXPORT_SYMBOL(init_timer);
152 152  
... ... @@ -244,7 +244,7 @@
244 244  
245 245 static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat);
246 246 #define RT_CACHE_STAT_INC(field) \
247   - (per_cpu(rt_cache_stat, raw_smp_processor_id()).field++)
  247 + (__raw_get_cpu_var(rt_cache_stat).field++)
248 248  
249 249 static int rt_intern_hash(unsigned hash, struct rtable *rth,
250 250 struct rtable **res);