aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/compat/linuxkpi/common/include/asm/atomic-long.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/sys/compat/linuxkpi/common/include/asm/atomic-long.h b/sys/compat/linuxkpi/common/include/asm/atomic-long.h
index b0763f456b90..b6909e1342e5 100644
--- a/sys/compat/linuxkpi/common/include/asm/atomic-long.h
+++ b/sys/compat/linuxkpi/common/include/asm/atomic-long.h
@@ -81,6 +81,21 @@ atomic_long_xchg(atomic_long_t *v, long val)
return atomic_swap_long(&v->counter, val);
}
+static inline long
+atomic_long_cmpxchg(atomic_long_t *v, long old, long new)
+{
+ long ret = old;
+
+ for (;;) {
+ if (atomic_cmpset_long(&v->counter, old, new))
+ break;
+ ret = READ_ONCE(v->counter);
+ if (ret != old)
+ break;
+ }
+ return (ret);
+}
+
static inline int
atomic_long_add_unless(atomic_long_t *v, long a, long u)
{