drm/i915: Group all the global context information together
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 20 Jun 2017 11:05:45 +0000 (12:05 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 20 Jun 2017 16:13:40 +0000 (17:13 +0100)
Create a substruct to hold all the global context state under
drm_i915_private.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170620110547.15947-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_context.c
drivers/gpu/drm/i915/i915_gem_context.h
drivers/gpu/drm/i915/i915_perf.c
drivers/gpu/drm/i915/i915_sysfs.c
drivers/gpu/drm/i915/intel_lrc.c
drivers/gpu/drm/i915/selftests/mock_context.c
drivers/gpu/drm/i915/selftests/mock_gem_device.c

index 4577b0a..6103d00 100644 (file)
@@ -1966,7 +1966,7 @@ static int i915_context_status(struct seq_file *m, void *unused)
        if (ret)
                return ret;
 
-       list_for_each_entry(ctx, &dev_priv->context_list, link) {
+       list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
                seq_printf(m, "HW context %u ", ctx->hw_id);
                if (ctx->pid) {
                        struct task_struct *task;
@@ -2072,7 +2072,7 @@ static int i915_dump_lrc(struct seq_file *m, void *unused)
        if (ret)
                return ret;
 
-       list_for_each_entry(ctx, &dev_priv->context_list, link)
+       list_for_each_entry(ctx, &dev_priv->contexts.list, link)
                for_each_engine(engine, dev_priv, id)
                        i915_dump_lrc_obj(m, ctx, engine);
 
index ee2325b..36585b6 100644 (file)
@@ -588,13 +588,13 @@ static void i915_gem_fini(struct drm_i915_private *dev_priv)
        mutex_lock(&dev_priv->drm.struct_mutex);
        intel_uc_fini_hw(dev_priv);
        i915_gem_cleanup_engines(dev_priv);
-       i915_gem_context_fini(dev_priv);
+       i915_gem_contexts_fini(dev_priv);
        i915_gem_cleanup_userptr(dev_priv);
        mutex_unlock(&dev_priv->drm.struct_mutex);
 
        i915_gem_drain_freed_objects(dev_priv);
 
-       WARN_ON(!list_empty(&dev_priv->context_list));
+       WARN_ON(!list_empty(&dev_priv->contexts.list));
 }
 
 static int i915_load_modeset_init(struct drm_device *dev)
@@ -1425,9 +1425,10 @@ static void i915_driver_release(struct drm_device *dev)
 
 static int i915_driver_open(struct drm_device *dev, struct drm_file *file)
 {
+       struct drm_i915_private *i915 = to_i915(dev);
        int ret;
 
-       ret = i915_gem_open(dev, file);
+       ret = i915_gem_open(i915, file);
        if (ret)
                return ret;
 
@@ -1457,7 +1458,7 @@ static void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
        struct drm_i915_file_private *file_priv = file->driver_priv;
 
        mutex_lock(&dev->struct_mutex);
-       i915_gem_context_close(dev, file);
+       i915_gem_context_close(file);
        i915_gem_release(dev, file);
        mutex_unlock(&dev->struct_mutex);
 
index e2d2b78..fb627df 100644 (file)
@@ -2235,13 +2235,6 @@ struct drm_i915_private {
        DECLARE_HASHTABLE(mm_structs, 7);
        struct mutex mm_lock;
 
-       /* The hw wants to have a stable context identifier for the lifetime
-        * of the context (for OA, PASID, faults, etc). This is limited
-        * in execlists to 21 bits.
-        */
-       struct ida context_hw_ida;
-#define MAX_CONTEXT_HW_ID (1<<21) /* exclusive */
-
        /* Kernel Modesetting */
 
        struct intel_crtc *plane_to_crtc_mapping[I915_MAX_PIPES];
@@ -2320,7 +2313,16 @@ struct drm_i915_private {
         */
        struct mutex av_mutex;
 
-       struct list_head context_list;
+       struct {
+               struct list_head list;
+
+               /* The hw wants to have a stable context identifier for the
+                * lifetime of the context (for OA, PASID, faults, etc).
+                * This is limited in execlists to 21 bits.
+                */
+               struct ida hw_ida;
+#define MAX_CONTEXT_HW_ID (1<<21) /* exclusive */
+       } contexts;
 
        u32 fdi_rx_config;
 
@@ -3498,7 +3500,7 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
 void i915_gem_object_unpin_from_display_plane(struct i915_vma *vma);
 int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj,
                                int align);
-int i915_gem_open(struct drm_device *dev, struct drm_file *file);
+int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file);
 void i915_gem_release(struct drm_device *dev, struct drm_file *file);
 
 int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
index 7dcac3b..c221301 100644 (file)
@@ -3098,7 +3098,7 @@ void i915_gem_set_wedged(struct drm_i915_private *dev_priv)
 
        stop_machine(__i915_gem_set_wedged_BKL, dev_priv, NULL);
 
-       i915_gem_context_lost(dev_priv);
+       i915_gem_contexts_lost(dev_priv);
 
        mod_delayed_work(dev_priv->wq, &dev_priv->gt.idle_work, 0);
 }
@@ -4564,7 +4564,7 @@ int i915_gem_suspend(struct drm_i915_private *dev_priv)
                goto err_unlock;
 
        assert_kernel_context_is_current(dev_priv);
-       i915_gem_context_lost(dev_priv);
+       i915_gem_contexts_lost(dev_priv);
        mutex_unlock(&dev->struct_mutex);
 
        intel_guc_suspend(dev_priv);
@@ -4811,7 +4811,7 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
        if (ret)
                goto out_unlock;
 
-       ret = i915_gem_context_init(dev_priv);
+       ret = i915_gem_contexts_init(dev_priv);
        if (ret)
                goto out_unlock;
 
@@ -4921,7 +4921,6 @@ i915_gem_load_init(struct drm_i915_private *dev_priv)
        if (err)
                goto err_priorities;
 
-       INIT_LIST_HEAD(&dev_priv->context_list);
        INIT_WORK(&dev_priv->mm.free_work, __i915_gem_free_work);
        init_llist_head(&dev_priv->mm.free_list);
        INIT_LIST_HEAD(&dev_priv->mm.unbound_list);
@@ -5045,7 +5044,7 @@ void i915_gem_release(struct drm_device *dev, struct drm_file *file)
        }
 }
 
