On 15.08.25 21:40, Andrew Davis wrote:
> 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.

Good argument, but that needs quite some documentation then. udmabuf.c could 
use some general documentation anyway.

> 
> 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 :/

Yeah that is just pretty horrible.

> 
>> 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]..

sg_next() is skipping over the chain entries, only page entries are mangled, 
but I completely agree that this is as hackish as it can get.

We just had quite a number of harsh problems and even CVEs because importers 
didn't got that they absolutely shouldn't touch the underlying page of a 
mapping.

Allowing userspace to R/W to freed up memory or messing up the page count is 
not funny at all. 

> 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.

See dup_sg_table() in system_heap.c.

Apart from stopping using sg_table in DMA-buf at all what we could potentially 
do is to improve the mangling. E.g. just allocate a new sg_table, copy over all 
the DMA addresses and keep the page_link pointing to the original one.

Regards,
Christian.

> 
> 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