Both Documentation/memory-barriers.txt and Documentation/atomic_ops.txt state
that atomic_add_unless() implies smp_mb() on each side of the operation.

Is it true?

include/asm-most_of/atomic.h:

        #define atomic_add_unless(v, a, u)                              \
        ({                                                              \
                int c, old;                                             \
                c = atomic_read(v);                                     \
                for (;;) {                                              \
                        if (unlikely(c == (u)))                         \
                                break;                                  \
                        old = atomic_cmpxchg((v), c, c + (a));          \
                        if (likely(old == c))                           \
                                break;                                  \
                        c = old;                                        \
                }                                                       \
                c != (u);                                               \
        })

This looks like atomic_add_unless() implies mb() only if it returns 1.
Otherwise it could fail (return 0) before the first atomic_cmpxchg(),
but atomic_read() provides a compiler barrier only.

Could you clarify?

Oleg.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to