Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 3ccd59f

Browse files
freemangordontomba
authored andcommitted
drm: omapdrm: Do no allocate non-scanout GEMs through DMM/TILER
On devices with DMM, all allocations are done through either DMM or TILER. DMM/TILER being a limited resource means that such allocations will start to fail before actual free memory is exhausted. What is even worse is that with time DMM/TILER space gets fragmented to the point that even if we have enough free DMM/TILER space and free memory, allocation fails because there is no big enough free block in DMM/TILER space. Such failures can be easily observed with OMAP xorg DDX, for example - starting few GUI applications (so buffers for their windows are allocated) and then rotating landscape<->portrait while closing and opening new windows soon results in allocation failures. Fix that by mapping buffers through DMM/TILER only when really needed, like, for scanout buffers. Signed-off-by: Ivaylo Dimitrov <[email protected]> Signed-off-by: Tomi Valkeinen <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 1948d28 commit 3ccd59f

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

drivers/gpu/drm/omapdrm/omap_gem.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -821,10 +821,12 @@ int omap_gem_pin(struct drm_gem_object *obj, dma_addr_t *dma_addr)
821821
if (ret)
822822
goto fail;
823823

824-
if (priv->has_dmm) {
825-
ret = omap_gem_pin_tiler(obj);
826-
if (ret)
827-
goto fail;
824+
if (omap_obj->flags & OMAP_BO_SCANOUT) {
825+
if (priv->has_dmm) {
826+
ret = omap_gem_pin_tiler(obj);
827+
if (ret)
828+
goto fail;
829+
}
828830
}
829831
} else {
830832
refcount_inc(&omap_obj->pin_cnt);
@@ -861,6 +863,8 @@ static void omap_gem_unpin_locked(struct drm_gem_object *obj)
861863
kfree(omap_obj->sgt);
862864
omap_obj->sgt = NULL;
863865
}
866+
if (!(omap_obj->flags & OMAP_BO_SCANOUT))
867+
return;
864868
if (priv->has_dmm) {
865869
ret = tiler_unpin(omap_obj->block);
866870
if (ret) {

0 commit comments

Comments
 (0)