svn commit: r337898 - in stable/11/sys/compat/linuxkpi/common/include: asm linux
Hans Petter Selasky
hselasky at FreeBSD.org
Thu Aug 16 08:12:38 UTC 2018
Author: hselasky
Date: Thu Aug 16 08:12:36 2018
New Revision: 337898
URL: https://svnweb.freebsd.org/changeset/base/337898
Log:
MFC r337527:
Use atomic_fcmpset_XXX() instead of atomic_cmpset_XXX() when possible
in the LinuxKPI.
Suggested by: mjg @
Sponsored by: Mellanox Technologies
Modified:
stable/11/sys/compat/linuxkpi/common/include/asm/atomic-long.h
stable/11/sys/compat/linuxkpi/common/include/asm/atomic.h
stable/11/sys/compat/linuxkpi/common/include/asm/atomic64.h
stable/11/sys/compat/linuxkpi/common/include/linux/bitops.h
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/compat/linuxkpi/common/include/asm/atomic-long.h
==============================================================================
--- stable/11/sys/compat/linuxkpi/common/include/asm/atomic-long.h Thu Aug 16 08:11:17 2018 (r337897)
+++ stable/11/sys/compat/linuxkpi/common/include/asm/atomic-long.h Thu Aug 16 08:12:36 2018 (r337898)
@@ -87,9 +87,8 @@ atomic_long_cmpxchg(atomic_long_t *v, long old, long n
long ret = old;
for (;;) {
- if (atomic_cmpset_long(&v->counter, old, new))
+ if (atomic_fcmpset_long(&v->counter, &ret, new))
break;
- ret = READ_ONCE(v->counter);
if (ret != old)
break;
}
@@ -99,13 +98,12 @@ atomic_long_cmpxchg(atomic_long_t *v, long old, long n
static inline int
atomic_long_add_unless(atomic_long_t *v, long a, long u)
{
- long c;
+ long c = atomic_long_read(v);
for (;;) {
- c = atomic_long_read(v);
if (unlikely(c == u))
break;
- if (likely(atomic_cmpset_long(&v->counter, c, c + a)))
+ if (likely(atomic_fcmpset_long(&v->counter, &c, c + a)))
break;
}
return (c != u);
Modified: stable/11/sys/compat/linuxkpi/common/include/asm/atomic.h
==============================================================================
--- stable/11/sys/compat/linuxkpi/common/include/asm/atomic.h Thu Aug 16 08:11:17 2018 (r337897)
+++ stable/11/sys/compat/linuxkpi/common/include/asm/atomic.h Thu Aug 16 08:12:36 2018 (r337898)
@@ -108,13 +108,12 @@ atomic_dec(atomic_t *v)
static inline int
atomic_add_unless(atomic_t *v, int a, int u)
{
- int c;
+ int c = atomic_read(v);
for (;;) {
- c = atomic_read(v);
if (unlikely(c == u))
break;
- if (likely(atomic_cmpset_int(&v->counter, c, c + a)))
+ if (likely(atomic_fcmpset_int(&v->counter, &c, c + a)))
break;
}
return (c != u);
@@ -134,12 +133,10 @@ atomic_xchg(atomic_t *v, int i)
defined(__powerpc__)
return (atomic_swap_int(&v->counter, i));
#else
- int ret;
- for (;;) {
- ret = READ_ONCE(v->counter);
- if (atomic_cmpset_int(&v->counter, ret, i))
- break;
- }
+ int ret = atomic_read(v);
+
+ while (!atomic_fcmpset_int(&v->counter, &ret, i))
+ ;
return (ret);
#endif
}
@@ -150,9 +147,8 @@ atomic_cmpxchg(atomic_t *v, int old, int new)
int ret = old;
for (;;) {
- if (atomic_cmpset_int(&v->counter, old, new))
+ if (atomic_fcmpset_int(&v->counter, &ret, new))
break;
- ret = READ_ONCE(v->counter);
if (ret != old)
break;
}
Modified: stable/11/sys/compat/linuxkpi/common/include/asm/atomic64.h
==============================================================================
--- stable/11/sys/compat/linuxkpi/common/include/asm/atomic64.h Thu Aug 16 08:11:17 2018 (r337897)
+++ stable/11/sys/compat/linuxkpi/common/include/asm/atomic64.h Thu Aug 16 08:12:36 2018 (r337898)
@@ -92,13 +92,12 @@ atomic64_dec(atomic64_t *v)
static inline int64_t
atomic64_add_unless(atomic64_t *v, int64_t a, int64_t u)
{
- int64_t c;
+ int64_t c = atomic64_read(v);
for (;;) {
- c = atomic64_read(v);
if (unlikely(c == u))
break;
- if (likely(atomic_cmpset_64(&v->counter, c, c + a)))
+ if (likely(atomic_fcmpset_64(&v->counter, &c, c + a)))
break;
}
return (c != u);
@@ -112,12 +111,10 @@ atomic64_xchg(atomic64_t *v, int64_t i)
defined(__powerpc64__)
return (atomic_swap_64(&v->counter, i));
#else
- int64_t ret;
- for (;;) {
- ret = READ_ONCE(v->counter);
- if (atomic_cmpset_64(&v->counter, ret, i))
- break;
- }
+ int64_t ret = atomic64_read(v);
+
+ while (!atomic_fcmpset_64(&v->counter, &ret, i))
+ ;
return (ret);
#endif
}
@@ -128,9 +125,8 @@ atomic64_cmpxchg(atomic64_t *v, int64_t old, int64_t n
int64_t ret = old;
for (;;) {
- if (atomic_cmpset_64(&v->counter, old, new))
+ if (atomic_fcmpset_64(&v->counter, &ret, new))
break;
- ret = READ_ONCE(v->counter);
if (ret != old)
break;
}
Modified: stable/11/sys/compat/linuxkpi/common/include/linux/bitops.h
==============================================================================
--- stable/11/sys/compat/linuxkpi/common/include/linux/bitops.h Thu Aug 16 08:11:17 2018 (r337897)
+++ stable/11/sys/compat/linuxkpi/common/include/linux/bitops.h Thu Aug 16 08:12:36 2018 (r337898)
@@ -282,10 +282,10 @@ test_and_clear_bit(long bit, volatile unsigned long *v
var += BIT_WORD(bit);
bit %= BITS_PER_LONG;
bit = (1UL << bit);
- do {
- val = *var;
- } while (atomic_cmpset_long(var, val, val & ~bit) == 0);
+ val = *var;
+ while (!atomic_fcmpset_long(var, &val, val & ~bit))
+ ;
return !!(val & bit);
}
@@ -312,10 +312,10 @@ test_and_set_bit(long bit, volatile unsigned long *var
var += BIT_WORD(bit);
bit %= BITS_PER_LONG;
bit = (1UL << bit);
- do {
- val = *var;
- } while (atomic_cmpset_long(var, val, val | bit) == 0);
+ val = *var;
+ while (!atomic_fcmpset_long(var, &val, val | bit))
+ ;
return !!(val & bit);
}
More information about the svn-src-all
mailing list