LinuxKPI atomic fixes:
- Fix implementation of atomic_add_unless(). The atomic_cmpset_int() function returns a boolean and not the previous value of the atomic variable. - The atomic counters should be signed according to Linux. - Some minor cosmetics and styling while at it. Reviewed by: alfred @ MFC after: 1 week Sponsored by: Mellanox Technologies
This commit is contained in:
parent
1f6112d50a
commit
29cbb3bef2
@ -36,7 +36,7 @@
|
||||
#include <machine/atomic.h>
|
||||
|
||||
typedef struct {
|
||||
volatile u_long counter;
|
||||
volatile long counter;
|
||||
} atomic_long_t;
|
||||
|
||||
#define atomic_long_add(i, v) atomic_long_add_return((i), (v))
|
||||
|
@ -2,7 +2,7 @@
|
||||
* Copyright (c) 2010 Isilon Systems, Inc.
|
||||
* Copyright (c) 2010 iX Systems, Inc.
|
||||
* Copyright (c) 2010 Panasas, Inc.
|
||||
* Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
|
||||
* Copyright (c) 2013-2016 Mellanox Technologies, Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -36,9 +36,13 @@
|
||||
#include <machine/atomic.h>
|
||||
|
||||
typedef struct {
|
||||
volatile u_int counter;
|
||||
volatile int counter;
|
||||
} atomic_t;
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* 32-bit atomic operations
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
#define atomic_add(i, v) atomic_add_return((i), (v))
|
||||
#define atomic_sub(i, v) atomic_sub_return((i), (v))
|
||||
#define atomic_inc_return(v) atomic_add_return(1, (v))
|
||||
@ -46,7 +50,8 @@ typedef struct {
|
||||
#define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0)
|
||||
#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
|
||||
#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
|
||||
#define atomic_dec_return(v) atomic_sub_return(1, (v))
|
||||
#define atomic_dec_return(v) atomic_sub_return(1, (v))
|
||||
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
|
||||
|
||||
static inline int
|
||||
atomic_add_return(int i, atomic_t *v)
|
||||
@ -84,24 +89,19 @@ atomic_dec(atomic_t *v)
|
||||
return atomic_fetchadd_int(&v->counter, -1) - 1;
|
||||
}
|
||||
|
||||
static inline int atomic_add_unless(atomic_t *v, int a, int u)
|
||||
static inline int
|
||||
atomic_add_unless(atomic_t *v, int a, int u)
|
||||
{
|
||||
int c, old;
|
||||
c = atomic_read(v);
|
||||
for (;;) {
|
||||
if (unlikely(c == (u)))
|
||||
break;
|
||||
old = atomic_cmpset_int(&v->counter, c, c + (a));
|
||||
if (likely(old == c))
|
||||
break;
|
||||
c = old;
|
||||
}
|
||||
return c != (u);
|
||||
int c;
|
||||
|
||||
for (;;) {
|
||||
c = atomic_read(v);
|
||||
if (unlikely(c == u))
|
||||
break;
|
||||
if (likely(atomic_cmpset_int(&v->counter, c, c + a)))
|
||||
break;
|
||||
}
|
||||
return (c != u);
|
||||
}
|
||||
|
||||
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* _ASM_ATOMIC_H_ */
|
||||
#endif /* _ASM_ATOMIC_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user