aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_debugfs.c
diff options
context:
space:
mode:
authorMika Kuoppala <mika.kuoppala@linux.intel.com>2013-06-06 08:18:40 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-07-01 13:38:19 -0400
commit95d5bfb3ac4cf5d7311f496761506c676f6b6323 (patch)
tree774b6f71ae3ac7d2194164308f6860b9f27a5e20 /drivers/gpu/drm/i915/i915_debugfs.c
parentfc16b48be665d94337a861486dd25499971742a2 (diff)
drm/i915: export error state ref handling
In preparation for sysfs error state access, export ref error state ref counting interface. Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index b64af15eb388..eef4c01ab61a 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -980,12 +980,30 @@ i915_error_state_write(struct file *filp,
980 return cnt; 980 return cnt;
981} 981}
982 982
983void i915_error_state_get(struct drm_device *dev,
984 struct i915_error_state_file_priv *error_priv)
985{
986 struct drm_i915_private *dev_priv = dev->dev_private;
987 unsigned long flags;
988
989 spin_lock_irqsave(&dev_priv->gpu_error.lock, flags);
990 error_priv->error = dev_priv->gpu_error.first_error;
991 if (error_priv->error)
992 kref_get(&error_priv->error->ref);
993 spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags);
994
995}
996
997void i915_error_state_put(struct i915_error_state_file_priv *error_priv)
998{
999 if (error_priv->error)
1000 kref_put(&error_priv->error->ref, i915_error_state_free);
1001}
1002
983static int i915_error_state_open(struct inode *inode, struct file *file) 1003static int i915_error_state_open(struct inode *inode, struct file *file)
984{ 1004{
985 struct drm_device *dev = inode->i_private; 1005 struct drm_device *dev = inode->i_private;
986 drm_i915_private_t *dev_priv = dev->dev_private;
987 struct i915_error_state_file_priv *error_priv; 1006 struct i915_error_state_file_priv *error_priv;
988 unsigned long flags;
989 1007
990 error_priv = kzalloc(sizeof(*error_priv), GFP_KERNEL); 1008 error_priv = kzalloc(sizeof(*error_priv), GFP_KERNEL);
991 if (!error_priv) 1009 if (!error_priv)
@@ -993,11 +1011,7 @@ static int i915_error_state_open(struct inode *inode, struct file *file)
993 1011
994 error_priv->dev = dev; 1012 error_priv->dev = dev;
995 1013
996 spin_lock_irqsave(&dev_priv->gpu_error.lock, flags); 1014 i915_error_state_get(dev, error_priv);
997 error_priv->error = dev_priv->gpu_error.first_error;
998 if (error_priv->error)
999 kref_get(&error_priv->error->ref);
1000 spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags);
1001 1015
1002 file->private_data = error_priv; 1016 file->private_data = error_priv;
1003 1017
@@ -1008,8 +1022,7 @@ static int i915_error_state_release(struct inode *inode, struct file *file)
1008{ 1022{
1009 struct i915_error_state_file_priv *error_priv = file->private_data; 1023 struct i915_error_state_file_priv *error_priv = file->private_data;
1010 1024
1011 if (error_priv->error) 1025 i915_error_state_put(error_priv);
1012 kref_put(&error_priv->error->ref, i915_error_state_free);
1013 kfree(error_priv); 1026 kfree(error_priv);
1014 1027
1015 return 0; 1028 return 0;