On 8/15/25 4:41 AM, Christian König wrote:
On 14.08.25 18:10, Andrew Davis wrote:
Hello all,

This series makes it so the udmabuf will sync the backing buffer
with the set of attached devices as required for DMA-BUFs when
doing {begin,end}_cpu_access.

Yeah the reason why we didn't do that is that this doesn't even work 100% 
reliable in theory. So this patchset here might make your use case work but is 
a bit questionable in general.

udmabuf is about turning a file descriptor created by memfd_create() into a 
DMA-buf. Mapping that memory can happen through the memfd as well and so it is 
perfectly valid to skip the DMA-buf begin_access and end_access callbacks.


If someone maps the memory backed by the DMA-buf outside of the DMA-APIs then 
we cannot really
control that, but in this case if they do map with the DMA-API then it is *not* 
valid to skip
these begin_access and end_access callbacks. And that is the case I am 
addressing here.

Right now we are not syncing the mapping for any attached device, we just zap 
it from
the CPU caches using some hacky loopback and hope that is enough for the 
devices :/

Additional to that when CONFIG_DMABUF_DEBUG is enabled the DMA-buf code mangles 
the page addresses in the sg table to prevent importers from abusing it. That 
makes dma_sync_sgtable_for_cpu() and dma_sync_sgtable_for_device() on the 
exporter side crash.


I was not aware of this mangle_sg_table() hack, must have been added while I 
was not looking :)

Seems very broken TBH, taking a quick look, I see on this line[0] you call it, 
then
just a couple lines later you use that same mangled page_link to walk the SG 
table[1]..

If anyone enables DMA_API_DEBUG and tried to attach/map a non-contiguous 
DMA-BUF with
a chained sg I don't see how that doesn't crash out.

That's the reason why DMA-buf heaps uses a copy of the sg table for calling 
dma_sync_sgtable_for_cpu()/dma_sync_sgtable_for_device().


Could you point me to where Heaps uses a copy of the SG table? I see it using 
the
exact same SG table for dma_sync_sgtable_for_*() that we created when mapping 
the
device attachments.

Thanks,
Andrew

[0] 
https://github.com/torvalds/linux/blob/master/drivers/dma-buf/dma-buf.c#L1142
[1] 
https://github.com/torvalds/linux/blob/master/drivers/dma-buf/dma-buf.c#L1151

It's basically a hack and should be removed, but for this we need to change all 
clients which is tons of work.

Regards,
Christian.


Thanks
Andrew

Changes for v2:
  - fix attachment table use-after-free
  - rebased on v6.17-rc1

Andrew Davis (3):
   udmabuf: Keep track current device mappings
   udmabuf: Sync buffer mappings for attached devices
   udmabuf: Use module_misc_device() to register this device

  drivers/dma-buf/udmabuf.c | 133 +++++++++++++++++++-------------------
  1 file changed, 67 insertions(+), 66 deletions(-)



Reply via email to