From: Mark Rutland <mark.rutland@arm.com>
To: linux-kernel@vger.kernel.org, will.deacon@arm.com,
peterz@infradead.org, boqun.feng@gmail.com
Cc: mingo@kernel.org, Mark Rutland <mark.rutland@arm.com>,
Vineet Gupta <vgupta@synopsys.com>
Subject: [PATCHv3 10/18] atomics/arc: define atomic64_fetch_add_unless()
Date: Mon, 18 Jun 2018 11:19:11 +0100 [thread overview]
Message-ID: <20180618101919.51973-11-mark.rutland@arm.com> (raw)
In-Reply-To: <20180618101919.51973-1-mark.rutland@arm.com>
As a step towards unifying the atomic/atomic64/atomic_long APIs, this
patch converts the arch/arc implementation of atomic64_add_unless() into
an implementation of atomic64_fetch_add_unless().
A wrapper in <linux/atomic.h> will build atomic_add_unless() atop of
this, provided it is given a preprocessor definition.
No functional change is intended as a result of this patch.
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Vineet Gupta <vgupta@synopsys.com>
---
arch/arc/include/asm/atomic.h | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/arch/arc/include/asm/atomic.h b/arch/arc/include/asm/atomic.h
index 60da80481c5d..4917ffa61579 100644
--- a/arch/arc/include/asm/atomic.h
+++ b/arch/arc/include/asm/atomic.h
@@ -531,41 +531,40 @@ static inline long long atomic64_dec_if_positive(atomic64_t *v)
}
/**
- * atomic64_add_unless - add unless the number is a given value
+ * atomic64_fetch_add_unless - add unless the number is a given value
* @v: pointer of type atomic64_t
* @a: the amount to add to v...
* @u: ...unless v is equal to u.
*
- * if (v != u) { v += a; ret = 1} else {ret = 0}
- * Returns 1 iff @v was not @u (i.e. if add actually happened)
+ * Atomically adds @a to @v, if it was not @u.
+ * Returns the old value of @v
*/
-static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u)
+static inline long long atomic64_fetch_add_unless(atomic64_t *v, long long a,
+ long long u)
{
- long long val;
- int op_done;
+ long long old, temp;
smp_mb();
__asm__ __volatile__(
"1: llockd %0, [%2] \n"
- " mov %1, 1 \n"
" brne %L0, %L4, 2f # continue to add since v != u \n"
" breq.d %H0, %H4, 3f # return since v == u \n"
- " mov %1, 0 \n"
"2: \n"
- " add.f %L0, %L0, %L3 \n"
- " adc %H0, %H0, %H3 \n"
- " scondd %0, [%2] \n"
+ " add.f %L1, %L0, %L3 \n"
+ " adc %H1, %H0, %H3 \n"
+ " scondd %1, [%2] \n"
" bnz 1b \n"
"3: \n"
- : "=&r"(val), "=&r" (op_done)
+ : "=&r"(old), "=&r" (temp)
: "r"(&v->counter), "r"(a), "r"(u)
: "cc"); /* memory clobber comes from smp_mb() */
smp_mb();
- return op_done;
+ return old;
}
+#define atomic64_fetch_add_unless atomic64_fetch_add_unless
#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
#define atomic64_inc(v) atomic64_add(1LL, (v))
--
2.11.0
next prev parent reply other threads:[~2018-06-18 10:22 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-18 10:19 [PATCHv3 00/18] atomics: API cleanups Mark Rutland
2018-06-18 10:19 ` [PATCHv3 01/18] atomics/treewide: s/__atomic_add_unless/atomic_fetch_add_unless/ Mark Rutland
2018-06-18 10:19 ` [PATCHv3 02/18] atomics/treewide: remove redundant atomic_inc_not_zero() definitions Mark Rutland
2018-06-18 10:19 ` [PATCHv3 03/18] atomics/treewide: remove atomic_inc_not_zero_hint() Mark Rutland
2018-06-18 10:19 ` [PATCHv3 04/18] atomics: make conditional ops return bool Mark Rutland
2018-06-18 10:19 ` [PATCHv3 05/18] atomics/treewide: make atomic64_inc_not_zero() optional Mark Rutland
2018-06-18 10:19 ` [PATCHv3 06/18] atomics/treewide: make atomic_fetch_add_unless() optional Mark Rutland
2018-06-18 10:19 ` [PATCHv3 07/18] atomics: prepare for atomic64_fetch_add_unless() Mark Rutland
2018-06-18 16:10 ` Mark Rutland
2018-06-18 10:19 ` [PATCHv3 08/18] atomics/generic: define atomic64_fetch_add_unless() Mark Rutland
2018-06-18 10:19 ` [PATCHv3 09/18] atomics/alpha: " Mark Rutland
2018-06-18 15:54 ` Will Deacon
2018-06-18 16:08 ` Mark Rutland
2018-06-21 11:00 ` Ingo Molnar
2018-06-18 10:19 ` Mark Rutland [this message]
2018-06-18 10:19 ` [PATCHv3 11/18] atomics/arm: " Mark Rutland
2018-06-18 10:19 ` [PATCHv3 12/18] atomics/powerpc: " Mark Rutland
2018-06-18 10:19 ` [PATCHv3 13/18] atomics/riscv: " Mark Rutland
2018-06-18 10:19 ` [PATCHv3 14/18] atomics/treewide: make atomic64_fetch_add_unless() optional Mark Rutland
2018-06-18 10:19 ` [PATCHv3 15/18] atomics/treewide: make test ops optional Mark Rutland
2018-06-18 10:19 ` [PATCHv3 16/18] atomics/treewide: make unconditional inc/dec " Mark Rutland
2018-06-18 10:19 ` [PATCHv3 17/18] atomics/treewide: make conditional " Mark Rutland
2018-06-18 10:19 ` [PATCHv3 18/18] atomics/treewide: clean up andnot ifdeffery Mark Rutland
2018-06-18 16:38 ` [PATCHv3 00/18] atomics: API cleanups Will Deacon
2018-06-18 19:21 ` Mark Rutland
2018-06-19 10:18 ` Mark Rutland
2018-06-19 10:20 ` Will Deacon
2018-06-19 10:38 ` Mark Rutland
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180618101919.51973-11-mark.rutland@arm.com \
--to=mark.rutland@arm.com \
--cc=boqun.feng@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=vgupta@synopsys.com \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®