diff options
author | David S. Miller <davem@davemloft.net> | 2009-04-13 14:41:05 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-04-13 14:41:05 -0700 |
commit | 83400207a07584539366f6859362db6872809a12 (patch) | |
tree | fad187f8b3bebf1b387ec42ef8143e6f4e49a256 /include/linux/percpu.h | |
parent | 0d489ffb76de0fe804cf06a9d4d11fa7342d74b9 (diff) | |
parent | 80a04d3f2f94fb68b5df05e3ac6697130bc3467a (diff) | |
download | op-kernel-dev-83400207a07584539366f6859362db6872809a12.zip op-kernel-dev-83400207a07584539366f6859362db6872809a12.tar.gz |
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Conflicts:
MAINTAINERS
Diffstat (limited to 'include/linux/percpu.h')
-rw-r--r-- | include/linux/percpu.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index ee5615d..cfda2d5 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h @@ -168,4 +168,56 @@ static inline void free_percpu(void *p) #define alloc_percpu(type) (type *)__alloc_percpu(sizeof(type), \ __alignof__(type)) +/* + * Optional methods for optimized non-lvalue per-cpu variable access. + * + * @var can be a percpu variable or a field of it and its size should + * equal char, int or long. percpu_read() evaluates to a lvalue and + * all others to void. + * + * These operations are guaranteed to be atomic w.r.t. preemption. + * The generic versions use plain get/put_cpu_var(). Archs are + * encouraged to implement single-instruction alternatives which don't + * require preemption protection. + */ +#ifndef percpu_read +# define percpu_read(var) \ + ({ \ + typeof(per_cpu_var(var)) __tmp_var__; \ + __tmp_var__ = get_cpu_var(var); \ + put_cpu_var(var); \ + __tmp_var__; \ + }) +#endif + +#define __percpu_generic_to_op(var, val, op) \ +do { \ + get_cpu_var(var) op val; \ + put_cpu_var(var); \ +} while (0) + +#ifndef percpu_write +# define percpu_write(var, val) __percpu_generic_to_op(var, (val), =) +#endif + +#ifndef percpu_add +# define percpu_add(var, val) __percpu_generic_to_op(var, (val), +=) +#endif + +#ifndef percpu_sub +# define percpu_sub(var, val) __percpu_generic_to_op(var, (val), -=) +#endif + +#ifndef percpu_and +# define percpu_and(var, val) __percpu_generic_to_op(var, (val), &=) +#endif + +#ifndef percpu_or +# define percpu_or(var, val) __percpu_generic_to_op(var, (val), |=) +#endif + +#ifndef percpu_xor +# define percpu_xor(var, val) __percpu_generic_to_op(var, (val), ^=) +#endif + #endif /* __LINUX_PERCPU_H */ |