locking/local, arch: Rewrite local_add_unless() as a static inline function
Rewrite local_add_unless() as a static inline function with boolean return value, similar to the arch_atomic_add_unless() arch fallbacks. The function is currently unused. Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20230731084458.28096-1-ubizjak@gmail.com
This commit is contained in:
parent
8788c6c2fe
commit
5e0eb67974
|
@ -65,28 +65,27 @@ static __inline__ bool local_try_cmpxchg(local_t *l, long *old, long new)
|
|||
#define local_xchg(l, n) (xchg_local(&((l)->a.counter), (n)))
|
||||
|
||||
/**
|
||||
* local_add_unless - add unless the number is a given value
|
||||
* local_add_unless - add unless the number is already a given value
|
||||
* @l: pointer of type local_t
|
||||
* @a: the amount to add to l...
|
||||
* @u: ...unless l is equal to u.
|
||||
*
|
||||
* Atomically adds @a to @l, so long as it was not @u.
|
||||
* Returns non-zero if @l was not @u, and zero otherwise.
|
||||
* Atomically adds @a to @l, if @v was not already @u.
|
||||
* Returns true if the addition was done.
|
||||
*/
|
||||
#define local_add_unless(l, a, u) \
|
||||
({ \
|
||||
long c, old; \
|
||||
c = local_read(l); \
|
||||
for (;;) { \
|
||||
if (unlikely(c == (u))) \
|
||||
break; \
|
||||
old = local_cmpxchg((l), c, c + (a)); \
|
||||
if (likely(old == c)) \
|
||||
break; \
|
||||
c = old; \
|
||||
} \
|
||||
c != (u); \
|
||||
})
|
||||
static __inline__ bool
|
||||
local_add_unless(local_t *l, long a, long u)
|
||||
{
|
||||
long c = local_read(l);
|
||||
|
||||
do {
|
||||
if (unlikely(c == u))
|
||||
return false;
|
||||
} while (!local_try_cmpxchg(l, &c, c + a));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#define local_inc_not_zero(l) local_add_unless((l), 1, 0)
|
||||
|
||||
#define local_add_negative(a, l) (local_add_return((a), (l)) < 0)
|
||||
|
|
|
@ -70,22 +70,27 @@ static inline bool local_try_cmpxchg(local_t *l, long *old, long new)
|
|||
#define local_xchg(l, n) (atomic_long_xchg((&(l)->a), (n)))
|
||||
|
||||
/**
|
||||
* local_add_unless - add unless the number is a given value
|
||||
* local_add_unless - add unless the number is already a given value
|
||||
* @l: pointer of type local_t
|
||||
* @a: the amount to add to l...
|
||||
* @u: ...unless l is equal to u.
|
||||
*
|
||||
* Atomically adds @a to @l, so long as it was not @u.
|
||||
* Returns non-zero if @l was not @u, and zero otherwise.
|
||||
* Atomically adds @a to @l, if @v was not already @u.
|
||||
* Returns true if the addition was done.
|
||||
*/
|
||||
#define local_add_unless(l, a, u) \
|
||||
({ \
|
||||
long c, old; \
|
||||
c = local_read(l); \
|
||||
while (c != (u) && (old = local_cmpxchg((l), c, c + (a))) != c) \
|
||||
c = old; \
|
||||
c != (u); \
|
||||
})
|
||||
static inline bool
|
||||
local_add_unless(local_t *l, long a, long u)
|
||||
{
|
||||
long c = local_read(l);
|
||||
|
||||
do {
|
||||
if (unlikely(c == u))
|
||||
return false;
|
||||
} while (!local_try_cmpxchg(l, &c, c + a));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#define local_inc_not_zero(l) local_add_unless((l), 1, 0)
|
||||
|
||||
#define local_dec_return(l) local_sub_return(1, (l))
|
||||
|
|
|
@ -108,22 +108,27 @@ static __inline__ bool local_try_cmpxchg(local_t *l, long *old, long new)
|
|||
#define local_xchg(l, n) (atomic_long_xchg((&(l)->a), (n)))
|
||||
|
||||
/**
|
||||
* local_add_unless - add unless the number is a given value
|
||||
* local_add_unless - add unless the number is already a given value
|
||||
* @l: pointer of type local_t
|
||||
* @a: the amount to add to l...
|
||||
* @u: ...unless l is equal to u.
|
||||
*
|
||||
* Atomically adds @a to @l, so long as it was not @u.
|
||||
* Returns non-zero if @l was not @u, and zero otherwise.
|
||||
* Atomically adds @a to @l, if @v was not already @u.
|
||||
* Returns true if the addition was done.
|
||||
*/
|
||||
#define local_add_unless(l, a, u) \
|
||||
({ \
|
||||
long c, old; \
|
||||
c = local_read(l); \
|
||||
while (c != (u) && (old = local_cmpxchg((l), c, c + (a))) != c) \
|
||||
c = old; \
|
||||
c != (u); \
|
||||
})
|
||||
static __inline__ bool
|
||||
local_add_unless(local_t *l, long a, long u)
|
||||
{
|
||||
long c = local_read(l);
|
||||
|
||||
do {
|
||||
if (unlikely(c == u))
|
||||
return false;
|
||||
} while (!local_try_cmpxchg(l, &c, c + a));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#define local_inc_not_zero(l) local_add_unless((l), 1, 0)
|
||||
|
||||
#define local_dec_return(l) local_sub_return(1, (l))
|
||||
|
|
|
@ -115,23 +115,23 @@ static __inline__ long local_xchg(local_t *l, long n)
|
|||
}
|
||||
|
||||
/**
|
||||
* local_add_unless - add unless the number is a given value
|
||||
* local_add_unless - add unless the number is already a given value
|
||||
* @l: pointer of type local_t
|
||||
* @a: the amount to add to v...
|
||||
* @u: ...unless v is equal to u.
|
||||
*
|
||||
* Atomically adds @a to @l, so long as it was not @u.
|
||||
* Returns non-zero if @l was not @u, and zero otherwise.
|
||||
* Atomically adds @a to @l, if @v was not already @u.
|
||||
* Returns true if the addition was done.
|
||||
*/
|
||||
static __inline__ int local_add_unless(local_t *l, long a, long u)
|
||||
static __inline__ bool local_add_unless(local_t *l, long a, long u)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
bool ret = false;
|
||||
|
||||
powerpc_local_irq_pmu_save(flags);
|
||||
if (l->v != u) {
|
||||
l->v += a;
|
||||
ret = 1;
|
||||
ret = true;
|
||||
}
|
||||
powerpc_local_irq_pmu_restore(flags);
|
||||
|
||||
|
|
|
@ -135,28 +135,27 @@ static inline bool local_try_cmpxchg(local_t *l, long *old, long new)
|
|||
#define local_xchg(l, n) (xchg(&((l)->a.counter), (n)))
|
||||
|
||||
/**
|
||||
* local_add_unless - add unless the number is a given value
|
||||
* local_add_unless - add unless the number is already a given value
|
||||
* @l: pointer of type local_t
|
||||
* @a: the amount to add to l...
|
||||
* @u: ...unless l is equal to u.
|
||||
*
|
||||
* Atomically adds @a to @l, so long as it was not @u.
|
||||
* Returns non-zero if @l was not @u, and zero otherwise.
|
||||
* Atomically adds @a to @l, if @v was not already @u.
|
||||
* Returns true if the addition was done.
|
||||
*/
|
||||
#define local_add_unless(l, a, u) \
|
||||
({ \
|
||||
long c, old; \
|
||||
c = local_read((l)); \
|
||||
for (;;) { \
|
||||
if (unlikely(c == (u))) \
|
||||
break; \
|
||||
old = local_cmpxchg((l), c, c + (a)); \
|
||||
if (likely(old == c)) \
|
||||
break; \
|
||||
c = old; \
|
||||
} \
|
||||
c != (u); \
|
||||
})
|
||||
static __always_inline bool
|
||||
local_add_unless(local_t *l, long a, long u)
|
||||
{
|
||||
long c = local_read(l);
|
||||
|
||||
do {
|
||||
if (unlikely(c == u))
|
||||
return false;
|
||||
} while (!local_try_cmpxchg(l, &c, c + a));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#define local_inc_not_zero(l) local_add_unless((l), 1, 0)
|
||||
|
||||
/* On x86_32, these are no better than the atomic variants.
|
||||
|
|
Loading…
Reference in New Issue