|
@@ -379,6 +379,25 @@ retry:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+validate_sync(struct nouveau_channel *chan, struct nouveau_bo *nvbo)
|
|
|
+{
|
|
|
+ struct nouveau_fence *fence = NULL;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ spin_lock(&nvbo->bo.bdev->fence_lock);
|
|
|
+ if (nvbo->bo.sync_obj)
|
|
|
+ fence = nouveau_fence_ref(nvbo->bo.sync_obj);
|
|
|
+ spin_unlock(&nvbo->bo.bdev->fence_lock);
|
|
|
+
|
|
|
+ if (fence) {
|
|
|
+ ret = nouveau_fence_sync(fence, chan);
|
|
|
+ nouveau_fence_unref(&fence);
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
validate_list(struct nouveau_channel *chan, struct list_head *list,
|
|
|
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,
|
|
|
list_for_each_entry(nvbo, list, entry) {
|
|
|
struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index];
|
|
|
|
|
|
- ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan);
|
|
|
+ ret = validate_sync(chan, nvbo);
|
|
|
if (unlikely(ret)) {
|
|
|
NV_ERROR(dev, "fail pre-validate sync\n");
|
|
|
return ret;
|
|
@@ -416,7 +435,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan);
|
|
|
+ ret = validate_sync(chan, nvbo);
|
|
|
if (unlikely(ret)) {
|
|
|
NV_ERROR(dev, "fail post-validate sync\n");
|
|
|
return ret;
|