| From 3eeb61347413b883d9dfd0d2f98b97ecfd9429f0 Mon Sep 17 00:00:00 2001 |
| From: Mika Kuoppala <mika.kuoppala@linux.intel.com> |
| Date: Thu, 6 Jun 2013 15:18:40 +0300 |
| Subject: 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> |
| (cherry picked from commit 95d5bfb3ac4cf5d7311f496761506c676f6b6323) |
| (cherry picked from drm-intel-next-queued) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_debugfs.c | 31 ++++++++++++++++++++++--------- |
| drivers/gpu/drm/i915/i915_drv.h | 3 +++ |
| 2 files changed, 25 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, |
| return cnt; |
| } |
| |
| +void i915_error_state_get(struct drm_device *dev, |
| + struct i915_error_state_file_priv *error_priv) |
| +{ |
| + struct drm_i915_private *dev_priv = dev->dev_private; |
| + unsigned long flags; |
| + |
| + spin_lock_irqsave(&dev_priv->gpu_error.lock, flags); |
| + error_priv->error = dev_priv->gpu_error.first_error; |
| + if (error_priv->error) |
| + kref_get(&error_priv->error->ref); |
| + spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags); |
| + |
| +} |
| + |
| +void i915_error_state_put(struct i915_error_state_file_priv *error_priv) |
| +{ |
| + if (error_priv->error) |
| + kref_put(&error_priv->error->ref, i915_error_state_free); |
| +} |
| + |
| static int i915_error_state_open(struct inode *inode, struct file *file) |
| { |
| struct drm_device *dev = inode->i_private; |
| - drm_i915_private_t *dev_priv = dev->dev_private; |
| struct i915_error_state_file_priv *error_priv; |
| - unsigned long flags; |
| |
| error_priv = kzalloc(sizeof(*error_priv), GFP_KERNEL); |
| if (!error_priv) |
| @@ -993,11 +1011,7 @@ static int i915_error_state_open(struct inode *inode, struct file *file) |
| |
| error_priv->dev = dev; |
| |
| - spin_lock_irqsave(&dev_priv->gpu_error.lock, flags); |
| - error_priv->error = dev_priv->gpu_error.first_error; |
| - if (error_priv->error) |
| - kref_get(&error_priv->error->ref); |
| - spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags); |
| + i915_error_state_get(dev, error_priv); |
| |
| file->private_data = error_priv; |
| |
| @@ -1008,8 +1022,7 @@ static int i915_error_state_release(struct inode *inode, struct file *file) |
| { |
| struct i915_error_state_file_priv *error_priv = file->private_data; |
| |
| - if (error_priv->error) |
| - kref_put(&error_priv->error->ref, i915_error_state_free); |
| + i915_error_state_put(error_priv); |
| kfree(error_priv); |
| |
| return 0; |
| diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h |
| index e4ac32298055..90ec48ed8052 100644 |
| --- a/drivers/gpu/drm/i915/i915_drv.h |
| +++ b/drivers/gpu/drm/i915/i915_drv.h |
| @@ -1932,6 +1932,9 @@ __printf(2, 3) |
| void i915_error_printf(struct drm_i915_error_state_buf *e, const char *f, ...); |
| int i915_error_state_to_str(struct drm_i915_error_state_buf *estr, |
| const struct i915_error_state_file_priv *error); |
| +void i915_error_state_get(struct drm_device *dev, |
| + struct i915_error_state_file_priv *error_priv); |
| +void i915_error_state_put(struct i915_error_state_file_priv *error_priv); |
| |
| /* i915_suspend.c */ |
| extern int i915_save_state(struct drm_device *dev); |
| -- |
| 1.8.5.rc3 |
| |