linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Catalin Marinas <catalin.marinas@arm.com>
To: Ard Biesheuvel <ardb@kernel.org>
Cc: Herbert Xu <herbert@gondor.apana.org.au>,
	Will Deacon <will@kernel.org>, Marc Zyngier <maz@kernel.org>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Linux Memory Management List <linux-mm@kvack.org>,
	Linux ARM <linux-arm-kernel@lists.infradead.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	"David S. Miller" <davem@davemloft.net>
Subject: Re: [PATCH 07/10] crypto: Use ARCH_DMA_MINALIGN instead of ARCH_KMALLOC_MINALIGN
Date: Wed, 13 Apr 2022 09:47:29 +0100	[thread overview]
Message-ID: <YlaOIbSA7B/G9222@arm.com> (raw)
In-Reply-To: <CAMj1kXGCR833rqKOetj8ykQ8XtDCWbszJYVtVKvLpDLWnM=B5w@mail.gmail.com>

On Wed, Apr 13, 2022 at 12:01:25AM +0200, Ard Biesheuvel wrote:
> On Tue, 12 Apr 2022 at 14:31, Catalin Marinas <catalin.marinas@arm.com> wrote:
> > On Tue, Apr 12, 2022 at 06:18:46PM +0800, Herbert Xu wrote:
> > > On Tue, Apr 12, 2022 at 11:02:54AM +0100, Catalin Marinas wrote:
> > > > This series does not penalise any architecture. It doesn't even make
> > > > arm64 any worse than it currently is.
> > >
> > > Right, the patch as it stands doesn't change anything.  However,
> > > it is also broken as it stands.  As I said before, CRYPTO_MINALIGN
> > > is not something that is guaranteed by the Crypto API, it is simply
> > > a statement of whatever kmalloc returns.
> >
> > I agree that CRYPTO_MINALIGN is not guaranteed by the Crypto API. What
> > I'm debating is the intended use for CRYPTO_MINALIGN in some (most?) of
> > the drivers. It's not just about kmalloc() but also a build-time offset
> > of buffers within structures to guarantee DMA safety. This can't be
> > fixed by cra_alignmask.
> >
> > We could leave CRYPTO_MINALIGN as ARCH_KMALLOC_MINALIGN and that matches
> > it being just a statement of the kmalloc() minimum alignment. But since
> > it is also overloaded with the DMA in-structure offset alignment, we'd
> > need a new CRYPTO_DMA_MINALIGN (and _ATTR) to annotate those structures.
> > I have a suspicion there'll be fewer of the original CRYPTO_MINALIGN
> > uses left, hence my approach to making this bigger from the start.
> >
> > There's also Ard's series introducing CRYPTO_REQ_MINALIGN while leaving
> > CRYPT_MINALIGN for DMA-safe offsets (IIUC):
> >
> > https://lore.kernel.org/r/20220406142715.2270256-1-ardb@kernel.org
> >
> > > So if kmalloc is no longer returning CRYPTO_MINALIGN-aligned
> > > memory, then those drivers that need this alignment for DMA
> > > will break anyway.
> 
> One thing to note here is that minimum DMA *alignment* is not the same
> as the padding to cache writeback granule (CWG) that is needed when
> dealing with non-cache coherent inbound DMA.
> 
> The former is typically a property of the peripheral IP, and is
> something that the driver needs to deal with, potentially by setting
> cra_alignmask to ensure that the input and output buffers are placed
> such that they can accessed via DMA by the peripheral.

Good point, thanks for making this clear. AFAICT, the requirement for
bus master access in the crypto code doesn't go above 16 (a
cra_alignmask of 15).

> The latter is a property of the CPU's cache hierarchy, not only the
> size of the CWG, but also whether or not DMA is cache coherent to
> begin with. This is not something the driver should usually have to
> care about if it uses the DMA API correctly.

I agree. There is also an implicit expectation that the DMA API works on
kmalloc'ed buffers and that's what ARCH_DMA_MINALIGN is for (and the
dynamic arch_kmalloc_minalign() in this series). But the key point is
that the driver doesn't need to know the CPU cache topology, coherency,
the DMA API and kmalloc() take care of these.

> The reason why CRYPTO_MINALIGN matters for DMA in spite of this is
> that some drivers not only use DMA for processing the bulk of the data
> (typically presented using scatterlists) but sometimes also use DMA to
> map parts of the request and TFM structures, which carry control data
> used by the CPU to manage the crypto requests. Doing a non-coherent
> DMA write into such a structure may blow away 64 or 128 bytes of data,
> even if the write itself is much smaller, due to the fact that we need
> to perform cache invalidation in order for the CPU to be able to
> observe what the device wrote to that memory, and the invalidated
> cache lines may be shared with other data items, and may become dirty
> while the DMA mapping is active.

