From: Mark Rutland <mark.rutland@arm.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@kernel.org>,
linux-kernel@vger.kernel.org, akpm@linux-foundation.org,
will.deacon@arm.com, torvalds@linux-foundation.org,
paulmck@linux.vnet.ibm.com, tglx@linutronix.de, hpa@zytor.com,
linux-tip-commits@vger.kernel.org
Subject: Re: [tip:locking/core] locking/atomics: Simplify the op definitions in atomic.h some more
Date: Tue, 15 May 2018 16:43:33 +0100 [thread overview]
Message-ID: <20180515154333.bszh4nuowhocozuc@lakrids.cambridge.arm.com> (raw)
In-Reply-To: <20180515114144.GX12217@hirez.programming.kicks-ass.net>
On Tue, May 15, 2018 at 01:41:44PM +0200, Peter Zijlstra wrote:
> On Tue, May 15, 2018 at 10:35:56AM +0200, Ingo Molnar wrote:
> > Which is just _half_ the linecount.
>
> It also provides less. I do not believe smaller is better here. The
> line count really isn't the problem with this stuff.
>
> The main pain point here is keeping the atomic, atomic64 and atomic_long
> crud consistent, typically we tend to forget about atomic_long because
> that lives in an entirely different header.
>
> In any case, see:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git/commit/?h=atomics/generated&id=e54c888b3b9d8f3ef57b1a9c4255a6371cb9977d
>
> which generates the atomic/atomic64 bits but does not yet deal with
> atomic_long (I think I would've kept the 'header' thing in the
> normal .h file but whatever).
>
> Once we have the atomic_long thing added, we should also have enough
> data to do function forwarding, and we should be able to start looking
> at the whole annotated stuff.
>
> Now clearly Mark hasn't had time to further work on that. But consider a
> table like:
>
> add(i,v) RF
> sub(i,v) RF
> inc(v) RF
> dec(v) RF
> or(i,v) F
> and(i,v) F
> andnot(i,v) F
> xor(i,v) F
> xchg(v,i) X
> cmpxchg(v,i,j) X
> try_cmpxchg(v,I,j) XB
>
> With the following proglet; that should contain enough to do full
> forwarding (seems I forgot to implement 'B').
I put together the following while trying to avoid bash magic (i.e the
arrays, and keeping the option of naming the params. My local copy of
dash seems happy with it.
I *think* the table can encode enough info to generate atomic-long.h,
atomic-instrumented.h, and the atomic.h ordering fallbacks. I'll need to
flesh out the table and check that we don't end up clashing with
some of the regular fallbacks.
Thanks,
Mark.
----
# name meta args...
#
# Where meta contains a string of:
# * B - bool: returns bool, fully ordered
# * V - void: returns void, fully ordered
# * I - int: returns base type, all orderings
# * R - return: returns base type, all orderings
# * F - fetch: returns base type, all orderings
# * T - try: returns bool, all orderings
#
# Where args contains list of type[:name], where type is:
# * v - pointer to atomic base type (atomic or atomic64)
# * i - base type (int or long)
# * I - pointer to base type (int or long)
#
add VRF i v
sub VRF i v
inc VRF v
dec VRF v
or VF i v
and VF i v
andnot VF i v
xor VF i v
xchg I v i
cmpxchg I v i:old i:new
try_cmpxchg T v I:old i:new
add_and_test B i v
sub_and_test B i v
dec_and_test B v
inc_and_test B v
----
----
#!/bin/sh
gen_return_type() {
local meta="$1"; shift
local basetype="$1"; shift
expr match "${meta}" "[V]" > /dev/null && printf "void"
expr match "${meta}" "[BT]" > /dev/null && printf "bool"
expr match "${meta}" "[IFR]" > /dev/null && printf "${basetype}"
}
gen_param()
{
local basetype="$1"; shift
local atomictype="$1"; shift
local fmt="$1"; shift
local name="${fmt#*:}"
local type="${fmt%%:*}"
[ "${type}" = "i" ] && type="${basetype} "
[ "${type}" = "I" ] && type="${basetype} *"
[ "${type}" = "v" ] && type="${atomictype} *"
printf "%s%s" "${type}" "${name}"
}
gen_params()
{
local basetype="$1"; shift
local atomictype="$1"; shift
while [ "$#" -gt 0 ]; do
gen_param "${basetype}" "${atomictype}" "$1"
[ "$#" -gt 1 ] && printf ", "
shift;
done
}
gen_proto_return_order_variant()
{
local meta="$1"; shift;
local name="$1"; shift
local pfx="$1"; shift
local basetype="$1"; shift
gen_return_type "$meta" "${basetype}"
printf " %s_%s(" "${pfx}" "${name}"
gen_params "${basetype}" "${pfx}_t" $@
printf ");\n"
}
gen_proto_return_order_variants()
{
local meta="$1"; shift
local name="$1"; shift
gen_proto_return_order_variant "${meta}" "${name}" "$@"
if expr match "${meta}" "[RFXC]" > /dev/null; then
gen_proto_return_order_variant "${meta}" "${name}_acquire" "$@"
gen_proto_return_order_variant "${meta}" "${name}_release" "$@"
gen_proto_return_order_variant "${meta}" "${name}_relaxed" "$@"
fi
}
gen_proto_variants()
{
local meta="$1"; shift
local name="$1"; shift
[ "${meta}" = "R" ] && name="${name}_return"
[ "${meta}" = "F" ] && name="fetch_${name}"
gen_proto_return_order_variants "${meta}" "${name}" "$@"
}
gen_proto() {
local meta="$1"; shift
for m in $(echo "${meta}" | fold -w1); do
gen_proto_variants "${m}" $@
done
}
grep '^[a-z]' "$1" | while read name meta args; do
gen_proto "${meta}" "${name}" "atomic" "int" ${args}
gen_proto "${meta}" "${name}" "atomic64" "s64" ${args}
gen_proto "${meta}" "${name}" "atomic_long" "long" ${args}
done
----
next prev parent reply other threads:[~2018-05-15 15:43 UTC|newest]
Thread overview: 103+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-04 17:39 [PATCH 0/6] arm64: add instrumented atomics Mark Rutland
2018-05-04 17:39 ` Mark Rutland
2018-05-04 17:39 ` [PATCH 1/6] locking/atomic, asm-generic: instrument ordering variants Mark Rutland
2018-05-04 17:39 ` Mark Rutland
2018-05-04 18:01 ` Peter Zijlstra
2018-05-04 18:01 ` Peter Zijlstra
2018-05-04 18:09 ` Mark Rutland
2018-05-04 18:09 ` Mark Rutland
2018-05-04 18:24 ` Peter Zijlstra
2018-05-04 18:24 ` Peter Zijlstra
2018-05-05 9:12 ` Mark Rutland
2018-05-05 9:12 ` Mark Rutland
2018-05-05 8:11 ` [PATCH] locking/atomics: Clean up the atomic.h maze of #defines Ingo Molnar
2018-05-05 8:11 ` Ingo Molnar
2018-05-05 8:36 ` [PATCH] locking/atomics: Simplify the op definitions in atomic.h some more Ingo Molnar
2018-05-05 8:36 ` Ingo Molnar
2018-05-05 8:54 ` [PATCH] locking/atomics: Combine the atomic_andnot() and atomic64_andnot() API definitions Ingo Molnar
2018-05-05 8:54 ` Ingo Molnar
2018-05-06 12:15 ` [tip:locking/core] " tip-bot for Ingo Molnar
2018-05-06 14:15 ` [PATCH] " Andrea Parri
2018-05-06 14:15 ` Andrea Parri
2018-05-06 12:14 ` [tip:locking/core] locking/atomics: Simplify the op definitions in atomic.h some more tip-bot for Ingo Molnar
2018-05-09 7:33 ` Peter Zijlstra
2018-05-09 13:03 ` Will Deacon
2018-05-15 8:54 ` Ingo Molnar
2018-05-15 8:35 ` Ingo Molnar
2018-05-15 11:41 ` Peter Zijlstra
2018-05-15 12:13 ` Peter Zijlstra
2018-05-15 15:43 ` Mark Rutland [this message]
2018-05-15 17:10 ` Peter Zijlstra
2018-05-15 17:53 ` Mark Rutland
2018-05-15 18:11 ` Peter Zijlstra
2018-05-15 18:15 ` Peter Zijlstra
2018-05-15 18:52 ` Linus Torvalds
2018-05-15 19:39 ` Peter Zijlstra
2018-05-21 17:12 ` Mark Rutland
2018-05-06 14:12 ` [PATCH] " Andrea Parri
2018-05-06 14:12 ` Andrea Parri
2018-05-06 14:57 ` Ingo Molnar
2018-05-06 14:57 ` Ingo Molnar
2018-05-07 9:54 ` Andrea Parri
2018-05-07 9:54 ` Andrea Parri
2018-05-18 18:43 ` Palmer Dabbelt
2018-05-18 18:43 ` Palmer Dabbelt
2018-05-05 8:47 ` [PATCH] locking/atomics: Clean up the atomic.h maze of #defines Peter Zijlstra
2018-05-05 8:47 ` Peter Zijlstra
2018-05-05 9:04 ` Ingo Molnar
2018-05-05 9:04 ` Ingo Molnar
2018-05-05 9:24 ` Peter Zijlstra
2018-05-05 9:24 ` Peter Zijlstra
2018-05-05 9:38 ` Ingo Molnar
2018-05-05 9:38 ` Ingo Molnar
2018-05-05 10:00 ` [RFC PATCH] locking/atomics/powerpc: Introduce optimized cmpxchg_release() family of APIs for PowerPC Ingo Molnar
2018-05-05 10:00 ` Ingo Molnar
2018-05-05 10:26 ` Boqun Feng
2018-05-05 10:26 ` Boqun Feng
2018-05-06 1:56 ` Benjamin Herrenschmidt
2018-05-06 1:56 ` Benjamin Herrenschmidt
2018-05-05 10:16 ` [PATCH] locking/atomics: Clean up the atomic.h maze of #defines Boqun Feng
2018-05-05 10:16 ` Boqun Feng
2018-05-05 10:35 ` [RFC PATCH] locking/atomics/powerpc: Clarify why the cmpxchg_relaxed() family of APIs falls back to full cmpxchg() Ingo Molnar
2018-05-05 10:35 ` Ingo Molnar
2018-05-05 11:28 ` Boqun Feng
2018-05-05 11:28 ` Boqun Feng
2018-05-05 13:27 ` [PATCH] locking/atomics/powerpc: Move cmpxchg helpers to asm/cmpxchg.h and define the full set of cmpxchg APIs Ingo Molnar
2018-05-05 13:27 ` Ingo Molnar
2018-05-05 14:03 ` Boqun Feng
2018-05-05 14:03 ` Boqun Feng
2018-05-06 12:11 ` Ingo Molnar
2018-05-06 12:11 ` Ingo Molnar
2018-05-07 1:04 ` Boqun Feng
2018-05-07 1:04 ` Boqun Feng
2018-05-07 6:50 ` Ingo Molnar
2018-05-07 6:50 ` Ingo Molnar
2018-05-06 12:13 ` [tip:locking/core] " tip-bot for Boqun Feng
2018-05-07 13:31 ` [PATCH v2] " Boqun Feng
2018-05-07 13:31 ` Boqun Feng
2018-05-05 9:05 ` [PATCH] locking/atomics: Clean up the atomic.h maze of #defines Dmitry Vyukov
2018-05-05 9:05 ` Dmitry Vyukov
2018-05-05 9:32 ` Peter Zijlstra
2018-05-05 9:32 ` Peter Zijlstra
2018-05-07 6:43 ` [RFC PATCH] locking/atomics/x86/64: Clean up and fix details of <asm/atomic64_64.h> Ingo Molnar
2018-05-07 6:43 ` Ingo Molnar
2018-05-05 9:09 ` [PATCH] locking/atomics: Clean up the atomic.h maze of #defines Ingo Molnar
2018-05-05 9:09 ` Ingo Molnar
2018-05-05 9:29 ` Peter Zijlstra
2018-05-05 9:29 ` Peter Zijlstra
2018-05-05 10:48 ` [PATCH] locking/atomics: Shorten the __atomic_op() defines to __op() Ingo Molnar
2018-05-05 10:48 ` Ingo Molnar
2018-05-05 10:59 ` Ingo Molnar
2018-05-05 10:59 ` Ingo Molnar
2018-05-06 12:15 ` [tip:locking/core] " tip-bot for Ingo Molnar
2018-05-06 12:14 ` [tip:locking/core] locking/atomics: Clean up the atomic.h maze of #defines tip-bot for Ingo Molnar
2018-05-04 17:39 ` [PATCH 2/6] locking/atomic, asm-generic: instrument atomic*andnot*() Mark Rutland
2018-05-04 17:39 ` Mark Rutland
2018-05-04 17:39 ` [PATCH 3/6] arm64: use <linux/atomic.h> for cmpxchg Mark Rutland
2018-05-04 17:39 ` Mark Rutland
2018-05-04 17:39 ` [PATCH 4/6] arm64: fix assembly constraints " Mark Rutland
2018-05-04 17:39 ` Mark Rutland
2018-05-04 17:39 ` [PATCH 5/6] arm64: use instrumented atomics Mark Rutland
2018-05-04 17:39 ` Mark Rutland
2018-05-04 17:39 ` [PATCH 6/6] arm64: instrument smp_{load_acquire,store_release} Mark Rutland
2018-05-04 17:39 ` 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=20180515154333.bszh4nuowhocozuc@lakrids.cambridge.arm.com \
--to=mark.rutland@arm.com \
--cc=akpm@linux-foundation.org \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.