drm/msm/gem: Split out submit_unpin_objects() helper
authorRob Clark <robdclark@chromium.org>
Tue, 21 Nov 2023 00:38:48 +0000 (16:38 -0800)
committerRob Clark <robdclark@chromium.org>
Sun, 10 Dec 2023 18:23:13 +0000 (10:23 -0800)
Untangle unpinning from unlock/unref loop.  The unpin only happens in
error paths so it is easier to decouple from the normal unlock path.

Since we never have an intermediate state where a subset of buffers
are pinned (ie. we never bail out of the pin or unpin loops) we can
replace the bo state flag bit with a global flag in the submit.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/568335/

drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/msm/msm_ringbuffer.c

index 79195f2fd17106aa39e78acbd8b3c2a7f0cc5ea5..80f4207120eab50599cac5d48a5562c8c7f38c79 100644 (file)
@@ -274,8 +274,9 @@ struct msm_gem_submit {
        int fence_id;       /* key into queue->fence_idr */
        struct msm_gpu_submitqueue *queue;
        struct pid *pid;    /* submitting process */
-       bool fault_dumped;  /* Limit devcoredump dumping to one per submit */
-       bool in_rb;         /* "sudo" mode, copy cmds into RB */
+       bool bos_pinned : 1;
+       bool fault_dumped:1;/* Limit devcoredump dumping to one per submit */
+       bool in_rb : 1;     /* "sudo" mode, copy cmds into RB */
        struct msm_ringbuffer *ring;
        unsigned int nr_cmds;
        unsigned int nr_bos;
@@ -292,7 +293,6 @@ struct msm_gem_submit {
        struct {
 /* make sure these don't conflict w/ MSM_SUBMIT_BO_x */
 #define BO_LOCKED      0x4000  /* obj lock is held */
-#define BO_PINNED      0x2000  /* obj (pages) is pinned and on active list */
                uint32_t flags;
                union {
                        struct drm_gem_object *obj;
index 0bcdc589ceea00bd6590475dfbc54be8966aada7..208fad42f78449cfbf69e7994ec324ff1e385347 100644 (file)
@@ -265,9 +265,6 @@ static void submit_cleanup_bo(struct msm_gem_submit *submit, int i,
         */
        submit->bos[i].flags &= ~cleanup_flags;
 
-       if (flags & BO_PINNED)
-               msm_gem_unpin_locked(obj);
-
        if (flags & BO_LOCKED)
                dma_resv_unlock(obj->resv);
 }
@@ -407,13 +404,28 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
        mutex_lock(&priv->lru.lock);
        for (i = 0; i < submit->nr_bos; i++) {
                msm_gem_pin_obj_locked(submit->bos[i].obj);
-               submit->bos[i].flags |= BO_PINNED;
        }
        mutex_unlock(&priv->lru.lock);
 
+       submit->bos_pinned = true;
+
        return ret;
 }
 
+static void submit_unpin_objects(struct msm_gem_submit *submit)
+{
+       if (!submit->bos_pinned)
+               return;
+
+       for (int i = 0; i < submit->nr_bos; i++) {
+               struct drm_gem_object *obj = submit->bos[i].obj;
+
+               msm_gem_unpin_locked(obj);
+       }
+
+       submit->bos_pinned = false;
+}
+
 static void submit_attach_object_fences(struct msm_gem_submit *submit)
 {
        int i;
@@ -525,7 +537,7 @@ static void submit_cleanup(struct msm_gem_submit *submit, bool error)
        unsigned i;
 
        if (error)
-               cleanup_flags |= BO_PINNED;
+               submit_unpin_objects(submit);
 
        for (i = 0; i < submit->nr_bos; i++) {
                struct drm_gem_object *obj = submit->bos[i].obj;
index 4968568e3b546ce12a6c9ab1108c9a28dbe10e12..4bc13f7d005ab7c643f78206d8d41d72cd779045 100644 (file)
@@ -29,9 +29,10 @@ static struct dma_fence *msm_job_run(struct drm_sched_job *job)
                struct drm_gem_object *obj = submit->bos[i].obj;
 
                msm_gem_unpin_active(obj);
-               submit->bos[i].flags &= ~BO_PINNED;
        }
 
+       submit->bos_pinned = false;
+
        mutex_unlock(&priv->lru.lock);
 
        msm_gpu_submit(gpu, submit);