Skip to content

Commit be40596

Browse files
committed
drm/msm: Consolidate submit bo state
Move all the locked/active/pinned state handling to msm_gem_submit.c. In particular, for drm/scheduler, we'll need to do all this before pushing the submit job to the scheduler. But while we're at it we can get rid of the dupicate pin and refcnt. Signed-off-by: Rob Clark <[email protected]> Acked-by: Christian König <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Rob Clark <[email protected]>
1 parent 7039d3f commit be40596

File tree

3 files changed

+75
-48
lines changed

3 files changed

+75
-48
lines changed

drivers/gpu/drm/msm/msm_gem.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,8 @@ static inline void msm_gem_submit_put(struct msm_gem_submit *submit)
361361
kref_put(&submit->ref, __msm_gem_submit_destroy);
362362
}
363363

364+
void msm_submit_retire(struct msm_gem_submit *submit);
365+
364366
/* helper to determine of a buffer in submit should be dumped, used for both
365367
* devcoredump and debugfs cmdstream dumping:
366368
*/

drivers/gpu/drm/msm/msm_gem_submit.c

Lines changed: 72 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323

2424
/* make sure these don't conflict w/ MSM_SUBMIT_BO_x */
2525
#define BO_VALID 0x8000 /* is current addr in cmdstream correct/valid? */
26-
#define BO_LOCKED 0x4000
27-
#define BO_PINNED 0x2000
26+
#define BO_LOCKED 0x4000 /* obj lock is held */
27+
#define BO_PINNED 0x2000 /* obj is pinned and on active list */
2828