-int i915_gem_open(struct drm_device *dev, struct drm_file *file)
+int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file)
 {
        struct drm_i915_file_private *file_priv;
        int ret;
@@ -5057,7 +5056,7 @@ int i915_gem_open(struct drm_device *dev, struct drm_file *file)
                return -ENOMEM;
 
        file->driver_priv = file_priv;
-       file_priv->dev_priv = to_i915(dev);
+       file_priv->dev_priv = i915;
        file_priv->file = file;
        INIT_LIST_HEAD(&file_priv->rps.link);
 
@@ -5066,7 +5065,7 @@ int i915_gem_open(struct drm_device *dev, struct drm_file *file)
 
        file_priv->bsd_engine = -1;
 
-       ret = i915_gem_context_open(dev, file);
+       ret = i915_gem_context_open(i915, file);
        if (ret)
                kfree(file_priv);
 
index 39ed58a..7a6a667 100644 (file)
@@ -188,7 +188,7 @@ void i915_gem_context_free(struct kref *ctx_ref)
 
        list_del(&ctx->link);
 
-       ida_simple_remove(&ctx->i915->context_hw_ida, ctx->hw_id);
+       ida_simple_remove(&ctx->i915->contexts.hw_ida, ctx->hw_id);
        kfree(ctx);
 }
 
