Messages in this thread | | | Date | Tue, 24 Nov 2015 22:19:52 +0100 | From | Frederic Weisbecker <> | Subject | Re: [PATCH 1/7] atomic: Export fetch_or() |
| |
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<cl@linux.com> > >Cc: Chris Metcalf<cmetcalf@ezchip.com> > >Cc: Ingo Molnar<mingo@kernel.org> > >Cc: Luiz Capitulino<lcapitulino@redhat.com> > >Cc: Peter Zijlstra<peterz@infradead.org> > >Cc: Rik van Riel<riel@redhat.com> > >Cc: Thomas Gleixner<tglx@linutronix.de> > >Cc: Viresh Kumar<viresh.kumar@linaro.org> > >Signed-off-by: Frederic Weisbecker<fweisbec@gmail.com> > >--- > > 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!
| |