On 2019-05-31 11:55, Peter Zijlstra wrote:
On Thu, May 16, 2019 at 10:58:03AM +0200, Roman Penyaev wrote:
+#define atomic_set_unless_zero(ptr, flags)                     \
+({                                                             \
+       typeof(ptr) _ptr = (ptr);                               \
+       typeof(flags) _flags = (flags);                         \
+       typeof(*_ptr) _old, _val = READ_ONCE(*_ptr);            \
+                                                               \
+       for (;;) {                                              \
+               if (!_val)                                      \
+                       break;                                  \
+               _old = cmpxchg(_ptr, _val, _flags);             \
+               if (_old == _val)                               \
+                       break;                                  \
+               _val = _old;                                    \
+       }                                                       \
+       _val;                                                   \
+})

+#define atomic_or_with_mask(ptr, flags, mask)                  \
+({                                                             \
+       typeof(ptr) _ptr = (ptr);                               \
+       typeof(flags) _flags = (flags);                         \
+       typeof(flags) _mask = (mask);                           \
+       typeof(*_ptr) _old, _new, _val = READ_ONCE(*_ptr);      \
+                                                               \
+       for (;;) {                                              \
+               _new = (_val & ~_mask) | _flags;            \
+               _old = cmpxchg(_ptr, _val, _new);               \
+               if (_old == _val)                               \
+                       break;                                  \
+               _val = _old;                                    \
+       }                                                       \
+       _val;                                                   \
+})

Don't call them atomic_*() if they're not part of the atomic_t
interface.

Can we add those two?  Or keep it local is better?

--
Roman



Reply via email to