Skip to content

Commit 2d7d2c4

Browse files
committed
drm/msm/gem: Split out submit_unpin_objects() helper
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/
1 parent ceab575 commit 2d7d2c4

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

drivers/gpu/drm/msm/msm_gem.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,9 @@ struct msm_gem_submit {
274274
int fence_id; /* key into queue->fence_idr */
275275
struct msm_gpu_submitqueue *queue;
276276
struct pid *pid; /* submitting process */
277-
bool fault_dumped; /* Limit devcoredump dumping to one per submit */
278-
bool in_rb; /* "sudo" mode, copy cmds into RB */
277+
bool bos_pinned : 1;
278+
bool fault_dumped:1;/* Limit devcoredump dumping to one per submit */
279+
bool in_rb : 1; /* "sudo" mode, copy cmds into RB */
279280
struct msm_ringbuffer *ring;
280281
unsigned int nr_cmds;
281282
unsigned int nr_bos;
@@ -292,7 +293,6 @@ struct msm_gem_submit {
292293
struct {
293294
/* make sure these don't conflict w/ MSM_SUBMIT_BO_x */
294295
#define BO_LOCKED 0x4000 /* obj lock is held */
295-
#define BO_PINNED 0x2000 /* obj (pages) is pinned and on active list */
296296
uint32_t flags;
297297
union {
298298
struct drm_gem_object *obj;

drivers/gpu/drm/msm/msm_gem_submit.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,6 @@ static void submit_cleanup_bo(struct msm_gem_submit *submit, int i,
265265
*/
266266
submit->bos[i].flags &= ~cleanup_flags;
267267

268-
if (flags & BO_PINNED)
269-
msm_gem_unpin_locked(obj);
270-
271268
if (flags & BO_LOCKED)
272269
dma_resv_unlock(obj->resv);
273270
}
@@ -407,13 +404,28 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
407404
mutex_lock(&priv->lru.lock);
408405
for (i = 0; i < submit->nr_bos; i++) {
409406
msm_gem_pin_obj_locked(submit->bos[i].obj);
410-
submit->bos[i].flags |= BO_PINNED;
411407
}
412408
mutex_unlock(&priv->lru.lock);
413409

410+
submit->bos_pinned = true;
411+
414412
return ret;
415413
}
416414

415+
static void submit_unpin_objects(struct msm_gem_submit *submit)
416+
{
417+
if (!submit->bos_pinned)
418+
return;
419+
420+
for (int i = 0; i < submit->nr_bos; i++) {
421+
struct drm_gem_object *obj = submit->bos[i].obj;
422+
423+
msm_gem_unpin_locked(obj);
424+
}
425+
426+
submit->bos_pinned = false;
427+
}
428+
417429
static void submit_attach_object_fences(struct msm_gem_submit *submit)
418430
{
419431
int i;
@@ -525,7 +537,7 @@ static void submit_cleanup(struct msm_gem_submit *submit, bool error)
525537
unsigned i;
526538

527539
if (error)
528-
cleanup_flags |= BO_PINNED;
540+
submit_unpin_objects(submit);
529541

530542
for (i = 0; i < submit->nr_bos; i++) {
531543
struct drm_gem_object *obj = submit->bos[i].obj;

drivers/gpu/drm/msm/msm_ringbuffer.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ static struct dma_fence *msm_job_run(struct drm_sched_job *job)
2929
struct drm_gem_object *obj = submit->bos[i].obj;
3030

3131
msm_gem_unpin_active(obj);
32-
submit->bos[i].flags &= ~BO_PINNED;
3332
}
3433

34+
submit->bos_pinned = false;
35+
3536
mutex_unlock(&priv->lru.lock);
3637

3738
msm_gpu_submit(gpu, submit);

0 commit comments

Comments
 (0)