diff options
author | Mika Kuoppala <mika.kuoppala@linux.intel.com> | 2013-06-06 08:18:40 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-07-01 13:38:19 -0400 |
commit | 95d5bfb3ac4cf5d7311f496761506c676f6b6323 (patch) | |
tree | 774b6f71ae3ac7d2194164308f6860b9f27a5e20 /drivers/gpu/drm/i915/i915_debugfs.c | |
parent | fc16b48be665d94337a861486dd25499971742a2 (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.c | 31 |
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 | ||
983 | void 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 | |||
997 | void 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 | |||
983 | static int i915_error_state_open(struct inode *inode, struct file *file) | 1003 | static 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; |