X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-i386%2Flocal.h;fp=include%2Fasm-i386%2Flocal.h;h=0177da80dde34f68b98dee1a533493b780c8d62f;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=12060e22f7e2a53204f4f8cfec20f95abfa6eeda;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/include/asm-i386/local.h b/include/asm-i386/local.h index 12060e22f..0177da80d 100644 --- a/include/asm-i386/local.h +++ b/include/asm-i386/local.h @@ -5,7 +5,7 @@ typedef struct { - volatile long counter; + volatile unsigned long counter; } local_t; #define LOCAL_INIT(i) { (i) } @@ -17,30 +17,32 @@ static __inline__ void local_inc(local_t *v) { __asm__ __volatile__( "incl %0" - :"+m" (v->counter)); + :"=m" (v->counter) + :"m" (v->counter)); } static __inline__ void local_dec(local_t *v) { __asm__ __volatile__( "decl %0" - :"+m" (v->counter)); + :"=m" (v->counter) + :"m" (v->counter)); } -static __inline__ void local_add(long i, local_t *v) +static __inline__ void local_add(unsigned long i, local_t *v) { __asm__ __volatile__( "addl %1,%0" - :"+m" (v->counter) - :"ir" (i)); + :"=m" (v->counter) + :"ir" (i), "m" (v->counter)); } -static __inline__ void local_sub(long i, local_t *v) +static __inline__ void local_sub(unsigned long i, local_t *v) { __asm__ __volatile__( "subl %1,%0" - :"+m" (v->counter) - :"ir" (i)); + :"=m" (v->counter) + :"ir" (i), "m" (v->counter)); } /* On x86, these are no better than the atomic variants. */ @@ -53,26 +55,12 @@ static __inline__ void local_sub(long i, local_t *v) * much more efficient than these naive implementations. Note they take * a variable, not an address. */ - -/* Need to disable preemption for the cpu local counters otherwise we could - still access a variable of a previous CPU in a non atomic way. */ -#define cpu_local_wrap_v(v) \ - ({ local_t res__; \ - preempt_disable(); \ - res__ = (v); \ - preempt_enable(); \ - res__; }) -#define cpu_local_wrap(v) \ - ({ preempt_disable(); \ - v; \ - preempt_enable(); }) \ - -#define cpu_local_read(v) cpu_local_wrap_v(local_read(&__get_cpu_var(v))) -#define cpu_local_set(v, i) cpu_local_wrap(local_set(&__get_cpu_var(v), (i))) -#define cpu_local_inc(v) cpu_local_wrap(local_inc(&__get_cpu_var(v))) -#define cpu_local_dec(v) cpu_local_wrap(local_dec(&__get_cpu_var(v))) -#define cpu_local_add(i, v) cpu_local_wrap(local_add((i), &__get_cpu_var(v))) -#define cpu_local_sub(i, v) cpu_local_wrap(local_sub((i), &__get_cpu_var(v))) +#define cpu_local_read(v) local_read(&__get_cpu_var(v)) +#define cpu_local_set(v, i) local_set(&__get_cpu_var(v), (i)) +#define cpu_local_inc(v) local_inc(&__get_cpu_var(v)) +#define cpu_local_dec(v) local_dec(&__get_cpu_var(v)) +#define cpu_local_add(i, v) local_add((i), &__get_cpu_var(v)) +#define cpu_local_sub(i, v) local_sub((i), &__get_cpu_var(v)) #define __cpu_local_inc(v) cpu_local_inc(v) #define __cpu_local_dec(v) cpu_local_dec(v)