24
24
/* make sure these don't conflict w/ MSM_SUBMIT_BO_x */
25
25
#define BO_VALID 0x8000 /* is current addr in cmdstream correct/valid? */
26
26
#define BO_LOCKED 0x4000 /* obj lock is held */
27
- #define BO_PINNED 0x2000 /* obj is pinned and on active list */
27
+ #define BO_ACTIVE 0x2000 /* active refcnt is held */
28
+ #define BO_PINNED 0x1000 /* obj is pinned and on active list */
28
29
29
30
static struct msm_gem_submit * submit_create (struct drm_device * dev ,
30
31
struct msm_gpu * gpu ,
@@ -239,10 +240,11 @@ static void submit_cleanup_bo(struct msm_gem_submit *submit, int i,
239
240
struct drm_gem_object * obj = & submit -> bos [i ].obj -> base ;
240
241
unsigned flags = submit -> bos [i ].flags & cleanup_flags ;
241
242
242
- if (flags & BO_PINNED ) {
243
+ if (flags & BO_PINNED )
243
244
msm_gem_unpin_iova_locked (obj , submit -> aspace );
245
+
246
+ if (flags & BO_ACTIVE )
244
247
msm_gem_active_put (obj );
245
- }
246
248
247
249
if (flags & BO_LOCKED )
248
250
dma_resv_unlock (obj -> resv );
@@ -252,7 +254,7 @@ static void submit_cleanup_bo(struct msm_gem_submit *submit, int i,
252
254
253
255
static void submit_unlock_unpin_bo (struct msm_gem_submit * submit , int i )
254
256
{
255
- submit_cleanup_bo (submit , i , BO_PINNED | BO_LOCKED );
257
+ submit_cleanup_bo (submit , i , BO_PINNED | BO_ACTIVE | BO_LOCKED );
256
258
257
259
if (!(submit -> bos [i ].flags & BO_VALID ))
258
260
submit -> bos [i ].iova = 0 ;
@@ -356,6 +358,18 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
356
358
357
359
submit -> valid = true;
358
360
361
+ /*
362
+ * Increment active_count first, so if under memory pressure, we
363
+ * don't inadvertently evict a bo needed by the submit in order
364
+ * to pin an earlier bo in the same submit.
365
+ */
366
+ for (i = 0 ; i < submit -> nr_bos ; i ++ ) {
367
+ struct drm_gem_object * obj = & submit -> bos [i ].obj -> base ;
368
+
369
+ msm_gem_active_get (obj , submit -> gpu );
370
+ submit -> bos [i ].flags |= BO_ACTIVE ;
371
+ }
372
+
359
373
for (i = 0 ; i < submit -> nr_bos ; i ++ ) {
360
374
struct drm_gem_object * obj = & submit -> bos [i ].obj -> base ;
361
375
uint64_t iova ;
@@ -367,8 +381,6 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
367
381
if (ret )
368
382
break ;
369
383
370
- msm_gem_active_get (obj , submit -> gpu );
371
-
372
384
submit -> bos [i ].flags |= BO_PINNED ;
373
385
374
386
if (iova == submit -> bos [i ].iova ) {
@@ -502,7 +514,7 @@ static void submit_cleanup(struct msm_gem_submit *submit, bool error)
502
514
unsigned i ;
503
515
504
516
if (error )
505
- cleanup_flags |= BO_PINNED ;
517
+ cleanup_flags |= BO_PINNED | BO_ACTIVE ;
506
518
507
519
for (i = 0 ; i < submit -> nr_bos ; i ++ ) {
508
520
struct msm_gem_object * msm_obj = submit -> bos [i ].obj ;
@@ -520,7 +532,7 @@ void msm_submit_retire(struct msm_gem_submit *submit)
520
532
struct drm_gem_object * obj = & submit -> bos [i ].obj -> base ;
521
533
522
534
msm_gem_lock (obj );
523
- submit_cleanup_bo (submit , i , BO_PINNED );
535
+ submit_cleanup_bo (submit , i , BO_PINNED | BO_ACTIVE );
524
536
msm_gem_unlock (obj );
525
537
drm_gem_object_put (obj );
526
538
}
0 commit comments