Indeed.

> This is what I am addressing with my patch series, i.e., padding out
> the driver owned parts of the struct to the CWG size so that cache
> invalidation does not affect data owned by other layers in the crypto
> cake, but only at runtime. By doing this consistently for TFM and
> request structures, we should be able to disregard ARCH_DMA_MINALIGN
> entirely when it comes to defining CRYPTO_MINALIGN, as it is highly
> unlikely that any of these peripherals would require more than 8 or 16
> bytes of alignment for the DMA operations themselves.

Your series would be a nice improvement and eventually get
CRYPTO_MINALIGN to ARCH_SLAB_MINALIGN. In the meantime, with my series,
we need CRYPTO_MINALIGN to be ARCH_DMA_MINALIGN on arm64, unless we add
a new CRYPT_DMA_MINALIGN but I don't see much point, especially if you
plan to reduce this alignment anyway.


Let's go back to restating the crypto code alignment requirements, as I
understand them (please correct):

1. Bus master accesses (DMA, CPUs that can't do efficient unaligned
   accesses). That's what cra_alignmask is for. If there's a driver that
   relies on an implicit kmalloc() alignment higher than cra_alignmask,
   it is already broken on x86 and a few other architectures that don't
   define ARCH_DMA_MINALIGN. But it won't be any worse with this series
   since it only brings the arm64 kmalloc() alignment down from 128 to
   64.

2. Non-coherent DMA and cache invalidation. With my series, kmalloc'ed
   buffers are DMA-safe for the CPU/SoC the kernel is running on.

3. DMA into buffers embedded in TFM structures. Since the offset of
   those buffers is decided at compile-time, we need a
   CRYPTO_MINALIGN_ATTR that covers both bus master alignment
   requirements and the highest cache line size (CWG) for a non-coherent
   DMA SoC. Ard's series would simplify the latter but, before then,
   CRYPTO_MINALIGN needs to stay as the larger ARCH_DMA_MINALIGN.

With my series, there is no change to the value of CRYPTO_MINALIGN for
arm64 or any other architecture, so point 3 is unaffected. The series
does change the kmalloc() alignment and that may be smaller than
CRYPTO_MINALIGN but neither of points 1 or 2 above are affected since
(a) we still have a sufficiently large ARCH_KMALLOC_MINALIGN of 64 and
(b) the kmalloc'ed buffers are safe for non-coherent DMA.

Herbert, Ard, if I missed anything please let me know but based on my
understanding, this series is safe for the crypto code.

Thanks.

-- 
Catalin

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2022-04-13  8:48 UTC|newest]

