|
@@ -221,18 +221,17 @@ do { \
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
|
- * smp_cond_load_acquire() - (Spin) wait for cond with ACQUIRE ordering
|
|
|
+ * smp_cond_load_relaxed() - (Spin) wait for cond with no ordering guarantees
|
|
|
* @ptr: pointer to the variable to wait on
|
|
|
* @cond: boolean expression to wait for
|
|
|
*
|
|
|
- * Equivalent to using smp_load_acquire() on the condition variable but employs
|
|
|
- * the control dependency of the wait to reduce the barrier on many platforms.
|
|
|
+ * Equivalent to using READ_ONCE() on the condition variable.
|
|
|
*
|
|
|
* Due to C lacking lambda expressions we load the value of *ptr into a
|
|
|
* pre-named variable @VAL to be used in @cond.
|
|
|
*/
|
|
|
-#ifndef smp_cond_load_acquire
|
|
|
-#define smp_cond_load_acquire(ptr, cond_expr) ({ \
|
|
|
+#ifndef smp_cond_load_relaxed
|
|
|
+#define smp_cond_load_relaxed(ptr, cond_expr) ({ \
|
|
|
typeof(ptr) __PTR = (ptr); \
|
|
|
typeof(*ptr) VAL; \
|
|
|
for (;;) { \
|
|
@@ -241,10 +240,26 @@ do { \
|
|
|
break; \
|
|
|
cpu_relax(); \
|
|
|
} \
|
|
|
- smp_acquire__after_ctrl_dep(); \
|
|
|
VAL; \
|
|
|
})
|
|
|
#endif
|
|
|
|
|
|
+/**
|
|
|
+ * smp_cond_load_acquire() - (Spin) wait for cond with ACQUIRE ordering
|
|
|
+ * @ptr: pointer to the variable to wait on
|
|
|
+ * @cond: boolean expression to wait for
|
|
|
+ *
|
|
|
+ * Equivalent to using smp_load_acquire() on the condition variable but employs
|
|
|
+ * the control dependency of the wait to reduce the barrier on many platforms.
|
|
|
+ */
|
|
|
+#ifndef smp_cond_load_acquire
|
|
|
+#define smp_cond_load_acquire(ptr, cond_expr) ({ \
|
|
|
+ typeof(*ptr) _val; \
|
|
|
+ _val = smp_cond_load_relaxed(ptr, cond_expr); \
|
|
|
+ smp_acquire__after_ctrl_dep(); \
|
|
|
+ _val; \
|
|
|
+})
|
|
|
+#endif
|
|
|
+
|
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
#endif /* __ASM_GENERIC_BARRIER_H */
|