It is possible through flink or IOCTLs like MODE_GETFB2 to create multiple handles for the same underlying GEM object.
But in prime we explicitely don't want to have multiple handles for the same DMA-buf. So just ignore it if a DMA-buf is exported with another handle. This was made obvious by removing the extra check in drm_gem_prime_handle_to_dmabuf() to not add the handle if we could already find it in the housekeeping structures. Signed-off-by: Christian König <[email protected]> --- drivers/gpu/drm/drm_prime.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index 1d93b44c00c4..f5f30d947b61 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c @@ -113,6 +113,17 @@ static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv, rb = *p; pos = rb_entry(rb, struct drm_prime_member, dmabuf_rb); + + /* + * Just ignore the new handle if we already have an handle for + * this DMA-buf. + */ + if (dma_buf == pos->dma_buf) { + dma_buf_put(dma_buf); + kfree(member); + return 0; + + } if (dma_buf > pos->dma_buf) p = &rb->rb_right; else -- 2.34.1
