From: Eric Biggers <ebiggers@kernel.org>
To: Herbert Xu <herbert@gondor.apana.org.au>
Cc: linux-crypto@vger.kernel.org, fsverity@lists.linux.dev,
dm-devel@lists.linux.dev, x86@kernel.org,
linux-arm-kernel@lists.infradead.org,
Ard Biesheuvel <ardb@kernel.org>,
Sami Tolvanen <samitolvanen@google.com>,
Bart Van Assche <bvanassche@acm.org>
Subject: Re: [PATCH v4 6/8] fsverity: improve performance by using multibuffer hashing
Date: Tue, 4 Jun 2024 11:42:20 -0700 [thread overview]
Message-ID: <20240604184220.GC1566@sol.localdomain> (raw)
In-Reply-To: <Zl7gYOMyscYDKZ8_@gondor.apana.org.au>
On Tue, Jun 04, 2024 at 05:37:36PM +0800, Herbert Xu wrote:
> On Mon, Jun 03, 2024 at 11:37:29AM -0700, Eric Biggers wrote:
> >
> > + for (i = 0; i < ctx->num_pending; i++) {
> > + data[i] = ctx->pending_blocks[i].data;
> > + outs[i] = ctx->pending_blocks[i].hash;
> > + }
> > +
> > + desc->tfm = params->hash_alg->tfm;
> > + if (params->hashstate)
> > + err = crypto_shash_import(desc, params->hashstate);
> > + else
> > + err = crypto_shash_init(desc);
> > + if (err) {
> > + fsverity_err(inode, "Error %d importing hash state", err);
> > + return false;
> > + }
> > + err = crypto_shash_finup_mb(desc, data, params->block_size, outs,
> > + ctx->num_pending);
> > + if (err) {
> > + fsverity_err(inode, "Error %d computing block hashes", err);
> > + return false;
> > + }
>
> So with ahash operating in synchronous mode (callback == NULL), this
> would look like:
>
> struct ahash_request *reqs[FS_VERITY_MAX_PENDING_DATA_BLOCKS];
>
> for (i = 0; i < ctx->num_pending; i++) {
> reqs[i] = fsverity_alloc_hash_request();
> if (!req) {
> free all reqs;
> return false;
> }
>
> if (params->hashstate)
> err = crypto_ahash_import(&reqs[i], params->hashstate);
> else
> err = crypto_ahash_init(&reqs[i]);
>
> if (err) {
> fsverity_err(inode, "Error %d importing hash state", err);
> free all reqs;
> return false;
> }
> }
>
> for (i = 0; i < ctx->num_pending; i++) {
> unsigned more;
>
> if (params->hashstate)
> err = crypto_ahash_import(req, params->hashstate);
> else
> err = crypto_ahash_init(req);
>
> if (err) {
> fsverity_err(inode, "Error %d importing hash state", err);
> free all requests;
> return false;
> }
>
> more = 0;
> if (i + 1 < ctx->num_pending)
> more = CRYPTO_TFM_REQ_MORE;
> ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP | more,
> NULL, NULL);
> ahash_request_set_crypt(req, ctx->pending_blocks[i].sg,
> ctx->pending_blocks[i].hash,
> params->block_size);
>
> err = crypto_ahash_finup(req);
> if (err) {
> fsverity_err(inode, "Error %d computing block hashes", err);
> free all requests;
> return false;
> }
> }
>
> You're hiding some of the complexity by not allocating memory
> explicitly for each hash state. This might fit on the stack
> for two requests, but eventually you will have to allocate memory.
>
> With the ahash API, the allocation is explicit.
>
This doesn't make any sense, though. First, the requests need to be enqueued
for the task, but crypto_ahash_finup() would only have the ability to enqueue it
in a queue associated with the tfm, which is shared by many tasks. So it can't
actually work unless the tfm maintained a separate queue for each task, which
would be really complex. Second, it adds a memory allocation per block which is
very undesirable. You claim that it's needed anyway, but actually it's not;
with my API there is only one initial hash state regardless of how high the
interleaving factor is. In fact, if multiple initial states were allowed,
multibuffer hashing would become much more complex because the underlying
algorithm would need to validate that these different states are synced up. My
proposal is much simpler and avoids all this unnecessary overhead.
Really the only reason to even consider ahash at all would be try to support
software hashing and off-CPU hardware accelerators using the "same" code.
However, your proposal would not achieve that either, as it would not use the
async callback. Note, as far as I know no one actually cares about off-CPU
hardware accelerator support in fsverity anyway...
- Eric
_______________________________________________
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:[~2024-06-04 18:42 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-03 18:37 [PATCH v4 0/8] Optimize dm-verity and fsverity using multibuffer hashing Eric Biggers
2024-06-03 18:37 ` [PATCH v4 1/8] crypto: shash - add support for finup_mb Eric Biggers
2024-06-04 18:55 ` Ard Biesheuvel
2024-06-04 19:25 ` Eric Biggers
2024-06-03 18:37 ` [PATCH v4 2/8] crypto: testmgr - generate power-of-2 lengths more often Eric Biggers
2024-06-03 18:37 ` [PATCH v4 3/8] crypto: testmgr - add tests for finup_mb Eric Biggers
2024-06-03 18:37 ` [PATCH v4 4/8] crypto: x86/sha256-ni - add support " Eric Biggers
2024-06-03 18:37 ` [PATCH v4 5/8] crypto: arm64/sha256-ce " Eric Biggers
2024-06-04 19:00 ` Ard Biesheuvel
2024-06-03 18:37 ` [PATCH v4 6/8] fsverity: improve performance by using multibuffer hashing Eric Biggers
2024-06-04 9:37 ` Herbert Xu
2024-06-04 18:42 ` Eric Biggers [this message]
2024-06-05 9:19 ` Herbert Xu
2024-06-05 9:22 ` Herbert Xu
2024-06-05 9:46 ` Herbert Xu
2024-06-05 19:14 ` Eric Biggers
2024-06-06 2:00 ` Herbert Xu
2024-06-06 5:28 ` Eric Biggers
2024-06-06 5:41 ` Herbert Xu
2024-06-06 6:58 ` Ard Biesheuvel
2024-06-06 7:34 ` Herbert Xu
2024-06-06 7:55 ` Ard Biesheuvel
2024-06-06 8:08 ` Herbert Xu
2024-06-06 8:33 ` Ard Biesheuvel
2024-06-06 9:15 ` Herbert Xu
2024-06-10 16:42 ` Eric Biggers
2024-06-11 15:21 ` Herbert Xu
2024-06-11 15:39 ` Herbert Xu
2024-06-11 20:32 ` Eric Biggers
2024-06-11 15:46 ` Ard Biesheuvel
2024-06-11 15:51 ` Herbert Xu
2024-06-11 20:18 ` Eric Biggers
2024-06-05 18:58 ` Eric Biggers
2024-06-03 18:37 ` [PATCH v4 7/8] dm-verity: hash blocks with shash import+finup when possible Eric Biggers
2024-06-03 18:37 ` [PATCH v4 8/8] dm-verity: improve performance by using multibuffer hashing Eric Biggers
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=20240604184220.GC1566@sol.localdomain \
--to=ebiggers@kernel.org \
--cc=ardb@kernel.org \
--cc=bvanassche@acm.org \
--cc=dm-devel@lists.linux.dev \
--cc=fsverity@lists.linux.dev \
--cc=herbert@gondor.apana.org.au \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-crypto@vger.kernel.org \
--cc=samitolvanen@google.com \
--cc=x86@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).