mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-30 07:34:12 +08:00
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 <ivo.g.dimitrov.75@gmail.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Link: https://patchwork.freedesktop.org/patch/msgid/1642587791-13222-4-git-send-email-ivo.g.dimitrov.75@gmail.com
This commit is contained in:
parent
1948d28db6
commit
3ccd59f930
@ -821,10 +821,12 @@ int omap_gem_pin(struct drm_gem_object *obj, dma_addr_t *dma_addr)
|
||||
if (ret)
|
||||
goto fail;
|
||||
|
||||
if (priv->has_dmm) {
|
||||
ret = omap_gem_pin_tiler(obj);
|
||||
if (ret)
|
||||
goto fail;
|
||||
if (omap_obj->flags & OMAP_BO_SCANOUT) {
|
||||
if (priv->has_dmm) {
|
||||
ret = omap_gem_pin_tiler(obj);
|
||||
if (ret)
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
refcount_inc(&omap_obj->pin_cnt);
|
||||
@ -861,6 +863,8 @@ static void omap_gem_unpin_locked(struct drm_gem_object *obj)
|
||||
kfree(omap_obj->sgt);
|
||||
omap_obj->sgt = NULL;
|
||||
}
|
||||
if (!(omap_obj->flags & OMAP_BO_SCANOUT))
|
||||
return;
|
||||
if (priv->has_dmm) {
|
||||
ret = tiler_unpin(omap_obj->block);
|
||||
if (ret) {
|
||||
|
Loading…
Reference in New Issue
Block a user