提交 7179e30e 编写于 作者: P Peter Zijlstra 提交者: Ingo Molnar

locking,arch,cris: Fold atomic_ops

Many of the atomic op implementations are the same except for one
instruction; fold the lot into a few CPP macros and reduce LoC.

This also prepares for easy addition of new ops.
Signed-off-by: NPeter Zijlstra <peterz@infradead.org>
Acked-by: NJesper Nilsson <jesper.nilsson@axis.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mikael Starvik <starvik@axis.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: linux-cris-kernel@axis.com
Link: http://lkml.kernel.org/r/20140508135852.104572724@infradead.orgSigned-off-by: NIngo Molnar <mingo@kernel.org>
上级 d325209b
...@@ -22,43 +22,36 @@ ...@@ -22,43 +22,36 @@
/* These should be written in asm but we do it in C for now. */ /* These should be written in asm but we do it in C for now. */
static inline void atomic_add(int i, volatile atomic_t *v) #define ATOMIC_OP(op, c_op) \
{ static inline void atomic_##op(int i, volatile atomic_t *v) \
unsigned long flags; { \
cris_atomic_save(v, flags); unsigned long flags; \
v->counter += i; cris_atomic_save(v, flags); \
cris_atomic_restore(v, flags); v->counter c_op i; \
cris_atomic_restore(v, flags); \
} \
#define ATOMIC_OP_RETURN(op, c_op) \
static inline int atomic_##op##_return(int i, volatile atomic_t *v) \
{ \
unsigned long flags; \
int retval; \
cris_atomic_save(v, flags); \
retval = (v->counter c_op i); \
cris_atomic_restore(v, flags); \
return retval; \
} }
static inline void atomic_sub(int i, volatile atomic_t *v) #define ATOMIC_OPS(op, c_op) ATOMIC_OP(op, c_op) ATOMIC_OP_RETURN(op, c_op)
{
unsigned long flags;
cris_atomic_save(v, flags);
v->counter -= i;
cris_atomic_restore(v, flags);
}
static inline int atomic_add_return(int i, volatile atomic_t *v) ATOMIC_OPS(add, +=)
{ ATOMIC_OPS(sub, -=)
unsigned long flags;
int retval;
cris_atomic_save(v, flags);
retval = (v->counter += i);
cris_atomic_restore(v, flags);
return retval;
}
#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0) #undef ATOMIC_OPS
#undef ATOMIC_OP_RETURN
#undef ATOMIC_OP
static inline int atomic_sub_return(int i, volatile atomic_t *v) #define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
{
unsigned long flags;
int retval;
cris_atomic_save(v, flags);
retval = (v->counter -= i);
cris_atomic_restore(v, flags);
return retval;
}
static inline int atomic_sub_and_test(int i, volatile atomic_t *v) static inline int atomic_sub_and_test(int i, volatile atomic_t *v)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册