2929
static struct msm_gem_submit *submit_create(struct drm_device *dev,
3030
struct msm_gpu *gpu,
@@ -220,21 +220,33 @@ static int submit_lookup_cmds(struct msm_gem_submit *submit,
220220
return ret;
221221
}
222222

223-
static void submit_unlock_unpin_bo(struct msm_gem_submit *submit,
224-
int i, bool backoff)
223+
/* Unwind bo state, according to cleanup_flags. In the success case, only
224+
* the lock is dropped at the end of the submit (and active/pin ref is dropped
225+
* later when the submit is retired).
226+
*/
227+
static void submit_cleanup_bo(struct msm_gem_submit *submit, int i,
228+
unsigned cleanup_flags)
225229
{
226-
struct msm_gem_object *msm_obj = submit->bos[i].obj;
230+
struct drm_gem_object *obj = &submit->bos[i].obj->base;
231+
unsigned flags = submit->bos[i].flags & cleanup_flags;
227232

228-
if (submit->bos[i].flags & BO_PINNED)
229-
msm_gem_unpin_iova_locked(&msm_obj->base, submit->aspace);
233+
if (flags & BO_PINNED) {
234+
msm_gem_unpin_iova_locked(obj, submit->aspace);
235+
msm_gem_active_put(obj);
236+
}
230237

231-
if (submit->bos[i].flags & BO_LOCKED)
232-
dma_resv_unlock(msm_obj->base.resv);
238+
if (flags & BO_LOCKED)
239+
dma_resv_unlock(obj->resv);
233240

234-
if (backoff && !(submit->bos[i].flags & BO_VALID))
235-
submit->bos[i].iova = 0;
241+
submit->bos[i].flags &= ~cleanup_flags;
242+
}
236243

237-
submit->bos[i].flags &= ~(BO_LOCKED | BO_PINNED);
244+
static void submit_unlock_unpin_bo(struct msm_gem_submit *submit, int i)
245+
{
246+
submit_cleanup_bo(submit, i, BO_PINNED | BO_LOCKED);
247+
248+
if (!(submit->bos[i].flags & BO_VALID))
249+
submit->bos[i].iova = 0;
238250
}
239251

240252
/* This is where we make sure all the bo's are reserved and pin'd: */
@@ -266,10 +278,10 @@ static int submit_lock_objects(struct msm_gem_submit *submit)
266278

267279
fail:
268280
for (; i >= 0; i--)
269-
submit_unlock_unpin_bo(submit, i, true);
281+
submit_unlock_unpin_bo(submit, i);
270282

271283
if (slow_locked > 0)
272-
submit_unlock_unpin_bo(submit, slow_locked, true);
284+
submit_unlock_unpin_bo(submit, slow_locked);
273285

274286
if (ret == -EDEADLK) {
275287
struct msm_gem_object *msm_obj = submit->bos[contended].obj;
@@ -325,16 +337,18 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
325337
submit->valid = true;
326338

327339
for (i = 0; i < submit->nr_bos; i++) {
328-
struct msm_gem_object *msm_obj = submit->bos[i].obj;
340+
struct drm_gem_object *obj = &submit->bos[i].obj->base;
329341
uint64_t iova;
330342

331343
/* if locking succeeded, pin bo: */
332-
ret = msm_gem_get_and_pin_iova_locked(&msm_obj->base,
344+
ret = msm_gem_get_and_pin_iova_locked(obj,
333345
submit->aspace, &iova);
334346

335347
if (ret)
336348
break;
337349

350+
msm_gem_active_get(obj, submit->gpu);
351+
338352
submit->bos[i].flags |= BO_PINNED;
339353

340354
if (iova == submit->bos[i].iova) {
@@ -350,6 +364,20 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
350364
return ret;
351365
}
352366

367+
static void submit_attach_object_fences(struct msm_gem_submit *submit)
368+
{
369+
int i;
370+
371+
for (i = 0; i < submit->nr_bos; i++) {
372+
struct drm_gem_object *obj = &submit->bos[i].obj->base;
373+
374+
if (submit->bos[i].flags & MSM_SUBMIT_BO_WRITE)
375+
dma_resv_add_excl_fence(obj->resv, submit->fence);
376+
else if (submit->bos[i].flags & MSM_SUBMIT_BO_READ)
377+
dma_resv_add_shared_fence(obj->resv, submit->fence);
378+
}
379+
}
380+
353381
static int submit_bo(struct msm_gem_submit *submit, uint32_t idx,
354382
struct msm_gem_object **obj, uint64_t *iova, bool *valid)
355383
{
@@ -444,18 +472,40 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
444472
return ret;
445473
}
446474

447-
static void submit_cleanup(struct msm_gem_submit *submit)
475+
/* Cleanup submit at end of ioctl. In the error case, this also drops
476+
* references, unpins, and drops active refcnt. In the non-error case,
477+
* this is done when the submit is retired.
478+
*/
479+
static void submit_cleanup(struct msm_gem_submit *submit, bool error)
448480
{
481+
unsigned cleanup_flags = BO_LOCKED;
449482
unsigned i;
450483

484+
if (error)
485+
cleanup_flags |= BO_PINNED;
486+
451487
for (i = 0; i < submit->nr_bos; i++) {
452488
struct msm_gem_object *msm_obj = submit->bos[i].obj;
453-
submit_unlock_unpin_bo(submit, i, false);
489+
submit_cleanup_bo(submit, i, cleanup_flags);
454490
list_del_init(&msm_obj->submit_entry);
455-
drm_gem_object_put(&msm_obj->base);
491+
if (error)
492+
drm_gem_object_put(&msm_obj->base);
456493
}
457494
}
458495

496+
void msm_submit_retire(struct msm_gem_submit *submit)
497+
{
498+
int i;
499+
500+
for (i = 0; i < submit->nr_bos; i++) {
501+
struct drm_gem_object *obj = &submit->bos[i].obj->base;
502+
503+
msm_gem_lock(obj);
504+
submit_cleanup_bo(submit, i, BO_PINNED);
505+
msm_gem_unlock(obj);
506+
drm_gem_object_put(obj);
507+
}
508+
}
459509

460510
struct msm_submit_post_dep {
461511
struct drm_syncobj *syncobj;
@@ -832,6 +882,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
832882
args->fence_fd = out_fence_fd;
833883
}
834884

885+
submit_attach_object_fences(submit);
886+
835887
msm_gpu_submit(gpu, submit);
836888

837889
args->fence = submit->fence->seqno;
@@ -844,7 +896,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
844896
out:
845897
pm_runtime_put(&gpu->pdev->dev);
846898
out_pre_pm:
847-
submit_cleanup(submit);
899+
submit_cleanup(submit, !!ret);
848900
if (has_ww_ticket)
849901
ww_acquire_fini(&submit->ticket);
850902
msm_gem_submit_put(submit);

drivers/gpu/drm/msm/msm_gpu.c

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,6 @@ static void retire_submit(struct msm_gpu *gpu, struct msm_ringbuffer *ring,
647647
volatile struct msm_gpu_submit_stats *stats;
648648
u64 elapsed, clock = 0;
649649
unsigned long flags;
650-
int i;
651650

652651
stats = &ring->memptrs->stats[index];
653652
/* Convert 19.2Mhz alwayson ticks to nanoseconds for elapsed time */
@@ -663,15 +662,7 @@ static void retire_submit(struct msm_gpu *gpu, struct msm_ringbuffer *ring,
663662
trace_msm_gpu_submit_retired(submit, elapsed, clock,
664663
stats->alwayson_start, stats->alwayson_end);
665664

666-
for (i = 0; i < submit->nr_bos; i++) {
667-
struct drm_gem_object *obj = &submit->bos[i].obj->base;
668-
669-
msm_gem_lock(obj);
670-
msm_gem_active_put(obj);
671-
msm_gem_unpin_iova_locked(obj, submit->aspace);
672-
msm_gem_unlock(obj);
673-
drm_gem_object_put(obj);
674-
}
665+
msm_submit_retire(submit);
675666

676667
pm_runtime_mark_last_busy(&gpu->pdev->dev);
677668
pm_runtime_put_autosuspend(&gpu->pdev->dev);
@@ -748,7 +739,6 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
748739
struct msm_drm_private *priv = dev->dev_private;
749740
struct msm_ringbuffer *ring = submit->ring;
750741
unsigned long flags;
751-
int i;
752742

753743
WARN_ON(!mutex_is_locked(&dev->struct_mutex));
754744

@@ -762,23 +752,6 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
762752

763753
update_sw_cntrs(gpu);
764754

765-
for (i = 0; i < submit->nr_bos; i++) {
766-
struct msm_gem_object *msm_obj = submit->bos[i].obj;
767-
struct drm_gem_object *drm_obj = &msm_obj->base;
768-
uint64_t iova;
769-
770-
/* submit takes a reference to the bo and iova until retired: */
771-
drm_gem_object_get(&msm_obj->base);
772-
msm_gem_get_and_pin_iova_locked(&msm_obj->base, submit->aspace, &iova);
773-
774-
if (submit->bos[i].flags & MSM_SUBMIT_BO_WRITE)
775-
dma_resv_add_excl_fence(drm_obj->resv, submit->fence);
776-
else if (submit->bos[i].flags & MSM_SUBMIT_BO_READ)
777-
dma_resv_add_shared_fence(drm_obj->resv, submit->fence);
778-
779-
msm_gem_active_get(drm_obj, gpu);
780-
}
781-
782755
/*
783756
* ring->submits holds a ref to the submit, to deal with the case
784757
* that a submit completes before msm_ioctl_gem_submit() returns.

0 commit comments

Comments
 (0)