Commit 2a665968 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Daniel Vetter

drm/i915: Move pinning to inside engine_wa_list_verify()

This should be done as part of the ww loop, in order to remove a
i915_vma_pin that needs ww held.

Now only i915_ggtt_pin() callers remaining.
Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20210323155059.628690-25-maarten.lankhorst@linux.intel.com
parent 9fa1f478
...@@ -427,7 +427,6 @@ __vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size) ...@@ -427,7 +427,6 @@ __vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size)
{ {
struct drm_i915_gem_object *obj; struct drm_i915_gem_object *obj;
struct i915_vma *vma; struct i915_vma *vma;
int err;
obj = i915_gem_object_create_internal(vm->i915, PAGE_ALIGN(size)); obj = i915_gem_object_create_internal(vm->i915, PAGE_ALIGN(size));
if (IS_ERR(obj)) if (IS_ERR(obj))
...@@ -441,6 +440,19 @@ __vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size) ...@@ -441,6 +440,19 @@ __vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size)
return vma; return vma;
} }
return vma;
}
struct i915_vma *
__vm_create_scratch_for_read_pinned(struct i915_address_space *vm, unsigned long size)
{
struct i915_vma *vma;
int err;
vma = __vm_create_scratch_for_read(vm, size);
if (IS_ERR(vma))
return vma;
err = i915_vma_pin(vma, 0, 0, err = i915_vma_pin(vma, 0, 0,
i915_vma_is_ggtt(vma) ? PIN_GLOBAL : PIN_USER); i915_vma_is_ggtt(vma) ? PIN_GLOBAL : PIN_USER);
if (err) { if (err) {
......
...@@ -576,6 +576,9 @@ void i915_vm_free_pt_stash(struct i915_address_space *vm, ...@@ -576,6 +576,9 @@ void i915_vm_free_pt_stash(struct i915_address_space *vm,
struct i915_vma * struct i915_vma *
__vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size); __vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size);
struct i915_vma *
__vm_create_scratch_for_read_pinned(struct i915_address_space *vm, unsigned long size);
static inline struct sgt_dma { static inline struct sgt_dma {
struct scatterlist *sg; struct scatterlist *sg;
dma_addr_t dma, max; dma_addr_t dma, max;
......
...@@ -2213,10 +2213,15 @@ static int engine_wa_list_verify(struct intel_context *ce, ...@@ -2213,10 +2213,15 @@ static int engine_wa_list_verify(struct intel_context *ce,
if (err) if (err)
goto err_pm; goto err_pm;
err = i915_vma_pin_ww(vma, &ww, 0, 0,
i915_vma_is_ggtt(vma) ? PIN_GLOBAL : PIN_USER);
if (err)
goto err_unpin;
rq = i915_request_create(ce); rq = i915_request_create(ce);
if (IS_ERR(rq)) { if (IS_ERR(rq)) {
err = PTR_ERR(rq); err = PTR_ERR(rq);
goto err_unpin; goto err_vma;
} }
err = i915_request_await_object(rq, vma->obj, true); err = i915_request_await_object(rq, vma->obj, true);
...@@ -2257,6 +2262,8 @@ static int engine_wa_list_verify(struct intel_context *ce, ...@@ -2257,6 +2262,8 @@ static int engine_wa_list_verify(struct intel_context *ce,
err_rq: err_rq:
i915_request_put(rq); i915_request_put(rq);
err_vma:
i915_vma_unpin(vma);
err_unpin: err_unpin:
intel_context_unpin(ce); intel_context_unpin(ce);
err_pm: err_pm:
...@@ -2267,7 +2274,6 @@ static int engine_wa_list_verify(struct intel_context *ce, ...@@ -2267,7 +2274,6 @@ static int engine_wa_list_verify(struct intel_context *ce,
} }
i915_gem_ww_ctx_fini(&ww); i915_gem_ww_ctx_fini(&ww);
intel_engine_pm_put(ce->engine); intel_engine_pm_put(ce->engine);
i915_vma_unpin(vma);
i915_vma_put(vma); i915_vma_put(vma);
return err; return err;
} }
......
...@@ -4197,7 +4197,8 @@ static int preserved_virtual_engine(struct intel_gt *gt, ...@@ -4197,7 +4197,8 @@ static int preserved_virtual_engine(struct intel_gt *gt,
int err = 0; int err = 0;
u32 *cs; u32 *cs;
scratch = __vm_create_scratch_for_read(&siblings[0]->gt->ggtt->vm, scratch =
__vm_create_scratch_for_read_pinned(&siblings[0]->gt->ggtt->vm,
PAGE_SIZE); PAGE_SIZE);
if (IS_ERR(scratch)) if (IS_ERR(scratch))
return PTR_ERR(scratch); return PTR_ERR(scratch);
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
static struct i915_vma *create_scratch(struct intel_gt *gt) static struct i915_vma *create_scratch(struct intel_gt *gt)
{ {
return __vm_create_scratch_for_read(&gt->ggtt->vm, PAGE_SIZE); return __vm_create_scratch_for_read_pinned(&gt->ggtt->vm, PAGE_SIZE);
} }
static bool is_active(struct i915_request *rq) static bool is_active(struct i915_request *rq)
......
...@@ -75,7 +75,8 @@ static int live_mocs_init(struct live_mocs *arg, struct intel_gt *gt) ...@@ -75,7 +75,8 @@ static int live_mocs_init(struct live_mocs *arg, struct intel_gt *gt)
if (flags & (HAS_GLOBAL_MOCS | HAS_ENGINE_MOCS)) if (flags & (HAS_GLOBAL_MOCS | HAS_ENGINE_MOCS))
arg->mocs = table; arg->mocs = table;
arg->scratch = __vm_create_scratch_for_read(&gt->ggtt->vm, PAGE_SIZE); arg->scratch =
__vm_create_scratch_for_read_pinned(&gt->ggtt->vm, PAGE_SIZE);
if (IS_ERR(arg->scratch)) if (IS_ERR(arg->scratch))
return PTR_ERR(arg->scratch); return PTR_ERR(arg->scratch);
......
...@@ -490,7 +490,7 @@ static int check_dirty_whitelist(struct intel_context *ce) ...@@ -490,7 +490,7 @@ static int check_dirty_whitelist(struct intel_context *ce)
u32 *cs, *results; u32 *cs, *results;
sz = (2 * ARRAY_SIZE(values) + 1) * sizeof(u32); sz = (2 * ARRAY_SIZE(values) + 1) * sizeof(u32);
scratch = __vm_create_scratch_for_read(ce->vm, sz); scratch = __vm_create_scratch_for_read_pinned(ce->vm, sz);
if (IS_ERR(scratch)) if (IS_ERR(scratch))
return PTR_ERR(scratch); return PTR_ERR(scratch);
...@@ -1030,14 +1030,14 @@ static int live_isolated_whitelist(void *arg) ...@@ -1030,14 +1030,14 @@ static int live_isolated_whitelist(void *arg)
for (i = 0; i < ARRAY_SIZE(client); i++) { for (i = 0; i < ARRAY_SIZE(client); i++) {
client[i].scratch[0] = client[i].scratch[0] =
__vm_create_scratch_for_read(gt->vm, 4096); __vm_create_scratch_for_read_pinned(gt->vm, 4096);
if (IS_ERR(client[i].scratch[0])) { if (IS_ERR(client[i].scratch[0])) {
err = PTR_ERR(client[i].scratch[0]); err = PTR_ERR(client[i].scratch[0]);
goto err; goto err;
} }
client[i].scratch[1] = client[i].scratch[1] =
__vm_create_scratch_for_read(gt->vm, 4096); __vm_create_scratch_for_read_pinned(gt->vm, 4096);
if (IS_ERR(client[i].scratch[1])) { if (IS_ERR(client[i].scratch[1])) {
err = PTR_ERR(client[i].scratch[1]); err = PTR_ERR(client[i].scratch[1]);
i915_vma_unpin_and_release(&client[i].scratch[0], 0); i915_vma_unpin_and_release(&client[i].scratch[0], 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment