udmabuf: fix dma-buf cpu access
authorGurchetan Singh <gurchetansingh@chromium.org>
Tue, 17 Dec 2019 23:02:28 +0000 (15:02 -0800)
committerpopcornmix <popcornmix@gmail.com>
Wed, 1 Jul 2020 15:34:01 +0000 (16:34 +0100)
commit58a236427be1168204e00b8311c9e73a1078a235
tree7a8d700324f49e28c343ea1dbce5ed46c06fed83
parentb5f7a3871a97b24428d021727e7fc65217fab664
udmabuf: fix dma-buf cpu access

Commit 1ffe09590121fbb3786d6c860acdd200f7ab095c upstream.

I'm just going to put Chia's review comment here since it sums
the issue rather nicely:

"(1) Semantically, a dma-buf is in DMA domain.  CPU access from the
importer must be surrounded by {begin,end}_cpu_access.  This gives the
exporter a chance to move the buffer to the CPU domain temporarily.

(2) When the exporter itself has other means to do CPU access, it is
only reasonable for the exporter to move the buffer to the CPU domain
before access, and to the DMA domain after access.  The exporter can
potentially reuse {begin,end}_cpu_access for that purpose.

Because of (1), udmabuf does need to implement the
{begin,end}_cpu_access hooks.  But "begin" should mean
dma_sync_sg_for_cpu and "end" should mean dma_sync_sg_for_device.

Because of (2), if userspace wants to continuing accessing through the
memfd mapping, it should call udmabuf's {begin,end}_cpu_access to
avoid cache issues."

Reported-by: Chia-I Wu <olvaffe@gmail.com>
Suggested-by: Chia-I Wu <olvaffe@gmail.com>
Fixes: 284562e1f348 ("udmabuf: implement begin_cpu_access/end_cpu_access hooks")
Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20191217230228.453-1-gurchetansingh@chromium.org
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
drivers/dma-buf/udmabuf.c