Message ID | 20180529154346.3168-6-mark.rutland@arm.com |
---|---|
State | Superseded |
Headers | show |
Series | atomics: API cleanups | expand |
On Tue, May 29, 2018 at 04:43:35PM +0100, Mark Rutland wrote: > /** > + * atomic64_add_unless - add unless the number is already a given value > + * @v: pointer of type atomic_t > + * @a: the amount to add to v... > + * @u: ...unless v is equal to u. > + * > + * Atomically adds @a to @v, so long as @v was not already @u. > + * Returns non-zero if @v was not @u, and zero otherwise. I always get confused by that wording; would something like: "Returns true if the addition was done" not be more clear? > + */ > +#ifdef atomic64_fetch_add_unless > +static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u) Do we want to make that a "bool' return? > +{ > + return atomic64_fetch_add_unless(v, a, u) != u; > +} > +#endif
On Tue, Jun 05, 2018 at 11:26:37AM +0200, Peter Zijlstra wrote: > On Tue, May 29, 2018 at 04:43:35PM +0100, Mark Rutland wrote: > > /** > > + * atomic64_add_unless - add unless the number is already a given value > > + * @v: pointer of type atomic_t > > + * @a: the amount to add to v... > > + * @u: ...unless v is equal to u. > > + * > > + * Atomically adds @a to @v, so long as @v was not already @u. > > + * Returns non-zero if @v was not @u, and zero otherwise. > > I always get confused by that wording; would something like: "Returns > true if the addition was done" not be more clear? Sounds clearer to me; I just stole the wording from the existing atomic_add_unless(). I guess you'll want similar for the conditional inc/dec ops, e.g. /** * atomic_inc_not_zero - increment unless the number is zero * @v: pointer of type atomic_t * * Atomically increments @v by 1, so long as @v is non-zero. * Returns non-zero if @v was non-zero, and zero otherwise. */ > > + */ > > +#ifdef atomic64_fetch_add_unless > > +static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u) > > Do we want to make that a "bool' return? I think so -- that's what the instrumented wrappers (and x86) do today anyhow, and what I ended up using for the generated headers. I'll spin a prep patch cleaning up the existing fallbacks in <linux/atomic.h>, along with the comment fixup above, then rework the additions likewise. Thanks, Mark.
Mark Rutland <mark.rutland@arm.com> writes: > On Tue, Jun 05, 2018 at 11:26:37AM +0200, Peter Zijlstra wrote: >> On Tue, May 29, 2018 at 04:43:35PM +0100, Mark Rutland wrote: >> > /** >> > + * atomic64_add_unless - add unless the number is already a given value >> > + * @v: pointer of type atomic_t >> > + * @a: the amount to add to v... >> > + * @u: ...unless v is equal to u. >> > + * >> > + * Atomically adds @a to @v, so long as @v was not already @u. >> > + * Returns non-zero if @v was not @u, and zero otherwise. >> >> I always get confused by that wording; would something like: "Returns >> true if the addition was done" not be more clear? > > Sounds clearer to me; I just stole the wording from the existing > atomic_add_unless(). > > I guess you'll want similar for the conditional inc/dec ops, e.g. > > /** > * atomic_inc_not_zero - increment unless the number is zero > * @v: pointer of type atomic_t > * > * Atomically increments @v by 1, so long as @v is non-zero. > * Returns non-zero if @v was non-zero, and zero otherwise. > */ If we're bike-shedding .. :) I think "so long as" is overly wordy and not helpful. It'd be clearer just as: * Atomically increments @v by 1, if @v is non-zero. cheers
On Tue, Jun 05, 2018 at 08:54:03PM +1000, Michael Ellerman wrote: > Mark Rutland <mark.rutland@arm.com> writes: > > On Tue, Jun 05, 2018 at 11:26:37AM +0200, Peter Zijlstra wrote: > >> On Tue, May 29, 2018 at 04:43:35PM +0100, Mark Rutland wrote: > >> > /** > >> > + * atomic64_add_unless - add unless the number is already a given value > >> > + * @v: pointer of type atomic_t > >> > + * @a: the amount to add to v... > >> > + * @u: ...unless v is equal to u. > >> > + * > >> > + * Atomically adds @a to @v, so long as @v was not already @u. > >> > + * Returns non-zero if @v was not @u, and zero otherwise. > >> > >> I always get confused by that wording; would something like: "Returns > >> true if the addition was done" not be more clear? > > > > Sounds clearer to me; I just stole the wording from the existing > > atomic_add_unless(). > > > > I guess you'll want similar for the conditional inc/dec ops, e.g. > > > > /** > > * atomic_inc_not_zero - increment unless the number is zero > > * @v: pointer of type atomic_t > > * > > * Atomically increments @v by 1, so long as @v is non-zero. > > * Returns non-zero if @v was non-zero, and zero otherwise. > > */ > > If we're bike-shedding .. :) > > I think "so long as" is overly wordy and not helpful. It'd be clearer > just as: > > * Atomically increments @v by 1, if @v is non-zero. I agree; done. Mark.
Mark Rutland <mark.rutland@arm.com> writes: > On Tue, Jun 05, 2018 at 08:54:03PM +1000, Michael Ellerman wrote: >> Mark Rutland <mark.rutland@arm.com> writes: >> > On Tue, Jun 05, 2018 at 11:26:37AM +0200, Peter Zijlstra wrote: >> >> On Tue, May 29, 2018 at 04:43:35PM +0100, Mark Rutland wrote: >> >> > /** >> >> > + * atomic64_add_unless - add unless the number is already a given value >> >> > + * @v: pointer of type atomic_t >> >> > + * @a: the amount to add to v... >> >> > + * @u: ...unless v is equal to u. >> >> > + * >> >> > + * Atomically adds @a to @v, so long as @v was not already @u. >> >> > + * Returns non-zero if @v was not @u, and zero otherwise. >> >> >> >> I always get confused by that wording; would something like: "Returns >> >> true if the addition was done" not be more clear? >> > >> > Sounds clearer to me; I just stole the wording from the existing >> > atomic_add_unless(). >> > >> > I guess you'll want similar for the conditional inc/dec ops, e.g. >> > >> > /** >> > * atomic_inc_not_zero - increment unless the number is zero >> > * @v: pointer of type atomic_t >> > * >> > * Atomically increments @v by 1, so long as @v is non-zero. >> > * Returns non-zero if @v was non-zero, and zero otherwise. >> > */ >> >> If we're bike-shedding .. :) >> >> I think "so long as" is overly wordy and not helpful. It'd be clearer >> just as: >> >> * Atomically increments @v by 1, if @v is non-zero. > > I agree; done. Thanks. cheers
diff --git a/include/asm-generic/atomic-instrumented.h b/include/asm-generic/atomic-instrumented.h index 6e0818c182e2..e22d7e5f4ce7 100644 --- a/include/asm-generic/atomic-instrumented.h +++ b/include/asm-generic/atomic-instrumented.h @@ -93,11 +93,20 @@ static __always_inline int atomic_fetch_add_unless(atomic_t *v, int a, int u) } #endif +#ifdef arch_atomic64_fetch_add_unless +#define atomic64_fetch_add_unless atomic64_fetch_add_unless +static __always_inline int atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u) +{ + kasan_check_write(v, sizeof(*v)); + return arch_atomic64_fetch_add_unless(v, a, u); +} +#else static __always_inline bool atomic64_add_unless(atomic64_t *v, s64 a, s64 u) { kasan_check_write(v, sizeof(*v)); return arch_atomic64_add_unless(v, a, u); } +#endif static __always_inline void atomic_inc(atomic_t *v) { diff --git a/include/linux/atomic.h b/include/linux/atomic.h index 1105c0b37f27..8d93209052e1 100644 --- a/include/linux/atomic.h +++ b/include/linux/atomic.h @@ -1072,6 +1072,22 @@ static inline int atomic_dec_if_positive(atomic_t *v) #endif /* atomic64_try_cmpxchg */ /** + * atomic64_add_unless - add unless the number is already a given value + * @v: pointer of type atomic_t + * @a: the amount to add to v... + * @u: ...unless v is equal to u. + * + * Atomically adds @a to @v, so long as @v was not already @u. + * Returns non-zero if @v was not @u, and zero otherwise. + */ +#ifdef atomic64_fetch_add_unless +static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u) +{ + return atomic64_fetch_add_unless(v, a, u) != u; +} +#endif + +/** * atomic64_inc_not_zero - increment unless the number is zero * @v: pointer of type atomic64_t *