Thread overview: 140+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-05 13:57 [PATCH 00/10] mm, arm64: Reduce ARCH_KMALLOC_MINALIGN below the cache line size Catalin Marinas
2022-04-05 13:57 ` [PATCH 01/10] mm/slab: Decouple ARCH_KMALLOC_MINALIGN from ARCH_DMA_MINALIGN Catalin Marinas
2022-04-05 23:59   ` Hyeonggon Yoo
2022-04-06  7:29     ` Arnd Bergmann
2022-04-06 12:09       ` Hyeonggon Yoo
2022-04-06  8:53     ` Catalin Marinas
2022-04-08  6:42   ` Hyeonggon Yoo
2022-04-08  9:06     ` Hyeonggon Yoo
2022-04-08  9:11     ` Catalin Marinas
2022-04-11 10:37   ` Hyeonggon Yoo
2022-04-11 14:02     ` Catalin Marinas
2022-04-05 13:57 ` [PATCH 02/10] drivers/base: Use ARCH_DMA_MINALIGN instead of ARCH_KMALLOC_MINALIGN Catalin Marinas
2022-04-11 14:57   ` Andy Shevchenko
2022-04-11 17:39     ` Catalin Marinas
2022-04-05 13:57 ` [PATCH 03/10] drivers/gpu: " Catalin Marinas
2022-04-05 13:57 ` [PATCH 04/10] drivers/md: " Catalin Marinas
2022-04-05 13:57 ` [PATCH 05/10] drivers/spi: " Catalin Marinas
2022-04-05 14:05   ` Mark Brown
2022-04-05 13:57 ` [PATCH 06/10] drivers/usb: " Catalin Marinas
2022-04-05 13:57 ` [PATCH 07/10] crypto: " Catalin Marinas
2022-04-05 22:57   ` Herbert Xu
2022-04-06  6:53     ` Ard Biesheuvel
2022-04-06  8:49       ` Catalin Marinas
2022-04-06  9:41         ` Ard Biesheuvel
2022-04-07  4:30         ` Herbert Xu
2022-04-07 11:01           ` Catalin Marinas
2022-04-07 11:40             ` Herbert Xu
2022-04-07 16:28               ` Catalin Marinas
2022-04-08  3:25                 ` Herbert Xu
2022-04-08  9:04                   ` Catalin Marinas
2022-04-08  9:11                     ` Herbert Xu
2022-04-12  9:32                       ` Catalin Marinas
2022-04-12  9:40                         ` Herbert Xu
2022-04-12 10:02                           ` Catalin Marinas
2022-04-12 10:18                             ` Herbert Xu
2022-04-12 12:31                               ` Catalin Marinas
2022-04-12 22:01                                 ` Ard Biesheuvel
2022-04-13  8:47                                   ` Catalin Marinas [this message]
2022-04-13 19:53                                     ` Linus Torvalds
2022-04-14  5:38                                       ` Greg Kroah-Hartman
2022-04-14 13:52                                         ` Ard Biesheuvel
2022-04-14 14:27                                           ` Greg Kroah-Hartman
2022-04-14 14:36                                             ` Ard Biesheuvel
2022-04-14 14:52                                               ` Greg Kroah-Hartman
2022-04-14 15:01                                                 ` Ard Biesheuvel
2022-04-14 15:10                                                   ` Ard Biesheuvel
2022-04-14 19:49                                       ` Catalin Marinas
2022-04-14 22:25                                         ` Linus Torvalds
2022-04-15  6:03                                           ` Ard Biesheuvel
2022-04-15 11:09                                           ` Arnd Bergmann
2022-04-16  9:42                                           ` Catalin Marinas
2022-04-20 19:07                                           ` Catalin Marinas
2022-04-20 19:33                                             ` Linus Torvalds
2022-04-14 14:30                                     ` Ard Biesheuvel
2022-04-15  6:51                                     ` Herbert Xu
2022-04-15  7:49                                       ` Ard Biesheuvel
2022-04-15  7:51                                         ` Herbert Xu
2022-04-15  8:05                                           ` Ard Biesheuvel
2022-04-15  8:12                                             ` Herbert Xu
2022-04-15  9:51                                               ` Ard Biesheuvel
2022-04-15 10:04                                                 ` Ard Biesheuvel
2022-04-15 10:12                                                 ` Herbert Xu
2022-04-15 10:22                                                   ` Ard Biesheuvel
2022-04-15 10:45                                                     ` Herbert Xu
2022-04-15 11:38                                                       ` Ard Biesheuvel
2022-04-17  8:08                                                         ` Herbert Xu
2022-04-17  8:31                                                           ` Catalin Marinas
2022-04-17  8:35                                                             ` Herbert Xu
2022-04-17  8:50                                                               ` Catalin Marinas
2022-04-17  8:58                                                                 ` Herbert Xu
2022-04-17 16:30                                                                   ` Catalin Marinas
2022-04-18  8:37                                                                     ` Herbert Xu
2022-04-18  9:19                                                                       ` Catalin Marinas
2022-04-18 16:44                                                                       ` Catalin Marinas
2022-04-19 21:50                                                                         ` Ard Biesheuvel
2022-04-20 10:36                                                                           ` Catalin Marinas
2022-04-20 11:29                                                                           ` Arnd Bergmann
2022-04-21  7:20                                                                             ` Christoph Hellwig
2022-04-21  7:36                                                                               ` Arnd Bergmann
2022-04-21  7:44                                                                                 ` Christoph Hellwig
2022-04-21  8:05                                                                               ` Ard Biesheuvel
2022-04-21 11:06                                                                               ` Catalin Marinas
2022-04-21 12:28                                                                                 ` Arnd Bergmann
2022-04-21 13:25                                                                                   ` Catalin Marinas
2022-04-21 13:47                                                                                     ` Arnd Bergmann
2022-04-21 14:44                                                                                       ` Catalin Marinas
2022-04-21 14:47                                                                                         ` Arnd Bergmann
2022-05-10 11:03                                                                       ` [RFC PATCH 0/7] crypto: Add helpers for allocating with DMA alignment Herbert Xu
2022-05-10 11:07                                                                         ` [RFC PATCH 1/7] crypto: Prepare to move crypto_tfm_ctx Herbert Xu
2022-05-10 11:07                                                                         ` [RFC PATCH 2/7] crypto: api - Add crypto_tfm_ctx_dma Herbert Xu
2022-05-10 17:10                                                                           ` Catalin Marinas
2022-05-12  3:57                                                                             ` Herbert Xu
2022-05-10 11:07                                                                         ` [RFC PATCH 3/7] crypto: aead - Add ctx helpers with DMA alignment Herbert Xu
2022-05-10 11:07                                                                         ` [RFC PATCH 4/7] crypto: hash " Herbert Xu
2022-05-10 11:07                                                                         ` [RFC PATCH 5/7] crypto: skcipher " Herbert Xu
2022-05-10 11:07                                                                         ` [RFC PATCH 6/7] crypto: api - Increase MAX_ALGAPI_ALIGNMASK to 127 Herbert Xu
2022-05-10 11:07                                                                         ` [RFC PATCH 7/7] crypto: caam - Explicitly request DMA alignment Herbert Xu
2022-04-15 12:18                                             ` [PATCH 07/10] crypto: Use ARCH_DMA_MINALIGN instead of ARCH_KMALLOC_MINALIGN Catalin Marinas
2022-04-15 12:25                                               ` Ard Biesheuvel
2022-04-15  9:51                                           ` Catalin Marinas
2022-04-15 12:31                                             ` Catalin Marinas
2022-04-17  8:11                                               ` Herbert Xu
2022-04-17  8:38                                                 ` Catalin Marinas
2022-04-17  8:43                                                   ` Herbert Xu
2022-04-17 16:29                                                     ` Catalin Marinas
2022-07-15 22:23                                                       ` Isaac Manjarres
2022-07-16  3:25                                                         ` Herbert Xu
2022-07-18 17:53                                                           ` Catalin Marinas
2022-09-21  0:47                                                             ` Isaac Manjarres
2022-09-30 18:32                                                               ` Catalin Marinas
2022-09-30 19:35                                                                 ` Linus Torvalds
2022-10-01 22:29                                                                   ` Catalin Marinas
2022-10-02 17:00                                                                     ` Linus Torvalds
2022-10-02 22:08                                                                       ` Ard Biesheuvel
2022-10-02 22:24                                                                         ` Linus Torvalds
2022-10-03 17:39                                                                           ` Catalin Marinas
2022-10-12 17:45                                                                 ` Isaac Manjarres
2022-10-13 16:57                                                                   ` Catalin Marinas
2022-10-13 18:58                                                                     ` Saravana Kannan
2022-10-14 16:25                                                                       ` Catalin Marinas
2022-10-14 20:23                                                                         ` Saravana Kannan
2022-10-14 20:44                                                                           ` Linus Torvalds
2022-10-16 21:37                                                                             ` Catalin Marinas
2022-04-12 10:20                             ` Catalin Marinas
2022-04-07  6:14   ` Muchun Song
2022-04-07  9:25     ` Catalin Marinas
2022-04-07 10:00       ` Muchun Song
2022-04-07 11:06         ` Catalin Marinas
2022-04-05 13:57 ` [PATCH 08/10] mm/slab: Allow dynamic kmalloc() minimum alignment Catalin Marinas
2022-04-07  3:46   ` Hyeonggon Yoo
2022-04-07  8:50     ` Catalin Marinas
2022-04-07  9:18       ` Hyeonggon Yoo
2022-04-07  9:35         ` Catalin Marinas
2022-04-07 12:26           ` Hyeonggon Yoo
2022-04-11 11:55   ` Hyeonggon Yoo
2022-04-05 13:57 ` [PATCH 09/10] mm/slab: Simplify create_kmalloc_cache() args and make it static Catalin Marinas
2022-04-05 13:57 ` [PATCH 10/10] arm64: Enable dynamic kmalloc() minimum alignment Catalin Marinas
2022-04-07 14:40 ` [PATCH 00/10] mm, arm64: Reduce ARCH_KMALLOC_MINALIGN below the cache line size Vlastimil Babka
2022-04-07 17:48   ` Catalin Marinas
2022-04-08 14:37     ` Vlastimil Babka

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=YlaOIbSA7B/G9222@arm.com \
    --to=catalin.marinas@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=ardb@kernel.org \
    --cc=arnd@arndb.de \
    --cc=davem@davemloft.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=maz@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --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).