@@ -379,6 +379,25 @@ validate_init(struct nouveau_channel *chan, struct drm_file *file_priv,
379
379
return 0 ;
380
380
}
381
381
382
+ static int
383
+ validate_sync (struct nouveau_channel * chan , struct nouveau_bo * nvbo )
384
+ {
385
+ struct nouveau_fence * fence = NULL ;
386
+ int ret = 0 ;
387
+
388
+ spin_lock (& nvbo -> bo .bdev -> fence_lock );
389
+ if (nvbo -> bo .sync_obj )
390
+ fence = nouveau_fence_ref (nvbo -> bo .sync_obj );
391
+ spin_unlock (& nvbo -> bo .bdev -> fence_lock );
392
+
393
+ if (fence ) {
394
+ ret = nouveau_fence_sync (fence , chan );
395
+ nouveau_fence_unref (& fence );
396
+ }
397
+
398
+ return ret ;
399
+ }
400
+
382
401
static int
383
402
validate_list (struct nouveau_channel * chan , struct list_head * list ,
384
403
struct drm_nouveau_gem_pushbuf_bo * pbbo , uint64_t user_pbbo_ptr )
@@ -393,7 +412,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
393
412
list_for_each_entry (nvbo , list , entry ) {
394
413
struct drm_nouveau_gem_pushbuf_bo * b = & pbbo [nvbo -> pbbo_index ];
395
414
396
- ret = nouveau_fence_sync ( nvbo -> bo . sync_obj , chan );
415
+ ret = validate_sync ( chan , nvbo );
397
416
if (unlikely (ret )) {
398
417
NV_ERROR (dev , "fail pre-validate sync\n" );
399
418
return ret ;
@@ -416,7 +435,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
416
435
return ret ;
417
436
}
418
437
419
- ret = nouveau_fence_sync ( nvbo -> bo . sync_obj , chan );
438
+ ret = validate_sync ( chan , nvbo );
420
439
if (unlikely (ret )) {
421
440
NV_ERROR (dev , "fail post-validate sync\n" );
422
441
return ret ;
0 commit comments