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:
Hans Petter Selasky 2016-01-21 17:52:55 +00:00
parent 1f6112d50a
commit 29cbb3bef2
2 changed files with 22 additions and 22 deletions

View File

@ -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))

View File

@ -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_ */