CPU prep is the point where we can reasonably return an error to userspace
when something goes wrong while populating the object. If we leave the
object unpopulated at this point, the allocation will happen in the
fault handler when userspace accesses the object through the mmap space,
where we don't have any other option than to OOM the system.

Signed-off-by: Lucas Stach <d...@lynxeye.de>
---
 drivers/gpu/drm/etnaviv/etnaviv_gem.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c 
b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index 98243ba..f6ac3f7 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -413,6 +413,16 @@ int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 
op,
        bool write = !!(op & ETNA_PREP_WRITE);
        int ret;
 
+       if (!etnaviv_obj->sgt) {
+               void *ret;
+
+               mutex_lock(&etnaviv_obj->lock);
+               ret = etnaviv_gem_get_pages(etnaviv_obj);
+               mutex_unlock(&etnaviv_obj->lock);
+               if (IS_ERR(ret))
+                       return PTR_ERR(ret);
+       }
+
        if (op & ETNA_PREP_NOSYNC) {
                if (!reservation_object_test_signaled_rcu(etnaviv_obj->resv,
                                                          write))
@@ -427,16 +437,6 @@ int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 
op,
        }
 
        if (etnaviv_obj->flags & ETNA_BO_CACHED) {
-               if (!etnaviv_obj->sgt) {
-                       void *ret;
-
-                       mutex_lock(&etnaviv_obj->lock);
-                       ret = etnaviv_gem_get_pages(etnaviv_obj);
-                       mutex_unlock(&etnaviv_obj->lock);
-                       if (IS_ERR(ret))
-                               return PTR_ERR(ret);
-               }
-
                dma_sync_sg_for_cpu(dev->dev, etnaviv_obj->sgt->sgl,
                                    etnaviv_obj->sgt->nents,
                                    etnaviv_op_to_dma_dir(op));
-- 
2.9.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to