Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef _ASM_IA64_LOCAL_H |
| 2 | #define _ASM_IA64_LOCAL_H |
| 3 | |
| 4 | /* |
| 5 | * Copyright (C) 2003 Hewlett-Packard Co |
| 6 | * David Mosberger-Tang <davidm@hpl.hp.com> |
| 7 | */ |
| 8 | |
| 9 | #include <linux/percpu.h> |
| 10 | |
| 11 | typedef struct { |
| 12 | atomic64_t val; |
| 13 | } local_t; |
| 14 | |
| 15 | #define LOCAL_INIT(i) ((local_t) { { (i) } }) |
| 16 | #define local_read(l) atomic64_read(&(l)->val) |
| 17 | #define local_set(l, i) atomic64_set(&(l)->val, i) |
| 18 | #define local_inc(l) atomic64_inc(&(l)->val) |
| 19 | #define local_dec(l) atomic64_dec(&(l)->val) |
Christoph Lameter | f64fa67 | 2005-12-07 11:24:42 -0800 | [diff] [blame] | 20 | #define local_add(i, l) atomic64_add((i), &(l)->val) |
| 21 | #define local_sub(i, l) atomic64_sub((i), &(l)->val) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 22 | |
| 23 | /* Non-atomic variants, i.e., preemption disabled and won't be touched in interrupt, etc. */ |
| 24 | |
| 25 | #define __local_inc(l) (++(l)->val.counter) |
| 26 | #define __local_dec(l) (--(l)->val.counter) |
| 27 | #define __local_add(i,l) ((l)->val.counter += (i)) |
| 28 | #define __local_sub(i,l) ((l)->val.counter -= (i)) |
| 29 | |
| 30 | /* |
| 31 | * Use these for per-cpu local_t variables. Note they take a variable (eg. mystruct.foo), |
| 32 | * not an address. |
| 33 | */ |
| 34 | #define cpu_local_read(v) local_read(&__ia64_per_cpu_var(v)) |
| 35 | #define cpu_local_set(v, i) local_set(&__ia64_per_cpu_var(v), (i)) |
| 36 | #define cpu_local_inc(v) local_inc(&__ia64_per_cpu_var(v)) |
| 37 | #define cpu_local_dec(v) local_dec(&__ia64_per_cpu_var(v)) |
| 38 | #define cpu_local_add(i, v) local_add((i), &__ia64_per_cpu_var(v)) |
| 39 | #define cpu_local_sub(i, v) local_sub((i), &__ia64_per_cpu_var(v)) |
| 40 | |
| 41 | /* |
| 42 | * Non-atomic increments, i.e., preemption disabled and won't be touched in interrupt, |
| 43 | * etc. |
| 44 | */ |
| 45 | #define __cpu_local_inc(v) __local_inc(&__ia64_per_cpu_var(v)) |
| 46 | #define __cpu_local_dec(v) __local_dec(&__ia64_per_cpu_var(v)) |
| 47 | #define __cpu_local_add(i, v) __local_add((i), &__ia64_per_cpu_var(v)) |
| 48 | #define __cpu_local_sub(i, v) __local_sub((i), &__ia64_per_cpu_var(v)) |
| 49 | |
| 50 | #endif /* _ASM_IA64_LOCAL_H */ |