dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Lucas Stach <l.stach@pengutronix.de>
To: "Christian König" <christian.koenig@amd.com>,
	"Pekka Paalanen" <ppaalanen@gmail.com>
Cc: "Sharma, Shashank" <Shashank.Sharma@amd.com>,
	lkml <linux-kernel@vger.kernel.org>,
	dri-devel <dri-devel@lists.freedesktop.org>,
	Nicolas Dufresne <nicolas@ndufresne.ca>,
	linaro-mm-sig@lists.linaro.org,
	Sumit Semwal <sumit.semwal@linaro.org>,
	linux-media <linux-media@vger.kernel.org>
Subject: Re: DMA-buf and uncached system memory
Date: Thu, 23 Jun 2022 10:58:26 +0200	[thread overview]
Message-ID: <fbb228cd78e9bebd7e7921c19e0c4c09d0891f23.camel@pengutronix.de> (raw)
In-Reply-To: <adc626ec-ff5a-5c06-44ce-09111be450cd@amd.com>

Am Donnerstag, dem 23.06.2022 um 10:14 +0200 schrieb Christian König:
> Am 23.06.22 um 10:04 schrieb Lucas Stach:
> > Am Donnerstag, dem 23.06.2022 um 09:26 +0200 schrieb Christian König:
> > > Am 23.06.22 um 09:13 schrieb Pekka Paalanen:
> > > > On Thu, 23 Jun 2022 08:59:41 +0200
> > > > Christian König <christian.koenig@amd.com> wrote:
> > > > 
> > > > > The exporter isn't doing anything wrong here. DMA-buf are supposed to be
> > > > > CPU cached and can also be cache hot.
> > > > Hi,
> > > > 
> > > > what is that statement based on?
> > > On the design documentation of DMA-buf and the actual driver
> > > implementations.
> > > 
> > > Coherency and snooping of the CPU cache is mandatory for devices and
> > > root complexes in the PCI specification. Incoherent access is just an
> > > extension.
> > > 
> > > We inherited that by basing DMA-buf on the Linux kernel DMA-API which in
> > > turn is largely based on the PCI specification.
> > > 
> > > > Were the (mandatory for CPU access) cpu_access_begin/end functions &
> > > > ioctls not supposed to ensure that CPU cache is up-to-date / CPU cache
> > > > is fully flushed out?
> > > No, those functions are to inform the exporter that the importer has
> > > started and finished accessing the buffer using the CPU.
> > > 
> > > There is no signaling in the other direction. In other words the
> > > exporter doesn't inform the importer about CPU accesses because it is
> > > the owner of the buffer.
> > > 
> > > It's the responsibility of the importer to make sure that it can
> > > actually access the data in the buffer. If it can't guarantee that the
> > > importer shouldn't import the buffer in the first place.
> > This is not really correct. DMA-buf inherited the the map/unmap part
> > from the DMA API, which on cache coherent architecture is mostly a no-
> > op or ties into the IOMMU implementation to set up the pagetables for
> > the translation. On non cache coherent architectures this is the point
> > where any any necessary cache maintenance happens. DRM breaks this
> > model by caching the DMA-buf mapping for performance reasons.
> 
> That's not only because of performance reasons, but also because of 
> correctness.
> 
> At least the Vulkan API and a bunch of OpenGL extensions make it 
> mandatory for the buffer to be cache coherent. The kernel is simply not 
> informed about domain transfers.
> 
> For example you can just do a CPU copy to a ring buffer and the 
> expectation is that an already running shader sees that.

Yes, that one is not really an issue as you know that at buffer
creation time and can make sure to map those buffers uncached on non
coherent arches. If there are no explicit domain transfer points non
coherent must bite the bullet and bypass the CPU caches, running
performance into the ground.

> 
> > In the DMA API keeping things mapped is also a valid use-case, but then
> > you need to do explicit domain transfers via the dma_sync_* family,
> > which DMA-buf has not inherited. Again those sync are no-ops on cache
> > coherent architectures, but do any necessary cache maintenance on non
> > coherent arches.
> 
> Correct, yes. Coherency is mandatory for DMA-buf, you can't use 
> dma_sync_* on it when you are the importer.
> 
> The exporter could of course make use of that because he is the owner of 
> the buffer.