@@ -205,7 +205,7 @@ static int assign_hw_id(struct drm_i915_private *dev_priv, unsigned *out)
 {
        int ret;
 
-       ret = ida_simple_get(&dev_priv->context_hw_ida,
+       ret = ida_simple_get(&dev_priv->contexts.hw_ida,
                             0, MAX_CONTEXT_HW_ID, GFP_KERNEL);
        if (ret < 0) {
                /* Contexts are only released when no longer active.
@@ -213,7 +213,7 @@ static int assign_hw_id(struct drm_i915_private *dev_priv, unsigned *out)
                 * stale contexts and try again.
                 */
                i915_gem_retire_requests(dev_priv);
-               ret = ida_simple_get(&dev_priv->context_hw_ida,
+               ret = ida_simple_get(&dev_priv->contexts.hw_ida,
                                     0, MAX_CONTEXT_HW_ID, GFP_KERNEL);
                if (ret < 0)
                        return ret;
@@ -265,7 +265,7 @@ __create_hw_context(struct drm_i915_private *dev_priv,
        }
 
        kref_init(&ctx->ref);
-       list_add_tail(&ctx->link, &dev_priv->context_list);
+       list_add_tail(&ctx->link, &dev_priv->contexts.list);
        ctx->i915 = dev_priv;
        ctx->priority = I915_PRIORITY_NORMAL;
 
@@ -418,7 +418,7 @@ out:
        return ctx;
 }
 
-int i915_gem_context_init(struct drm_i915_private *dev_priv)
+int i915_gem_contexts_init(struct drm_i915_private *dev_priv)
 {
        struct i915_gem_context *ctx;
 
@@ -427,6 +427,8 @@ int i915_gem_context_init(struct drm_i915_private *dev_priv)
        if (WARN_ON(dev_priv->kernel_context))
                return 0;
 
+       INIT_LIST_HEAD(&dev_priv->contexts.list);
+
        if (intel_vgpu_active(dev_priv) &&
            HAS_LOGICAL_RING_CONTEXTS(dev_priv)) {
                if (!i915.enable_execlists) {
@@ -437,7 +439,7 @@ int i915_gem_context_init(struct drm_i915_private *dev_priv)
 
        /* Using the simple ida interface, the max is limited by sizeof(int) */
        BUILD_BUG_ON(MAX_CONTEXT_HW_ID > INT_MAX);
-       ida_init(&dev_priv->context_hw_ida);
+       ida_init(&dev_priv->contexts.hw_ida);
 
        ctx = i915_gem_create_context(dev_priv, NULL);
        if (IS_ERR(ctx)) {
@@ -463,7 +465,7 @@ int i915_gem_context_init(struct drm_i915_private *dev_priv)
        return 0;
 }
 
-void i915_gem_context_lost(struct drm_i915_private *dev_priv)
+void i915_gem_contexts_lost(struct drm_i915_private *dev_priv)
 {
        struct intel_engine_cs *engine;
        enum intel_engine_id id;
@@ -484,7 +486,7 @@ void i915_gem_context_lost(struct drm_i915_private *dev_priv)
        if (!i915.enable_execlists) {
                struct i915_gem_context *ctx;
 
-               list_for_each_entry(ctx, &dev_priv->context_list, link) {
+               list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
                        if (!i915_gem_context_is_default(ctx))
                                continue;
 
@@ -503,7 +505,7 @@ void i915_gem_context_lost(struct drm_i915_private *dev_priv)
        }
 }
 
-void i915_gem_context_fini(struct drm_i915_private *dev_priv)
+void i915_gem_contexts_fini(struct drm_i915_private *dev_priv)
 {
        struct i915_gem_context *dctx = dev_priv->kernel_context;
 
@@ -514,7 +516,7 @@ void i915_gem_context_fini(struct drm_i915_private *dev_priv)
        context_close(dctx);
        dev_priv->kernel_context = NULL;
 
-       ida_destroy(&dev_priv->context_hw_ida);
+       ida_destroy(&dev_priv->contexts.hw_ida);
 }
 
 static int context_idr_cleanup(int id, void *p, void *data)
@@ -525,16 +527,17 @@ static int context_idr_cleanup(int id, void *p, void *data)
        return 0;
 }
 
-int i915_gem_context_open(struct drm_device *dev, struct drm_file *file)
+int i915_gem_context_open(struct drm_i915_private *i915,
+                         struct drm_file *file)
 {
        struct drm_i915_file_private *file_priv = file->driver_priv;
        struct i915_gem_context *ctx;
 
        idr_init(&file_priv->context_idr);
 
-       mutex_lock(&dev->struct_mutex);
-       ctx = i915_gem_create_context(to_i915(dev), file_priv);
-       mutex_unlock(&dev->struct_mutex);
+       mutex_lock(&i915->drm.struct_mutex);
+       ctx = i915_gem_create_context(i915, file_priv);
+       mutex_unlock(&i915->drm.struct_mutex);
 
        GEM_BUG_ON(i915_gem_context_is_kernel(ctx));
 
@@ -546,11 +549,11 @@ int i915_gem_context_open(struct drm_device *dev, struct drm_file *file)
        return 0;
 }
 
-void i915_gem_context_close(struct drm_device *dev, struct drm_file *file)
+void i915_gem_context_close(struct drm_file *file)
 {
        struct drm_i915_file_private *file_priv = file->driver_priv;
 
-       lockdep_assert_held(&dev->struct_mutex);
+       lockdep_assert_held(&file_priv->dev_priv->drm.struct_mutex);
 
        idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL);
        idr_destroy(&file_priv->context_idr);
index 82c99ba..808f878 100644 (file)
@@ -273,13 +273,17 @@ static inline bool i915_gem_context_is_kernel(struct i915_gem_context *ctx)
 }
 
 /* i915_gem_context.c */
-int __must_check i915_gem_context_init(struct drm_i915_private *dev_priv);
-void i915_gem_context_lost(struct drm_i915_private *dev_priv);
-void i915_gem_context_fini(struct drm_i915_private *dev_priv);
-int i915_gem_context_open(struct drm_device *dev, struct drm_file *file);
-void i915_gem_context_close(struct drm_device *dev, struct drm_file *file);
+int __must_check i915_gem_contexts_init(struct drm_i915_private *dev_priv);
+void i915_gem_contexts_lost(struct drm_i915_private *dev_priv);
+void i915_gem_contexts_fini(struct drm_i915_private *dev_priv);
+
+int i915_gem_context_open(struct drm_i915_private *i915,
+                         struct drm_file *file);
+void i915_gem_context_close(struct drm_file *file);
+
 int i915_switch_context(struct drm_i915_gem_request *req);
 int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv);
+
 void i915_gem_context_free(struct kref *ctx_ref);
 struct i915_gem_context *
 i915_gem_context_create_gvt(struct drm_device *dev);
index 38c4440..d1771e8 100644 (file)
@@ -1746,7 +1746,7 @@ static int gen8_configure_all_contexts(struct drm_i915_private *dev_priv,
                goto out;
 
        /* Update all contexts now that we've stalled the submission. */
-       list_for_each_entry(ctx, &dev_priv->context_list, link) {
+       list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
                struct intel_context *ce = &ctx->engine[RCS];
                u32 *regs;
 
index 1eef3fa..3a48106 100644 (file)
@@ -209,7 +209,7 @@ i915_l3_write(struct file *filp, struct kobject *kobj,
        memcpy(*remap_info + (offset/4), buf, count);
 
        /* NB: We defer the remapping until we switch to the context */
-       list_for_each_entry(ctx, &dev_priv->context_list, link)
+       list_for_each_entry(ctx, &dev_priv->contexts.list, link)
                ctx->remap_slice |= (1<<slice);
 
        ret = count;
index 7404cf2..699868d 100644 (file)
@@ -2071,7 +2071,7 @@ void intel_lr_context_resume(struct drm_i915_private *dev_priv)
         * So to avoid that we reset the context images upon resume. For
         * simplicity, we just zero everything out.
         */
-       list_for_each_entry(ctx, &dev_priv->context_list, link) {
+       list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
                for_each_engine(engine, dev_priv, id) {
                        struct intel_context *ce = &ctx->engine[engine->id];
                        u32 *reg;
index f8b9cc2..243325b 100644 (file)
@@ -48,7 +48,7 @@ mock_context(struct drm_i915_private *i915,
        if (!ctx->vma_lut.ht)
                goto err_free;
 
-       ret = ida_simple_get(&i915->context_hw_ida,
+       ret = ida_simple_get(&i915->contexts.hw_ida,
                             0, MAX_CONTEXT_HW_ID, GFP_KERNEL);
        if (ret < 0)
                goto err_vma_ht;
index 627e2aa..0ddb70a 100644 (file)
@@ -61,7 +61,7 @@ static void mock_device_release(struct drm_device *dev)
        mutex_lock(&i915->drm.struct_mutex);
        for_each_engine(engine, i915, id)
                mock_engine_free(engine);
-       i915_gem_context_fini(i915);
+       i915_gem_contexts_fini(i915);
        mutex_unlock(&i915->drm.struct_mutex);
 
        drain_workqueue(i915->wq);
@@ -160,7 +160,7 @@ struct drm_i915_private *mock_gem_device(void)
        INIT_LIST_HEAD(&i915->mm.unbound_list);
        INIT_LIST_HEAD(&i915->mm.bound_list);
 
-       ida_init(&i915->context_hw_ida);
+       ida_init(&i915->contexts.hw_ida);
 
        INIT_DELAYED_WORK(&i915->gt.retire_work, mock_retire_work_handler);
        INIT_DELAYED_WORK(&i915->gt.idle_work, mock_idle_work_handler);