AMD-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Russell King - ARM Linux <linux@armlinux.org.uk>
To: Daniel Vetter <daniel@ffwll.ch>
Cc: "Christoph Hellwig" <hch@infradead.org>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
	"amd-gfx list" <amd-gfx@lists.freedesktop.org>,
	"moderated list:DMA BUFFER SHARING FRAMEWORK"
	<linaro-mm-sig@lists.linaro.org>,
	"Jerome Glisse" <jglisse@redhat.com>,
	iommu@lists.linux-foundation.org,
	dri-devel <dri-devel@lists.freedesktop.org>,
	"Dan Williams" <dan.j.williams@intel.com>,
	"Thierry Reding" <treding@nvidia.com>,
	"Logan Gunthorpe" <logang@deltatee.com>,
	"Christian König" <christian.koenig@amd.com>,
	"Linux ARM" <linux-arm-kernel@lists.infradead.org>,
	"open list:DMA BUFFER SHARING FRAMEWORK"
	<linux-media@vger.kernel.org>
Subject: Re: noveau vs arm dma ops
Date: Thu, 26 Apr 2018 00:26:46 +0100	[thread overview]
Message-ID: <20180425232646.GR16141@n2100.armlinux.org.uk> (raw)
In-Reply-To: <CAKMK7uH14qupTYDa1pr8UC434Vs+97eUXj+fYi=+2uijCLayMA@mail.gmail.com>