In the example given here with UVC video, you don't know that the
buffer will be exported and needs to be coherent without
synchronization points, due to the mapping cache at the DRM side. So
V4L2 naturally allocates the buffers from CPU cached memory. If the
expectation is that those buffers are device coherent without relying
on the map/unmap_attachment calls, then V4L2 needs to always
synchronize caches on DQBUF when the  buffer is allocated from CPU
cached memory and a single DMA-buf attachment exists. And while writing
this I realize that this is probably exactly what V4L2 should do...

Regards,
Lucas


  reply	other threads:[~2022-06-23  8:58 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-15  8:58 DMA-buf and uncached system memory Christian König
2021-02-15  9:06 ` Simon Ser
2021-02-15  9:34   ` Christian König
2021-02-15 11:53     ` Lucas Stach
2021-02-15 12:04       ` Christian König
2021-02-15 12:16         ` Lucas Stach
2021-02-15 12:25           ` Christian König
2021-02-15 14:41         ` David Laight
2021-02-15 14:54           ` [Linaro-mm-sig] " Christian König
2021-02-15  9:49 ` Thomas Zimmermann
2021-02-15 12:00   ` Thomas Zimmermann
2021-02-15 12:10     ` Christian König
2021-02-15 20:46       ` Nicolas Dufresne
2021-02-15 20:39 ` Nicolas Dufresne
2022-06-21 10:17   ` Andy.Hsieh
2022-06-21 10:34     ` Christian König
2022-06-21 15:42       ` Nicolas Dufresne
2022-06-22  9:05         ` [Linaro-mm-sig] " Christian König
2021-02-16  9:25 ` Daniel Vetter
2022-06-22 19:39   ` Nicolas Dufresne
2022-06-22 23:34     ` Daniel Stone
2022-06-23  6:59       ` Christian König
2022-06-23  7:13         ` Pekka Paalanen
2022-06-23  7:26           ` Christian König
2022-06-23  8:04             ` Lucas Stach
2022-06-23  8:14               ` Christian König
2022-06-23  8:58                 ` Lucas Stach [this message]
2022-06-23  9:09                   ` Christian König
2022-06-23  9:33                     ` Lucas Stach
2022-06-23  9:46                       ` Christian König
2022-06-23 10:13                         ` Lucas Stach
2022-06-23 11:10                           ` Christian König
2022-06-23 11:27                             ` Daniel Stone
2022-06-23 11:32                               ` Christian König
2022-06-24 22:02                                 ` [Linaro-mm-sig] " Daniel Vetter
2022-07-04 13:48                                   ` Christian König
2022-08-09 14:46                                     ` Daniel Vetter
2022-08-10  5:55                                       ` Christian König
2022-06-23 11:29                             ` Lucas Stach
2022-06-23 11:54                               ` Christian König
2022-06-23 12:14                                 ` Lucas Stach
2022-06-23 12:52                                   ` Christian König
2022-06-23 15:26                                     ` Lucas Stach
2022-06-24  6:54                                       ` Christian König
2022-06-24  8:10                                         ` Lucas Stach
2022-06-27 13:54                       ` Nicolas Dufresne
2022-06-27 14:06                         ` Lucas Stach
2022-06-27 14:30                           ` Nicolas Dufresne
2022-06-27 13:51                   ` Nicolas Dufresne
2022-06-23  8:13 ` Thomas Zimmermann
2022-06-23  8:26   ` Christian König
2022-06-23  8:42     ` Thomas Zimmermann
2022-08-09 15:01 ` Rob Clark

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=fbb228cd78e9bebd7e7921c19e0c4c09d0891f23.camel@pengutronix.de \
    --to=l.stach@pengutronix.de \
    --cc=Shashank.Sharma@amd.com \
    --cc=christian.koenig@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linaro-mm-sig@lists.linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=nicolas@ndufresne.ca \
    --cc=ppaalanen@gmail.com \
    --cc=sumit.semwal@linaro.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