On Tue, Nov 24, 2015 at 10:58:00AM -0500, Chris Metcalf wrote: > On 11/13/2015 09:22 AM, Frederic Weisbecker wrote: > >Export fetch_or() that's implemented and used internally by the > >scheduler. We are going to use it for NO_HZ so make it generally > >available. > > > >Cc: Christoph Lameter<[email protected]> > >Cc: Chris Metcalf<[email protected]> > >Cc: Ingo Molnar<[email protected]> > >Cc: Luiz Capitulino<[email protected]> > >Cc: Peter Zijlstra<[email protected]> > >Cc: Rik van Riel<[email protected]> > >Cc: Thomas Gleixner<[email protected]> > >Cc: Viresh Kumar<[email protected]> > >Signed-off-by: Frederic Weisbecker<[email protected]> > >--- > > include/linux/atomic.h | 18 ++++++++++++++++++ > > kernel/sched/core.c | 14 -------------- > > 2 files changed, 18 insertions(+), 14 deletions(-) > > > >diff --git a/include/linux/atomic.h b/include/linux/atomic.h > >index 00a5763..c3b99f8 100644 > >--- a/include/linux/atomic.h > >+++ b/include/linux/atomic.h > >@@ -451,6 +451,24 @@ static inline int atomic_dec_if_positive(atomic_t *v) > > } > > #endif > >+/** > >+ * fetch_or - perform *ptr |= mask and return old value of *ptr > >+ * @ptr: pointer to value > >+ * @mask: mask to OR on the value > >+ * > >+ * cmpxchg based fetch_or, macro so it works for different integer types > >+ */ > >+#define fetch_or(ptr, mask) \ > >+({ typeof(*(ptr)) __old, __val = *(ptr); \ > >+ for (;;) { \ > >+ __old = cmpxchg((ptr), __val, __val | (mask)); \ > >+ if (__old == __val) \ > >+ break; \ > >+ __val = __old; \ > >+ } \ > >+ __old; \ > >+}) > >+ > > #include <asm-generic/atomic-long.h> > > #ifdef CONFIG_GENERIC_ATOMIC64 > > #include <asm-generic/atomic64.h> > > I think this should be guarded by an "#ifndef" like other things in > this file, so architectures can provide their own implementations, > or can use the C11 atomic_fetch_or() for newer compilers.
Right. > > Also, I wonder about the nomenclature here: other than cmpxchg > and xchg, all the atomic ops are named "atomic_xxx". For something > that returns the old value, I'd expect it to be atomic_or_return() > and be otherwise like the existing atomic_or() routine, and thus you'd > specify "atomic_t tick_dependency". I think Peterz needs it to be type-generic, like cmpxchg, such that he can use it on tsk->thread_info->flags which type can vary. But if we happen to need an atomic_t version, we can also provide an atomic_fetch_or() version. Also note that or_return() means that you first do OR and then return the new value. I remember debating a bit the name with Peterz and the current one now makes quite some sense to me too :-) Thanks! -- 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/

