|
@@ -291,19 +291,37 @@ atomic64_cmpxchg(atomic64_t *ptr, unsigned long long old_val,
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * atomic64_set - set atomic64 variable
|
|
|
|
|
|
+ * atomic64_xchg - xchg atomic64 variable
|
|
* @ptr: pointer to type atomic64_t
|
|
* @ptr: pointer to type atomic64_t
|
|
* @new_val: value to assign
|
|
* @new_val: value to assign
|
|
|
|
+ * @old_val: old value that was there
|
|
*
|
|
*
|
|
- * Atomically sets the value of @ptr to @new_val.
|
|
|
|
|
|
+ * Atomically xchgs the value of @ptr to @new_val and returns
|
|
|
|
+ * the old value.
|
|
*/
|
|
*/
|
|
-static inline void atomic64_set(atomic64_t *ptr, unsigned long long new_val)
|
|
|
|
|
|
+
|
|
|
|
+static inline unsigned long long
|
|
|
|
+atomic64_xchg(atomic64_t *ptr, unsigned long long new_val)
|
|
{
|
|
{
|
|
unsigned long long old_val;
|
|
unsigned long long old_val;
|
|
|
|
|
|
do {
|
|
do {
|
|
old_val = atomic_read(ptr);
|
|
old_val = atomic_read(ptr);
|
|
} while (atomic64_cmpxchg(ptr, old_val, new_val) != old_val);
|
|
} while (atomic64_cmpxchg(ptr, old_val, new_val) != old_val);
|
|
|
|
+
|
|
|
|
+ return old_val;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * atomic64_set - set atomic64 variable
|
|
|
|
+ * @ptr: pointer to type atomic64_t
|
|
|
|
+ * @new_val: value to assign
|
|
|
|
+ *
|
|
|
|
+ * Atomically sets the value of @ptr to @new_val.
|
|
|
|
+ */
|
|
|
|
+static inline void atomic64_set(atomic64_t *ptr, unsigned long long new_val)
|
|
|
|
+{
|
|
|
|
+ atomic64_xchg(ptr, new_val);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|