On Mon, Jul 15, 2019 at 09:09:43AM +0100, Chris Wilson wrote: > We only need to keep a unique tag for the active lifetime of the > context, and for as long as we need to identify that context. The HW > uses the tag to determine if it should use a lite-restore (why not the > LRCA?) and passes the tag back for various status identifies. The only > status we need to track is for OA, so when using perf, we assign the > specific context a unique tag. Device Page fault handler needs logical HW id. Logical HW id will be used to identify the gem context to further lookup the address space. Prathap > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/gem/i915_gem_context.c | 151 ------------------ > drivers/gpu/drm/i915/gem/i915_gem_context.h | 15 -- > .../gpu/drm/i915/gem/i915_gem_context_types.h | 18 --- > .../drm/i915/gem/selftests/i915_gem_context.c | 13 +- > .../gpu/drm/i915/gem/selftests/mock_context.c | 8 - > drivers/gpu/drm/i915/gt/intel_context_types.h | 1 + > drivers/gpu/drm/i915/gt/intel_engine_types.h | 5 +- > drivers/gpu/drm/i915/gt/intel_lrc.c | 28 ++-- > drivers/gpu/drm/i915/gvt/kvmgt.c | 17 -- > drivers/gpu/drm/i915/i915_debugfs.c | 3 - > drivers/gpu/drm/i915/i915_gpu_error.c | 7 +- > drivers/gpu/drm/i915/i915_gpu_error.h | 1 - > drivers/gpu/drm/i915/i915_perf.c | 28 ++-- > drivers/gpu/drm/i915/i915_trace.h | 38 ++--- > .../gpu/drm/i915/selftests/i915_gem_evict.c | 4 +- > drivers/gpu/drm/i915/selftests/i915_vma.c | 2 +- > 16 files changed, 51 insertions(+), 288 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c > index e9f5e19265b9..2669e038661e 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c > @@ -167,95 +167,6 @@ lookup_user_engine(struct i915_gem_context *ctx, > return i915_gem_context_get_engine(ctx, idx); > } > > -static inline int new_hw_id(struct drm_i915_private *i915, gfp_t gfp) > -{ > - unsigned int max; > - > - lockdep_assert_held(&i915->contexts.mutex); > - > - if (INTEL_GEN(i915) >= 11) > - max = GEN11_MAX_CONTEXT_HW_ID; > - else if (USES_GUC_SUBMISSION(i915)) > - /* > - * When using GuC in proxy submission, GuC consumes the > - * highest bit in the context id to indicate proxy submission. > - */ > - max = MAX_GUC_CONTEXT_HW_ID; > - else > - max = MAX_CONTEXT_HW_ID; > - > - return ida_simple_get(&i915->contexts.hw_ida, 0, max, gfp); > -} > - > -static int steal_hw_id(struct drm_i915_private *i915) > -{ > - struct i915_gem_context *ctx, *cn; > - LIST_HEAD(pinned); > - int id = -ENOSPC; > - > - lockdep_assert_held(&i915->contexts.mutex); > - > - list_for_each_entry_safe(ctx, cn, > - &i915->contexts.hw_id_list, hw_id_link) { > - if (atomic_read(&ctx->hw_id_pin_count)) { > - list_move_tail(&ctx->hw_id_link, &pinned); > - continue; > - } > - > - GEM_BUG_ON(!ctx->hw_id); /* perma-pinned kernel context */ > - list_del_init(&ctx->hw_id_link); > - id = ctx->hw_id; > - break; > - } > - > - /* > - * Remember how far we got up on the last repossesion scan, so the > - * list is kept in a "least recently scanned" order. > - */ > - list_splice_tail(&pinned, &i915->contexts.hw_id_list); > - return id; > -} > - > -static int assign_hw_id(struct drm_i915_private *i915, unsigned int *out) > -{ > - int ret; > - > - lockdep_assert_held(&i915->contexts.mutex); > - > - /* > - * We prefer to steal/stall ourselves and our users over that of the > - * entire system. That may be a little unfair to our users, and > - * even hurt high priority clients. The choice is whether to oomkill > - * something else, or steal a context id. > - */ > - ret = new_hw_id(i915, GFP_KERNEL | __GFP_RETRY_MAYFAIL | __GFP_NOWARN); > - if (unlikely(ret < 0)) { > - ret = steal_hw_id(i915); > - if (ret < 0) /* once again for the correct errno code */ > - ret = new_hw_id(i915, GFP_KERNEL); > - if (ret < 0) > - return ret; > - } > - > - *out = ret; > - return 0; > -} > - > -static void release_hw_id(struct i915_gem_context *ctx) > -{ > - struct drm_i915_private *i915 = ctx->i915; > - > - if (list_empty(&ctx->hw_id_link)) > - return; > - > - mutex_lock(&i915->contexts.mutex); > - if (!list_empty(&ctx->hw_id_link)) { > - ida_simple_remove(&i915->contexts.hw_ida, ctx->hw_id); > - list_del_init(&ctx->hw_id_link); > - } > - mutex_unlock(&i915->contexts.mutex); > -} > - > static void __free_engines(struct i915_gem_engines *e, unsigned int count) > { > while (count--) { > @@ -309,7 +220,6 @@ static void i915_gem_context_free(struct i915_gem_context *ctx) > lockdep_assert_held(&ctx->i915->drm.struct_mutex); > GEM_BUG_ON(!i915_gem_context_is_closed(ctx)); > > - release_hw_id(ctx); > if (ctx->vm) > i915_vm_put(ctx->vm); > > @@ -381,12 +291,6 @@ static void context_close(struct i915_gem_context *ctx) > i915_gem_context_set_closed(ctx); > ctx->file_priv = ERR_PTR(-EBADF); > > - /* > - * This context will never again be assinged to HW, so we can > - * reuse its ID for the next context. > - */ > - release_hw_id(ctx); > - > /* > * The LUT uses the VMA as a backpointer to unref the object, > * so we need to clear the LUT before we close all the VMA (inside > @@ -449,7 +353,6 @@ __create_context(struct drm_i915_private *i915) > RCU_INIT_POINTER(ctx->engines, e); > > INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL); > - INIT_LIST_HEAD(&ctx->hw_id_link); > > /* NB: Mark all slices as needing a remap so that when the context first > * loads it will restore whatever remap state already exists. If there > @@ -572,13 +475,6 @@ i915_gem_context_create_gvt(struct drm_device *dev) > if (IS_ERR(ctx)) > goto out; > > - ret = i915_gem_context_pin_hw_id(ctx); > - if (ret) { > - context_close(ctx); > - ctx = ERR_PTR(ret); > - goto out; > - } > - > ctx->file_priv = ERR_PTR(-EBADF); > i915_gem_context_set_closed(ctx); /* not user accessible */ > i915_gem_context_clear_bannable(ctx); > @@ -609,18 +505,11 @@ struct i915_gem_context * > i915_gem_context_create_kernel(struct drm_i915_private *i915, int prio) > { > struct i915_gem_context *ctx; > - int err; > > ctx = i915_gem_create_context(i915, 0); > if (IS_ERR(ctx)) > return ctx; > > - err = i915_gem_context_pin_hw_id(ctx); > - if (err) { > - destroy_kernel_context(&ctx); > - return ERR_PTR(err); > - } > - > i915_gem_context_clear_bannable(ctx); > ctx->sched.priority = I915_USER_PRIORITY(prio); > ctx->ring_size = PAGE_SIZE; > @@ -660,15 +549,6 @@ int i915_gem_contexts_init(struct drm_i915_private *dev_priv) > DRM_ERROR("Failed to create default global context\n"); > return PTR_ERR(ctx); > } > - /* > - * For easy recognisablity, we want the kernel context to be 0 and then > - * all user contexts will have non-zero hw_id. Kernel contexts are > - * permanently pinned, so that we never suffer a stall and can > - * use them from any allocation context (e.g. for evicting other > - * contexts and from inside the shrinker). > - */ > - GEM_BUG_ON(ctx->hw_id); > - GEM_BUG_ON(!atomic_read(&ctx->hw_id_pin_count)); > dev_priv->kernel_context = ctx; > > DRM_DEBUG_DRIVER("%s context support initialized\n", > @@ -682,10 +562,6 @@ void i915_gem_contexts_fini(struct drm_i915_private *i915) > lockdep_assert_held(&i915->drm.struct_mutex); > > destroy_kernel_context(&i915->kernel_context); > - > - /* Must free all deferred contexts (via flush_workqueue) first */ > - GEM_BUG_ON(!list_empty(&i915->contexts.hw_id_list)); > - ida_destroy(&i915->contexts.hw_ida); > } > > static int context_idr_cleanup(int id, void *p, void *data) > @@ -2366,33 +2242,6 @@ int i915_gem_context_reset_stats_ioctl(struct drm_device *dev, > return ret; > } > > -int __i915_gem_context_pin_hw_id(struct i915_gem_context *ctx) > -{ > - struct drm_i915_private *i915 = ctx->i915; > - int err = 0; > - > - mutex_lock(&i915->contexts.mutex); > - > - GEM_BUG_ON(i915_gem_context_is_closed(ctx)); > - > - if (list_empty(&ctx->hw_id_link)) { > - GEM_BUG_ON(atomic_read(&ctx->hw_id_pin_count)); > - > - err = assign_hw_id(i915, &ctx->hw_id); > - if (err) > - goto out_unlock; > - > - list_add_tail(&ctx->hw_id_link, &i915->contexts.hw_id_list); > - } > - > - GEM_BUG_ON(atomic_read(&ctx->hw_id_pin_count) == ~0u); > - atomic_inc(&ctx->hw_id_pin_count); > - > -out_unlock: > - mutex_unlock(&i915->contexts.mutex); > - return err; > -} > - > /* GEM context-engines iterator: for_each_gem_engine() */ > struct intel_context * > i915_gem_engines_iter_next(struct i915_gem_engines_iter *it) > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.h b/drivers/gpu/drm/i915/gem/i915_gem_context.h > index 106e2ccf7a4c..6fb3ad7e03fc 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_context.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.h > @@ -112,21 +112,6 @@ i915_gem_context_clear_user_engines(struct i915_gem_context *ctx) > clear_bit(CONTEXT_USER_ENGINES, &ctx->flags); > } > > -int __i915_gem_context_pin_hw_id(struct i915_gem_context *ctx); > -static inline int i915_gem_context_pin_hw_id(struct i915_gem_context *ctx) > -{ > - if (atomic_inc_not_zero(&ctx->hw_id_pin_count)) > - return 0; > - > - return __i915_gem_context_pin_hw_id(ctx); > -} > - > -static inline void i915_gem_context_unpin_hw_id(struct i915_gem_context *ctx) > -{ > - GEM_BUG_ON(atomic_read(&ctx->hw_id_pin_count) == 0u); > - atomic_dec(&ctx->hw_id_pin_count); > -} > - > static inline bool i915_gem_context_is_kernel(struct i915_gem_context *ctx) > { > return !ctx->file_priv; > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h > index 0ee61482ef94..80cd3ab355e0 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h > @@ -147,24 +147,6 @@ struct i915_gem_context { > #define CONTEXT_FORCE_SINGLE_SUBMISSION 2 > #define CONTEXT_USER_ENGINES 3 > > - /** > - * @hw_id: - unique identifier for the context > - * > - * The hardware needs to uniquely identify the context for a few > - * functions like fault reporting, PASID, scheduling. The > - * &drm_i915_private.context_hw_ida is used to assign a unqiue > - * id for the lifetime of the context. > - * > - * @hw_id_pin_count: - number of times this context had been pinned > - * for use (should be, at most, once per engine). > - * > - * @hw_id_link: - all contexts with an assigned id are tracked > - * for possible repossession. > - */ > - unsigned int hw_id; > - atomic_t hw_id_pin_count; > - struct list_head hw_id_link; > - > struct mutex mutex; > > struct i915_sched_attr sched; > diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c > index db7856f0f31e..a7b6da29f3df 100644 > --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c > +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c > @@ -524,9 +524,9 @@ static int igt_ctx_exec(void *arg) > > err = gpu_fill(obj, ctx, engine, dw); > if (err) { > - pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n", > + pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) [full-ppgtt? %s], err=%d\n", > ndwords, dw, max_dwords(obj), > - engine->name, ctx->hw_id, > + engine->name, > yesno(!!ctx->vm), err); > goto out_unlock; > } > @@ -643,9 +643,9 @@ static int igt_shared_ctx_exec(void *arg) > > err = gpu_fill(obj, ctx, engine, dw); > if (err) { > - pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n", > + pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) [full-ppgtt? %s], err=%d\n", > ndwords, dw, max_dwords(obj), > - engine->name, ctx->hw_id, > + engine->name, > yesno(!!ctx->vm), err); > kernel_context_close(ctx); > goto out_test; > @@ -1219,10 +1219,9 @@ static int igt_ctx_readonly(void *arg) > > err = gpu_fill(obj, ctx, engine, dw); > if (err) { > - pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n", > + pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) [full-ppgtt? %s], err=%d\n", > ndwords, dw, max_dwords(obj), > - engine->name, ctx->hw_id, > - yesno(!!ctx->vm), err); > + engine->name, yesno(!!ctx->vm), err); > goto out_unlock; > } > > diff --git a/drivers/gpu/drm/i915/gem/selftests/mock_context.c b/drivers/gpu/drm/i915/gem/selftests/mock_context.c > index be8974ccff24..0104f16b1327 100644 > --- a/drivers/gpu/drm/i915/gem/selftests/mock_context.c > +++ b/drivers/gpu/drm/i915/gem/selftests/mock_context.c > @@ -13,7 +13,6 @@ mock_context(struct drm_i915_private *i915, > { > struct i915_gem_context *ctx; > struct i915_gem_engines *e; > - int ret; > > ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); > if (!ctx) > @@ -30,13 +29,8 @@ mock_context(struct drm_i915_private *i915, > RCU_INIT_POINTER(ctx->engines, e); > > INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL); > - INIT_LIST_HEAD(&ctx->hw_id_link); > mutex_init(&ctx->mutex); > > - ret = i915_gem_context_pin_hw_id(ctx); > - if (ret < 0) > - goto err_engines; > - > if (name) { > struct i915_ppgtt *ppgtt; > > @@ -54,8 +48,6 @@ mock_context(struct drm_i915_private *i915, > > return ctx; > > -err_engines: > - free_engines(rcu_access_pointer(ctx->engines)); > err_free: > kfree(ctx); > return NULL; > diff --git a/drivers/gpu/drm/i915/gt/intel_context_types.h b/drivers/gpu/drm/i915/gt/intel_context_types.h > index c00419e38a77..36394d4061e4 100644 > --- a/drivers/gpu/drm/i915/gt/intel_context_types.h > +++ b/drivers/gpu/drm/i915/gt/intel_context_types.h > @@ -52,6 +52,7 @@ struct intel_context { > > u32 *lrc_reg_state; > u64 lrc_desc; > + u32 hw_tag; > > unsigned int active_count; /* protected by timeline->mutex */ > > diff --git a/drivers/gpu/drm/i915/gt/intel_engine_types.h b/drivers/gpu/drm/i915/gt/intel_engine_types.h > index 1da8d2f34c56..121abe5b08e7 100644 > --- a/drivers/gpu/drm/i915/gt/intel_engine_types.h > +++ b/drivers/gpu/drm/i915/gt/intel_engine_types.h > @@ -270,10 +270,13 @@ struct intel_engine_cs { > > u8 class; > u8 instance; > + > + u32 uabi_capabilities; > u32 context_size; > u32 mmio_base; > > - u32 uabi_capabilities; > + unsigned int hw_tag; > +#define NUM_HW_TAG (256) > > struct rb_node uabi_node; > > diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c > index 18d9ddc5cd58..ae15e0dd98ac 100644 > --- a/drivers/gpu/drm/i915/gt/intel_lrc.c > +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c > @@ -412,9 +412,6 @@ lrc_descriptor(struct intel_context *ce, struct intel_engine_cs *engine) > struct i915_gem_context *ctx = ce->gem_context; > u64 desc; > > - BUILD_BUG_ON(MAX_CONTEXT_HW_ID > (BIT(GEN8_CTX_ID_WIDTH))); > - BUILD_BUG_ON(GEN11_MAX_CONTEXT_HW_ID > (BIT(GEN11_SW_CTX_ID_WIDTH))); > - > desc = ctx->desc_template; /* bits 0-11 */ > GEM_BUG_ON(desc & GENMASK_ULL(63, 12)); > > @@ -428,20 +425,11 @@ lrc_descriptor(struct intel_context *ce, struct intel_engine_cs *engine) > * anything below. > */ > if (INTEL_GEN(engine->i915) >= 11) { > - GEM_BUG_ON(ctx->hw_id >= BIT(GEN11_SW_CTX_ID_WIDTH)); > - desc |= (u64)ctx->hw_id << GEN11_SW_CTX_ID_SHIFT; > - /* bits 37-47 */ > - > desc |= (u64)engine->instance << GEN11_ENGINE_INSTANCE_SHIFT; > /* bits 48-53 */ > > - /* TODO: decide what to do with SW counter (bits 55-60) */ > - > desc |= (u64)engine->class << GEN11_ENGINE_CLASS_SHIFT; > /* bits 61-63 */ > - } else { > - GEM_BUG_ON(ctx->hw_id >= BIT(GEN8_CTX_ID_WIDTH)); > - desc |= (u64)ctx->hw_id << GEN8_CTX_ID_SHIFT; /* bits 32-52 */ > } > > return desc; > @@ -537,6 +525,15 @@ execlists_schedule_in(struct i915_request *rq, int idx) > intel_context_get(ce); > ce->inflight = rq->engine; > > + if (ce->hw_tag) { > + ce->lrc_desc |= (u64)ce->hw_tag << 32; > + } else { > + ce->lrc_desc &= ~GENMASK_ULL(47, 37); > + ce->lrc_desc |= > + (u64)(rq->engine->hw_tag++ % NUM_HW_TAG) << > + GEN11_SW_CTX_ID_SHIFT; > + } > + > execlists_context_status_change(rq, INTEL_CONTEXT_SCHEDULE_IN); > intel_engine_context_in(ce->inflight); > } > @@ -1551,7 +1548,6 @@ static void execlists_context_destroy(struct kref *kref) > > static void execlists_context_unpin(struct intel_context *ce) > { > - i915_gem_context_unpin_hw_id(ce->gem_context); > i915_gem_object_unpin_map(ce->state->obj); > intel_ring_reset(ce->ring, ce->ring->tail); > } > @@ -1606,18 +1602,12 @@ __execlists_context_pin(struct intel_context *ce, > goto unpin_active; > } > > - ret = i915_gem_context_pin_hw_id(ce->gem_context); > - if (ret) > - goto unpin_map; > - > ce->lrc_desc = lrc_descriptor(ce, engine); > ce->lrc_reg_state = vaddr + LRC_STATE_PN * PAGE_SIZE; > __execlists_update_reg_state(ce, engine); > > return 0; > > -unpin_map: > - i915_gem_object_unpin_map(ce->state->obj); > unpin_active: > intel_context_active_release(ce); > err: > diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c > index 144301b778df..941d0f08b047 100644 > --- a/drivers/gpu/drm/i915/gvt/kvmgt.c > +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c > @@ -1566,27 +1566,10 @@ vgpu_id_show(struct device *dev, struct device_attribute *attr, > return sprintf(buf, "\n"); > } > > -static ssize_t > -hw_id_show(struct device *dev, struct device_attribute *attr, > - char *buf) > -{ > - struct mdev_device *mdev = mdev_from_dev(dev); > - > - if (mdev) { > - struct intel_vgpu *vgpu = (struct intel_vgpu *) > - mdev_get_drvdata(mdev); > - return sprintf(buf, "%u\n", > - vgpu->submission.shadow[0]->gem_context->hw_id); > - } > - return sprintf(buf, "\n"); > -} > - > static DEVICE_ATTR_RO(vgpu_id); > -static DEVICE_ATTR_RO(hw_id); > > static struct attribute *intel_vgpu_attrs[] = { > &dev_attr_vgpu_id.attr, > - &dev_attr_hw_id.attr, > NULL > }; > > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c > index b6b80963f992..b7ec9f3cdc2c 100644 > --- a/drivers/gpu/drm/i915/i915_debugfs.c > +++ b/drivers/gpu/drm/i915/i915_debugfs.c > @@ -1581,9 +1581,6 @@ static int i915_context_status(struct seq_file *m, void *unused) > struct intel_context *ce; > > seq_puts(m, "HW context "); > - if (!list_empty(&ctx->hw_id_link)) > - seq_printf(m, "%x [pin %u]", ctx->hw_id, > - atomic_read(&ctx->hw_id_pin_count)); > if (ctx->pid) { > struct task_struct *task; > > diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c > index 026ee1f5536d..75671faf263d 100644 > --- a/drivers/gpu/drm/i915/i915_gpu_error.c > +++ b/drivers/gpu/drm/i915/i915_gpu_error.c > @@ -506,9 +506,9 @@ static void error_print_context(struct drm_i915_error_state_buf *m, > const char *header, > const struct drm_i915_error_context *ctx) > { > - err_printf(m, "%s%s[%d] hw_id %d, prio %d, guilty %d active %d\n", > - header, ctx->comm, ctx->pid, ctx->hw_id, > - ctx->sched_attr.priority, ctx->guilty, ctx->active); > + err_printf(m, "%s%s[%d] prio %d, guilty %d active %d\n", > + header, ctx->comm, ctx->pid, ctx->sched_attr.priority, > + ctx->guilty, ctx->active); > } > > static void error_print_engine(struct drm_i915_error_state_buf *m, > @@ -1310,7 +1310,6 @@ static void record_context(struct drm_i915_error_context *e, > rcu_read_unlock(); > } > > - e->hw_id = ctx->hw_id; > e->sched_attr = ctx->sched; > e->guilty = atomic_read(&ctx->guilty_count); > e->active = atomic_read(&ctx->active_count); > diff --git a/drivers/gpu/drm/i915/i915_gpu_error.h b/drivers/gpu/drm/i915/i915_gpu_error.h > index a24c35107d16..1d951eae7e2e 100644 > --- a/drivers/gpu/drm/i915/i915_gpu_error.h > +++ b/drivers/gpu/drm/i915/i915_gpu_error.h > @@ -117,7 +117,6 @@ struct i915_gpu_state { > struct drm_i915_error_context { > char comm[TASK_COMM_LEN]; > pid_t pid; > - u32 hw_id; > int active; > int guilty; > struct i915_sched_attr sched_attr; > diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c > index 58a71efc25db..df02e0fe0701 100644 > --- a/drivers/gpu/drm/i915/i915_perf.c > +++ b/drivers/gpu/drm/i915/i915_perf.c > @@ -1293,19 +1293,14 @@ static int oa_get_render_ctx_id(struct i915_perf_stream *stream) > i915->perf.oa.specific_ctx_id_mask = > (1U << GEN8_CTX_ID_WIDTH) - 1; > i915->perf.oa.specific_ctx_id = > - upper_32_bits(ce->lrc_desc); > - i915->perf.oa.specific_ctx_id &= > i915->perf.oa.specific_ctx_id_mask; > } > break; > > case 11: { > i915->perf.oa.specific_ctx_id_mask = > - ((1U << GEN11_SW_CTX_ID_WIDTH) - 1) << (GEN11_SW_CTX_ID_SHIFT - 32) | > - ((1U << GEN11_ENGINE_INSTANCE_WIDTH) - 1) << (GEN11_ENGINE_INSTANCE_SHIFT - 32) | > - ((1 << GEN11_ENGINE_CLASS_WIDTH) - 1) << (GEN11_ENGINE_CLASS_SHIFT - 32); > - i915->perf.oa.specific_ctx_id = upper_32_bits(ce->lrc_desc); > - i915->perf.oa.specific_ctx_id &= > + ((1U << GEN11_SW_CTX_ID_WIDTH) - 1) << (GEN11_SW_CTX_ID_SHIFT - 32); > + i915->perf.oa.specific_ctx_id = > i915->perf.oa.specific_ctx_id_mask; > break; > } > @@ -1314,6 +1309,8 @@ static int oa_get_render_ctx_id(struct i915_perf_stream *stream) > MISSING_CASE(INTEL_GEN(i915)); > } > > + ce->hw_tag = i915->perf.oa.specific_ctx_id_mask; > + > DRM_DEBUG_DRIVER("filtering on ctx_id=0x%x ctx_id_mask=0x%x\n", > i915->perf.oa.specific_ctx_id, > i915->perf.oa.specific_ctx_id_mask); > @@ -1330,18 +1327,19 @@ static int oa_get_render_ctx_id(struct i915_perf_stream *stream) > */ > static void oa_put_render_ctx_id(struct i915_perf_stream *stream) > { > - struct drm_i915_private *dev_priv = stream->dev_priv; > + struct drm_i915_private *i915 = stream->dev_priv; > struct intel_context *ce; > > - dev_priv->perf.oa.specific_ctx_id = INVALID_CTX_ID; > - dev_priv->perf.oa.specific_ctx_id_mask = 0; > - > - ce = fetch_and_zero(&dev_priv->perf.oa.pinned_ctx); > - if (ce) { > - mutex_lock(&dev_priv->drm.struct_mutex); > + ce = fetch_and_zero(&i915->perf.oa.pinned_ctx); > + if (ce) { > + mutex_lock(&i915->drm.struct_mutex); > + ce->hw_tag = 0; > intel_context_unpin(ce); > - mutex_unlock(&dev_priv->drm.struct_mutex); > + mutex_unlock(&i915->drm.struct_mutex); > } > + > + i915->perf.oa.specific_ctx_id = INVALID_CTX_ID; > + i915->perf.oa.specific_ctx_id_mask = 0; > } > > static void > diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h > index da18b8d6b80c..fbf6dd0eb5c9 100644 > --- a/drivers/gpu/drm/i915/i915_trace.h > +++ b/drivers/gpu/drm/i915/i915_trace.h > @@ -665,7 +665,6 @@ TRACE_EVENT(i915_request_queue, > > TP_STRUCT__entry( > __field(u32, dev) > - __field(u32, hw_id) > __field(u64, ctx) > __field(u16, class) > __field(u16, instance) > @@ -675,7 +674,6 @@ TRACE_EVENT(i915_request_queue, > > TP_fast_assign( > __entry->dev = rq->i915->drm.primary->index; > - __entry->hw_id = rq->gem_context->hw_id; > __entry->class = rq->engine->uabi_class; > __entry->instance = rq->engine->instance; > __entry->ctx = rq->fence.context; > @@ -683,10 +681,9 @@ TRACE_EVENT(i915_request_queue, > __entry->flags = flags; > ), > > - TP_printk("dev=%u, engine=%u:%u, hw_id=%u, ctx=%llu, seqno=%u, flags=0x%x", > + TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, flags=0x%x", > __entry->dev, __entry->class, __entry->instance, > - __entry->hw_id, __entry->ctx, __entry->seqno, > - __entry->flags) > + __entry->ctx, __entry->seqno, __entry->flags) > ); > > DECLARE_EVENT_CLASS(i915_request, > @@ -695,7 +692,6 @@ DECLARE_EVENT_CLASS(i915_request, > > TP_STRUCT__entry( > __field(u32, dev) > - __field(u32, hw_id) > __field(u64, ctx) > __field(u16, class) > __field(u16, instance) > @@ -704,16 +700,15 @@ DECLARE_EVENT_CLASS(i915_request, > > TP_fast_assign( > __entry->dev = rq->i915->drm.primary->index; > - __entry->hw_id = rq->gem_context->hw_id; > __entry->class = rq->engine->uabi_class; > __entry->instance = rq->engine->instance; > __entry->ctx = rq->fence.context; > __entry->seqno = rq->fence.seqno; > ), > > - TP_printk("dev=%u, engine=%u:%u, hw_id=%u, ctx=%llu, seqno=%u", > + TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u", > __entry->dev, __entry->class, __entry->instance, > - __entry->hw_id, __entry->ctx, __entry->seqno) > + __entry->ctx, __entry->seqno) > ); > > DEFINE_EVENT(i915_request, i915_request_add, > @@ -738,7 +733,6 @@ TRACE_EVENT(i915_request_in, > > TP_STRUCT__entry( > __field(u32, dev) > - __field(u32, hw_id) > __field(u64, ctx) > __field(u16, class) > __field(u16, instance) > @@ -749,7 +743,6 @@ TRACE_EVENT(i915_request_in, > > TP_fast_assign( > __entry->dev = rq->i915->drm.primary->index; > - __entry->hw_id = rq->gem_context->hw_id; > __entry->class = rq->engine->uabi_class; > __entry->instance = rq->engine->instance; > __entry->ctx = rq->fence.context; > @@ -758,9 +751,9 @@ TRACE_EVENT(i915_request_in, > __entry->port = port; > ), > > - TP_printk("dev=%u, engine=%u:%u, hw_id=%u, ctx=%llu, seqno=%u, prio=%u, port=%u", > + TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, prio=%u, port=%u", > __entry->dev, __entry->class, __entry->instance, > - __entry->hw_id, __entry->ctx, __entry->seqno, > + __entry->ctx, __entry->seqno, > __entry->prio, __entry->port) > ); > > @@ -770,7 +763,6 @@ TRACE_EVENT(i915_request_out, > > TP_STRUCT__entry( > __field(u32, dev) > - __field(u32, hw_id) > __field(u64, ctx) > __field(u16, class) > __field(u16, instance) > @@ -780,7 +772,6 @@ TRACE_EVENT(i915_request_out, > > TP_fast_assign( > __entry->dev = rq->i915->drm.primary->index; > - __entry->hw_id = rq->gem_context->hw_id; > __entry->class = rq->engine->uabi_class; > __entry->instance = rq->engine->instance; > __entry->ctx = rq->fence.context; > @@ -788,10 +779,9 @@ TRACE_EVENT(i915_request_out, > __entry->completed = i915_request_completed(rq); > ), > > - TP_printk("dev=%u, engine=%u:%u, hw_id=%u, ctx=%llu, seqno=%u, completed?=%u", > + TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, completed?=%u", > __entry->dev, __entry->class, __entry->instance, > - __entry->hw_id, __entry->ctx, __entry->seqno, > - __entry->completed) > + __entry->ctx, __entry->seqno, __entry->completed) > ); > > #else > @@ -829,7 +819,6 @@ TRACE_EVENT(i915_request_wait_begin, > > TP_STRUCT__entry( > __field(u32, dev) > - __field(u32, hw_id) > __field(u64, ctx) > __field(u16, class) > __field(u16, instance) > @@ -845,7 +834,6 @@ TRACE_EVENT(i915_request_wait_begin, > */ > TP_fast_assign( > __entry->dev = rq->i915->drm.primary->index; > - __entry->hw_id = rq->gem_context->hw_id; > __entry->class = rq->engine->uabi_class; > __entry->instance = rq->engine->instance; > __entry->ctx = rq->fence.context; > @@ -853,9 +841,9 @@ TRACE_EVENT(i915_request_wait_begin, > __entry->flags = flags; > ), > > - TP_printk("dev=%u, engine=%u:%u, hw_id=%u, ctx=%llu, seqno=%u, flags=0x%x", > + TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, flags=0x%x", > __entry->dev, __entry->class, __entry->instance, > - __entry->hw_id, __entry->ctx, __entry->seqno, > + __entry->ctx, __entry->seqno, > __entry->flags) > ); > > @@ -958,19 +946,17 @@ DECLARE_EVENT_CLASS(i915_context, > TP_STRUCT__entry( > __field(u32, dev) > __field(struct i915_gem_context *, ctx) > - __field(u32, hw_id) > __field(struct i915_address_space *, vm) > ), > > TP_fast_assign( > __entry->dev = ctx->i915->drm.primary->index; > __entry->ctx = ctx; > - __entry->hw_id = ctx->hw_id; > __entry->vm = ctx->vm; > ), > > - TP_printk("dev=%u, ctx=%p, ctx_vm=%p, hw_id=%u", > - __entry->dev, __entry->ctx, __entry->vm, __entry->hw_id) > + TP_printk("dev=%u, ctx=%p, ctx_vm=%p", > + __entry->dev, __entry->ctx, __entry->vm) > ) > > DEFINE_EVENT(i915_context, i915_context_create, > diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c > index b6449d0a8c17..07ab822b224f 100644 > --- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c > +++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c > @@ -475,8 +475,8 @@ static int igt_evict_contexts(void *arg) > if (IS_ERR(rq)) { > /* When full, fail_if_busy will trigger EBUSY */ > if (PTR_ERR(rq) != -EBUSY) { > - pr_err("Unexpected error from request alloc (ctx hw id %u, on %s): %d\n", > - ctx->hw_id, engine->name, > + pr_err("Unexpected error from request alloc (on %s): %d\n", > + engine->name, > (int)PTR_ERR(rq)); > err = PTR_ERR(rq); > } > diff --git a/drivers/gpu/drm/i915/selftests/i915_vma.c b/drivers/gpu/drm/i915/selftests/i915_vma.c > index fbc79b14823a..85008f4fc78c 100644 > --- a/drivers/gpu/drm/i915/selftests/i915_vma.c > +++ b/drivers/gpu/drm/i915/selftests/i915_vma.c > @@ -170,7 +170,7 @@ static int igt_vma_create(void *arg) > } > > nc = 0; > - for_each_prime_number(num_ctx, MAX_CONTEXT_HW_ID) { > + for_each_prime_number(num_ctx, NUM_HW_TAG) { > for (; nc < num_ctx; nc++) { > ctx = mock_context(i915, "mock"); > if (!ctx) > -- > 2.22.0 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx