On Fri, May 31, 2019 at 01:24:07PM +0200, Roman Penyaev wrote:
> 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?

Afaict you're using them on the user visible values; we should not put
atomic_t into shared memory.

Your interface isn't compatible with those 'funny' architectures like
parisc etc. Since you expect userspace to do atomic ops on these
variables too. It is not a one-way interface ...

Reply via email to