From: George Spelvin <lkml@SDF.ORG>
To: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, lkml@sdf.org
Subject: Re: [RFC PATCH v1 44/50] arm64: ptr auth: Use get_random_u64 instead of _bytes
Date: Mon, 30 Mar 2020 19:32:37 +0000 [thread overview]
Message-ID: <20200330193237.GC9199@SDF.ORG> (raw)
In-Reply-To: <20200330105745.GA1309@C02TD0UTHF1T.local>
Sorry for the delay responding; I had to re-set-up my arm64
cross-compilation environment.
On Mon, Mar 30, 2020 at 11:57:45AM +0100, Mark Rutland wrote:
> On Tue, Dec 10, 2019 at 07:15:55AM -0500, George Spelvin wrote:
>> Since these are authentication keys, stored in the kernel as long
>> as they're important, get_random_u64 is fine. In particular,
>> get_random_bytes has significant per-call overhead, so five
>> separate calls is painful.
>
> As I am unaware, how does the cost of get_random_bytes() compare to the
> cost of get_random_u64()?
It's approximately 8 times the cost.
Because get_random_bytes() implements anti-backtracking, it's a minimum
of one global lock and one ChaCha20 operation per call. Even though
chacha_block_generic() returns 64 bytes, for anti-backtracking we use
32 of them to generate a new key and discard the remainder.
get_random_u64() uses the exact same generator, but amortizes the cost by
storing the output in a per-CPU buffer which it only has to refill every
64 bytes generated. 7/8 of the time, it's just a fetch from a per-CPU
data structure.
>> This ended up being a more extensive change, since the previous
>> code was unrolled and 10 calls to get_random_u64() seems excessive.
>> So the code was rearranged to have smaller object size.
>
> It's not really "unrolled", but rather "not a loop", so I'd prefer to
> not artifially make it look like one.
I intended that to mean "not in a loop, but could be". I guess
this entire exchange is about the distinction between "could be"
and "should be". ;-)
Yes, I went overboard, and your proposed change below is perfectly
fine with me.
> Could you please quantify the size difference when going from
> get_random_bytes() to get_random_u64(), if that is excessive enough to
> warrant changing the structure of the code? Otherwise please leave the
> structure as-is as given it is much easier to reason about -- suggestion
> below on how to do that neatly.
Here are the various code sizes:
text data bss dec hex filename
1480 0 0 1480 5c8 arch/arm64/kernel/pointer_auth.o.old
862 0 0 862 35e arch/arm64/kernel/pointer_auth.o.new
1492 0 0 1492 5d4 arch/arm64/kernel/pointer_auth.o.new2
1560 0 0 1560 618 arch/arm64/kernel/pointer_auth.o.new3
"old" is the existing code. "new" is my restructured code.
"new2" is your simple change with a __ptrauth_key_init() helper.
"new3" is with the helper forced noinline.
I shrank the code significantly, but deciding whether that's a net
improvement is your perogative.
I should mention that at the end of my patch series, I added a function
(currently called get_random_nonce(), but that's subject to revision)
which uses the get_random_u64 internals with the same interface as
get_random_bytes(). We could postpone this whole thing until that gets
a final name and merged.
(BTW, somehow in my patch a "#include <linux/prctl.h>" needed in the
revised <asm/pointer_auth.h> got omitted. I probably did something stupid
like added it in my cross-compilation tree but didn't push it back to my
main development tree. Sorry.)
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-03-30 19:32 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-10 12:15 [RFC PATCH v1 44/50] arm64: ptr auth: Use get_random_u64 instead of _bytes George Spelvin
2020-03-30 10:57 ` Mark Rutland
2020-03-30 19:32 ` George Spelvin [this message]
2020-03-31 0:27 ` George Spelvin
2020-03-31 10:14 ` Mark Rutland
2020-03-31 14:49 ` George Spelvin
2020-03-31 16:26 ` 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=20200330193237.GC9199@SDF.ORG \
--to=lkml@sdf.org \
--cc=catalin.marinas@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=will@kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).