@@ -1784,7 +1784,7 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
dma_resv_add_excl_fence(shadow->resv, &pw->base.dma);
dma_resv_unlock(shadow->resv);
- dma_fence_work_commit(&pw->base);
+ dma_fence_work_commit_imm(&pw->base);
return 0;
err_batch_unlock:
@@ -38,7 +38,10 @@ fence_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
if (!f->dma.error) {
dma_fence_get(&f->dma);
- queue_work(system_unbound_wq, &f->work);
+ if (f->immediate)
+ fence_work(&f->work);
+ else
+ queue_work(system_unbound_wq, &f->work);
} else {
fence_complete(f);
}
@@ -88,6 +91,7 @@ void dma_fence_work_init(struct dma_fence_work *f,
dma_fence_init(&f->dma, &fence_ops, &f->lock, 0, 0);
i915_sw_fence_init(&f->chain, fence_notify);
INIT_WORK(&f->work, fence_work);
+ f->immediate = false;
}
int dma_fence_work_chain(struct dma_fence_work *f, struct dma_fence *signal)
@@ -28,6 +28,7 @@ struct dma_fence_work {
struct i915_sw_fence chain;
struct i915_sw_dma_fence_cb cb;
+ bool immediate;
struct work_struct work;
const struct dma_fence_work_ops *ops;
};
@@ -41,4 +42,10 @@ static inline void dma_fence_work_commit(struct dma_fence_work *f)
i915_sw_fence_commit(&f->chain);
}
+static inline void dma_fence_work_commit_imm(struct dma_fence_work *f)
+{
+ f->immediate = atomic_read(&f->chain.pending) <= 1;
+ dma_fence_work_commit(f);
+}
+
#endif /* I915_SW_FENCE_WORK_H */
@@ -956,7 +956,7 @@ int i915_vma_pin(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
mutex_unlock(&vma->vm->mutex);
err_fence:
if (work)
- dma_fence_work_commit(&work->base);
+ dma_fence_work_commit_imm(&work->base);
if (wakeref)
intel_runtime_pm_put(&vma->vm->i915->runtime_pm, wakeref);
err_pages:
If the caller allows and we do not have to wait for any signals, immediately execute the work within the caller's process. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> --- drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c | 2 +- drivers/gpu/drm/i915/i915_sw_fence_work.c | 6 +++++- drivers/gpu/drm/i915/i915_sw_fence_work.h | 7 +++++++ drivers/gpu/drm/i915/i915_vma.c | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-)