@@ -, +, @@ dma_resv obj" --- .../gpu/drm/i915/gem/i915_gem_execbuffer.c | 3 +- drivers/gpu/drm/i915/i915_vma.c | 48 ++++++++----------- 2 files changed, 21 insertions(+), 30 deletions(-) --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c +++ a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c @@ -999,8 +999,7 @@ static int eb_validate_vmas(struct i915_execbuffer *eb) } } - /* Reserve enough slots to accommodate composite fences */ - err = dma_resv_reserve_fences(vma->obj->base.resv, eb->num_batches); + err = dma_resv_reserve_fences(vma->obj->base.resv, 1); if (err) return err; --- a/drivers/gpu/drm/i915/i915_vma.c +++ a/drivers/gpu/drm/i915/i915_vma.c @@ -23,7 +23,6 @@ */ #include -#include #include #include "display/intel_frontbuffer.h" @@ -1839,21 +1838,6 @@ int _i915_vma_move_to_active(struct i915_vma *vma, if (unlikely(err)) return err; - /* - * Reserve fences slot early to prevent an allocation after preparing - * the workload and associating fences with dma_resv. - */ - if (fence && !(flags & __EXEC_OBJECT_NO_RESERVE)) { - struct dma_fence *curr; - int idx; - - dma_fence_array_for_each(curr, idx, fence) - ; - err = dma_resv_reserve_fences(vma->obj->base.resv, idx); - if (unlikely(err)) - return err; - } - if (flags & EXEC_OBJECT_WRITE) { struct intel_frontbuffer *front; @@ -1863,23 +1847,31 @@ int _i915_vma_move_to_active(struct i915_vma *vma, i915_active_add_request(&front->write, rq); intel_frontbuffer_put(front); } - } - if (fence) { - struct dma_fence *curr; - enum dma_resv_usage usage; - int idx; + if (!(flags & __EXEC_OBJECT_NO_RESERVE)) { + err = dma_resv_reserve_fences(vma->obj->base.resv, 1); + if (unlikely(err)) + return err; + } - obj->read_domains = 0; - if (flags & EXEC_OBJECT_WRITE) { - usage = DMA_RESV_USAGE_WRITE; + if (fence) { + dma_resv_add_fence(vma->obj->base.resv, fence, + DMA_RESV_USAGE_WRITE); obj->write_domain = I915_GEM_DOMAIN_RENDER; - } else { - usage = DMA_RESV_USAGE_READ; + obj->read_domains = 0; + } + } else { + if (!(flags & __EXEC_OBJECT_NO_RESERVE)) { + err = dma_resv_reserve_fences(vma->obj->base.resv, 1); + if (unlikely(err)) + return err; } - dma_fence_array_for_each(curr, idx, fence) - dma_resv_add_fence(vma->obj->base.resv, curr, usage); + if (fence) { + dma_resv_add_fence(vma->obj->base.resv, fence, + DMA_RESV_USAGE_READ); + obj->write_domain = 0; + } } if (flags & EXEC_OBJECT_NEEDS_FENCE && vma->fence) --