Re: dma_heap and protected memory

Amirreza Zarrabi via OP-TEE <[email protected]> Wed, 20 May 2026 17:10:47 +1000
Newsgroups org.trustedfirmware.lists.op-tee
Message-ID <[email protected]>
Hi Jens,

On 5/20/2026 1:29 AM, Jens Wiklander wrote:
> Hi Amir,
> 
> On Fri, May 15, 2026 at 5:10 AM Amirreza Zarrabi
> <[email protected]> wrote:
>>
>> Hi Jens,
>>
>> Recently protected heap support has been added for the TEE subsystem.
>> This allows dma-heaps to be managed by the TEE subsystem itself.
>>
>> For standard, non-protected heaps such as the system heap or CMA heap,
>> I am trying to understand the expected usage model. One possible workaround
>> appears to be to mmap the dma-buf fd in userspace, then register the
>> resulting userspace VA with the TEE subsystem to obtain a TEE shared-memory
>> object, for example:
>>
>> fd = dma_heap_alloc(...);
>> va = mmap(fd, ...);
>>
>> shm_fd = tee_shm_register(va, size);
>> tee_invoke(shm_fd);
>>
>> close(shm_fd);
>> munmap(va, size);
>> close(fd);
>>
>> This seems reasonable when the lifetime of the registered shared memory
>> is limited to a single invocation or callback. However, I am concerned about
>> cases (multiple exits in qcomtee) where the TEE side needs to retain access
>> to the memory after the ioctl/invocation returns.
>>
>> In that case, registering only the userspace VA does not appear
>> to keep the underlying dma-buf object alive. The TEE core pins the pages,
>> but it does not hold a dma-buf reference or attachment. If userspace later
>> closes the dma-buf fd and unmaps the VA, the dma-buf exporter may consider
>> the buffer released, while the TEE side may still have the memory registered.
> 
> That's surprising. Are the pages returned to the heap also? If so,
> there's an issue.
>

Yes, that is my understanding. For dma-heaps, after the final dma-buf
reference is released, the exporter is free to return the backing pages to
the heap.

>>
>> Is there a recommended way to use standard heaps, such as the system or
>> CMA dma-buf heaps, when the sharing lifetime is longer than a single TEE call?
> 
> No, I think you're pioneering this.
> 

;-).

>>
>> Would it make sense to extend tee_shm_register_fd() so that it can handle
>> dma-buf fds from regular dma-heaps as well, not only dma-bufs managed by
>> the TEE subsystem? That would allow the TEE core or backend driver to keep
>> the dma-buf reference for the lifetime of the TEE shared-memory object.
> 
> It seems like a workaround, since I assume that the purpose is to
> share memory between the user space process and the TEE. I think this
> might be a last resort or something.
> 

Yes, I agree.

The specific case I am looking at is qcomtee without an FF-A backend. In
that configuration, qcomtee currently requires physically contiguous shared
memory, so registering anonymous userspace memory is not very practical.

Today the qcomtee shared-memory pool is implemented on top of
tee_dyn_shm_alloc_helper(), which allocates memory from the normal page
allocator. This makes larger allocations subject to the usual high-order
allocation / MAX_ORDER limitations.

One option would be to move, or extend, the qcomtee shared-memory pool to use
a cma backed allocation path. That would address the default allocation case
through TEE_IOC_SHM_ALLOC (without restriction).

However, I am wondering whether it is better to also allow userspace to choose
the source of the memory, for example when the memory must come from a specific
carveout or from a cma dma-heap selected by the client.

If you feel it is not a correct direction, I totally understand considering
it is workaround for a limitation.

Thanks Jens.

Regards,
Amir

> Cheers,
> Jens