On Wed, Apr 25, 2018 at 11:35:13PM +0200, Daniel Vetter wrote:
> On arm that doesn't work. The iommu api seems like a good fit, except
> the dma-api tends to get in the way a bit (drm/msm apparently has
> similar problems like tegra), and if you need contiguous memory
> dma_alloc_coherent is the only way to get at contiguous memory. There
> was a huge discussion years ago about that, and direct cma access was
> shot down because it would have exposed too much of the caching
> attribute mangling required (most arm platforms need wc-pages to not
> be in the kernel's linear map apparently).

I think you completely misunderstand ARM from what you've written above,
and this worries me greatly about giving DRM the level of control that
is being asked for.

Modern ARMs have a PIPT cache or a non-aliasing VIPT cache, and cache
attributes are stored in the page tables.  These caches are inherently
non-aliasing when there are multiple mappings (which is a great step
forward compared to the previous aliasing caches.)

As the cache attributes are stored in the page tables, this in theory
allows different virtual mappings of the same physical memory to have
different cache attributes.  However, there's a problem, and that's
called speculative prefetching.

Let's say you have one mapping which is cacheable, and another that is
marked as write combining.  If a cache line is speculatively prefetched
through the cacheable mapping of this memory, and then you read the
same physical location through the write combining mapping, it is
possible that you could read cached data.

So, it is generally accepted that all mappings of any particular
physical bit of memory should have the same cache attributes to avoid
unpredictable behaviour.

This presents a problem with what is generally called "lowmem" where
the memory is mapped in kernel virtual space with cacheable
attributes.  It can also happen with highmem if the memory is
kmapped.

This is why, on ARM, you can't use something like get_free_pages() to
grab some pages from the system, pass it to the GPU, map it into
userspace as write-combining, etc.  It _might_ work for some CPUs,
but ARM CPUs vary in how much prefetching they do, and what may work
for one particular CPU is in no way guaranteed to work for another
ARM CPU.

The official line from architecture folk is to assume that the caches
infinitely speculate, are of infinite size, and can writeback *dirty*
data at any moment.

The way to stop things like speculative prefetches to particular
physical memory is to, quite "simply", not have any cacheable
mappings of that physical memory anywhere in the system.

Now, cache flushes on ARM tend to be fairly expensive for GPU buffers.
If you have, say, an 8MB buffer (for a 1080p frame) and you need to
do a cache operation on that buffer, you'll be iterating over it
32 or maybe 64 bytes at a time "just in case" there's a cache line
present.  Referring to my previous email, where I detailed the
potential need for _two_ flushes, one before the GPU operation and
one after, and this becomes _really_ expensive.  At that point, you're
probably way better off using write-combine memory where you don't
need to spend CPU cycles performing cache flushing - potentially
across all CPUs in the system if cache operations aren't broadcasted.

This isn't a simple matter of "just provide some APIs for cache
operations" - there's much more that needs to be understood by
all parties here, especially when we have GPU drivers that can be
used with quite different CPUs.

It may well be that for some combinations of CPUs and workloads, it's
better to use write-combine memory without cache flushing, but for
other CPUs that tradeoff (for the same workload) could well be
different.

Older ARMs get more interesting, because they have aliasing caches.
That means the CPU cache aliases across different virtual space
mappings in some way, which complicates (a) the mapping of memory
and (b) handling the cache operations on it.

It's too late for me to go into that tonight, and I probably won't
be reading mail for the next week and a half, sorry.

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line in suburbia: sync at 8.8Mbps down 630kbps up
According to speedtest.net: 8.21Mbps down 510kbps up

  reply	other threads:[~2018-04-25 23:26 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-25 10:59 [PATCH 1/8] lib/scatterlist: add sg_set_dma_addr() helper Christian König
2018-03-25 10:59 ` [PATCH 4/8] dma-buf: add peer2peer flag Christian König
     [not found]   ` <20180325110000.2238-4-christian.koenig-5C7GfCeVMHo@public.gmane.org>
2018-03-29  6:57     ` Daniel Vetter
     [not found]       ` <20180329065753.GD3881-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2018-03-29 11:34         ` Christian König
     [not found]           ` <8b823458-8bdc-3217-572b-509a28aae742-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-04-03  9:09             ` Daniel Vetter
     [not found]               ` <20180403090909.GN3881-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2018-04-03 17:06                 ` Jerome Glisse
     [not found]                   ` <20180403170645.GB5935-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2018-04-03 18:08                     ` Daniel Vetter
2018-04-16 12:39                       ` Christoph Hellwig
     [not found]                         ` <20180416123937.GA9073-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2018-04-16 13:38                           ` Daniel Vetter
2018-04-19  8:16                             ` Christoph Hellwig
     [not found]                               ` <20180419081657.GA16735-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2018-04-20  7:13                                 ` Daniel Vetter
     [not found]                                   ` <20180420071312.GF31310-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2018-04-20  8:58                                     ` Christian König
2018-04-20 10:17                                       ` Christoph Hellwig
     [not found]                                         ` <20180420101755.GA11400-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2018-04-20 10:44                                           ` Christian König
2018-04-20 12:46                                             ` Christoph Hellwig
2018-04-20 15:21                                               ` [Linaro-mm-sig] " Daniel Vetter
2018-04-24 18:48                                                 ` Christoph Hellwig
2018-04-24 19:32                                                   ` Daniel Vetter
2018-04-25  5:48                                                     ` Christoph Hellwig
     [not found]                                                       ` <20180425054855.GA17038-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2018-04-25  6:10                                                         ` Alex Deucher
2018-04-25  6:13                                                       ` Daniel Vetter
2018-04-25  6:23                                                         ` Daniel Vetter
2018-04-25  6:43                                                           ` Christoph Hellwig
     [not found]                                                             ` <20180425064335.GB28100-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2018-04-25  7:02                                                               ` Daniel Vetter
2018-04-25  7:09                                                                 ` Christoph Hellwig
     [not found]                                                                   ` <20180425070905.GA24827-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2018-04-25  7:30                                                                     ` Daniel Vetter
2018-04-25  7:56                                                                       ` Thierry Reding
2018-04-25  8:55                                                                         ` Christoph Hellwig
2018-04-25  7:43                                                                   ` Thierry Reding
2018-04-25  7:41                                                             ` Thierry Reding
2018-04-25  8:54                                                               ` noveau vs arm dma ops Christoph Hellwig
2018-04-25  9:25                                                                 ` Russell King - ARM Linux
2018-04-25 10:04                                                                 ` Daniel Vetter
2018-04-25 15:33                                                                   ` Christoph Hellwig
     [not found]                                                                     ` <20180425153312.GD27076-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2018-04-25 21:35                                                                       ` Daniel Vetter
2018-04-25 23:26                                                                         ` Russell King - ARM Linux [this message]
     [not found]                                                                           ` <20180425232646.GR16141-l+eeeJia6m9URfEZ8mYm6t73F7V6hmMc@public.gmane.org>
2018-04-26  9:17                                                                             ` Daniel Vetter
2018-04-26  9:09                                                                         ` Christoph Hellwig
     [not found]                                                                           ` <20180426090942.GA18811-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2018-04-26  9:45                                                                             ` Daniel Vetter
2018-04-26 11:12                                                                           ` Russell King - ARM Linux
2018-04-25 22:54                                                                     ` Russell King - ARM Linux
2018-04-26  9:13                                                                       ` Christoph Hellwig
2018-04-26  9:20                                                                       ` [Linaro-mm-sig] " Daniel Vetter
     [not found]                                                                         ` <CAKMK7uG9R6paoP4BmvqDVUP_4Db4Dz8MSXeLwUBMYaORa5-kVw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-04-26  9:24                                                                           ` Christoph Hellwig
2018-04-26  9:39                                                                             ` Daniel Vetter
     [not found]                                                         ` <CAKMK7uEFitkNQrD6cLX5Txe11XhVO=LC4YKJXH=VNdq+CY=DjQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-04-25  6:24                                                           ` [Linaro-mm-sig] [PATCH 4/8] dma-buf: add peer2peer flag Alex Deucher
2018-04-25  6:41                                                             ` Christoph Hellwig
     [not found]                                                               ` <20180425064118.GA28100-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2018-04-25 17:44                                                                 ` Alex Deucher
2018-04-25 18:38                                                                   ` Dan Williams
2018-05-04 12:45                                                                   ` Lucas Stach
     [not found] ` <20180325110000.2238-1-christian.koenig-5C7GfCeVMHo@public.gmane.org>
2018-03-25 10:59   ` [PATCH 2/8] PCI: Add pci_find_common_upstream_dev() Christian König
2018-03-28 12:38     ` Christoph Hellwig
     [not found]       ` <20180328123830.GB25060-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2018-03-28 15:07         ` Christian König
2018-03-28 15:47           ` Logan Gunthorpe
2018-03-28 16:02             ` Christian König
2018-03-28 16:25               ` Logan Gunthorpe
     [not found]                 ` <16c7bef8-5f03-9e89-1f50-b62fb139a36f-OTvnGxWRz7hWk0Htik3J/w@public.gmane.org>
2018-03-28 18:28                   ` Christian König
2018-03-28 18:57                     ` Logan Gunthorpe
     [not found]                       ` <e751cd28-f115-569f-5248-d24f30dee3cb-OTvnGxWRz7hWk0Htik3J/w@public.gmane.org>
2018-03-28 19:44                         ` Christian König
2018-03-28 19:53                           ` Logan Gunthorpe
2018-03-29 11:44                             ` Christian König
2018-03-29 15:45                               ` Logan Gunthorpe
     [not found]                                 ` <98ce6cfd-bcf3-811e-a0f1-757b60da467a-OTvnGxWRz7hWk0Htik3J/w@public.gmane.org>
2018-03-29 16:10                                   ` Christian König
2018-03-29 16:25                                     ` Logan Gunthorpe
2018-03-29 18:15                                       ` Christian König
2018-03-30  1:58                                       ` Jerome Glisse
2018-03-30  6:33                                         ` Christoph Hellwig
2018-03-30 15:25                                           ` Jerome Glisse
2018-03-30 18:46                                         ` Logan Gunthorpe
2018-03-30 19:45                                           ` Jerome Glisse
2018-04-02 17:02                                             ` Logan Gunthorpe
2018-04-02 17:20                                               ` Jerome Glisse
2018-04-02 17:37                                                 ` Logan Gunthorpe
2018-04-02 19:16                                                   ` Jerome Glisse
2018-04-02 19:32                                                     ` Logan Gunthorpe
2018-04-02 19:45                                                       ` Jerome Glisse
     [not found]                             ` <CADnq5_P-z=Noos_jaME9_CERri3C-m2hPPvx2bArr36O=1FnrA@mail.gmail.com>
2018-03-29 14:37                               ` Alex Deucher
2018-03-25 10:59   ` [PATCH 3/8] PCI: Add pci_peer_traffic_supported() Christian König
2018-03-25 10:59   ` [PATCH 5/8] drm/amdgpu: print DMA-buf status in debugfs Christian König
2018-03-25 10:59   ` [PATCH 6/8] drm/amdgpu: note that we can handle peer2peer DMA-buf Christian König
2018-03-25 10:59   ` [PATCH 7/8] drm/amdgpu: add amdgpu_gem_attach Christian König
2018-03-25 11:00   ` [PATCH 8/8] drm/amdgpu: add support for exporting VRAM using DMA-buf Christian König
2018-03-28 12:37 ` [PATCH 1/8] lib/scatterlist: add sg_set_dma_addr() helper Christoph Hellwig

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=20180425232646.GR16141@n2100.armlinux.org.uk \
    --to=linux@armlinux.org.uk \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=christian.koenig@amd.com \
    --cc=dan.j.williams@intel.com \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hch@infradead.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=jglisse@redhat.com \
    --cc=linaro-mm-sig@lists.linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=logang@deltatee.com \
    --cc=treding@nvidia.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox