drm/i915: Register debugfs interface last
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Jun 2016 13:00:17 +0000 (14:00 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Jun 2016 13:43:36 +0000 (14:43 +0100)
Currently debugfs files are created before the driver is even loads.
This gives the opportunity for userspace to open that interface and poke
around before the backing data structures are initialised - with the
possibility of oopsing or worse.

Move the creation of the debugfs files to our registration phase, where
we announce our presence to the world when we are ready, i.e the
sequence changes from

drm_dev_register()
 -> drm_minor_register()
  -> drm_debugfs_init()
   -> i915_debugfs_init()
 -> i915_driver_load()

to

drm_dev_register()
 -> drm_minor_register()
  -> drm_debugfs_init()
 -> i915_driver_load()
  -> i915_debugfs_register()

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/1466773227-7994-5-git-send-email-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h

index 9989b6a26b1789473eff995650911b9eb05f7223..a8e0eb7e146c5737dddb62ef4131e63dff1e6d1d 100644 (file)
@@ -5508,8 +5508,9 @@ void intel_display_crc_init(struct drm_device *dev)
        }
 }
 
-int i915_debugfs_init(struct drm_minor *minor)
+int i915_debugfs_register(struct drm_i915_private *dev_priv)
 {
+       struct drm_minor *minor = dev_priv->dev->primary;
        int ret, i;
 
        ret = i915_forcewake_create(minor->debugfs_root, minor);
@@ -5535,8 +5536,9 @@ int i915_debugfs_init(struct drm_minor *minor)
                                        minor->debugfs_root, minor);
 }
 
-void i915_debugfs_cleanup(struct drm_minor *minor)
+void i915_debugfs_unregister(struct drm_i915_private *dev_priv)
 {
+       struct drm_minor *minor = dev_priv->dev->primary;
        int i;
 
        drm_debugfs_remove_files(i915_debugfs_list,
index 29521c4b87a5f8e3641eafaaf166bad92890b610..91623874f9a38d56e4f779c52eed209fff846ba8 100644 (file)
@@ -1397,6 +1397,7 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
        if (intel_vgpu_active(dev_priv))
                I915_WRITE(vgtif_reg(display_ready), VGT_DRV_DISPLAY_READY);
 
+       i915_debugfs_register(dev_priv);
        i915_setup_sysfs(dev);
        intel_modeset_register(dev_priv);
 
@@ -1433,6 +1434,7 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)
        intel_opregion_unregister(dev_priv);
        intel_modeset_unregister(dev_priv);
        i915_teardown_sysfs(dev_priv->dev);
+       i915_debugfs_unregister(dev_priv);
        i915_gem_shrinker_cleanup(dev_priv);
 }
 
index 3eb47fbcea73c634bdba9a7c857a91909f520c1c..3ea09bd83a5a19e76e0c5cda9829cd7597869233 100644 (file)
@@ -1756,10 +1756,6 @@ static struct drm_driver driver = {
        .postclose = i915_driver_postclose,
        .set_busid = drm_pci_set_busid,
 
-#if defined(CONFIG_DEBUG_FS)
-       .debugfs_init = i915_debugfs_init,
-       .debugfs_cleanup = i915_debugfs_cleanup,
-#endif
        .gem_free_object = i915_gem_free_object,
        .gem_vm_ops = &i915_gem_vm_ops,
 
index 73683b54da7aa6eb0cd3596f60161ac6f0fba404..fe75f11d5e1b10ffe68be48e6f851d2f67fbd8d8 100644 (file)
@@ -3603,12 +3603,14 @@ int i915_verify_lists(struct drm_device *dev);
 #endif
 
 /* i915_debugfs.c */
-int i915_debugfs_init(struct drm_minor *minor);
-void i915_debugfs_cleanup(struct drm_minor *minor);
 #ifdef CONFIG_DEBUG_FS
+int i915_debugfs_register(struct drm_i915_private *dev_priv);
+void i915_debugfs_unregister(struct drm_i915_private *dev_priv);
 int i915_debugfs_connector_add(struct drm_connector *connector);
 void intel_display_crc_init(struct drm_device *dev);
 #else
+static inline int i915_debugfs_register(struct drm_i915_private *) {return 0;}
+static inline void i915_debugfs_unregister(struct drm_i915_private *) {}
 static inline int i915_debugfs_connector_add(struct drm_connector *connector)
 { return 0; }
 static inline void intel_display_crc_init(struct drm_device *dev) {}