| From 4d17c0d8e4dc0176158bfe66d3520023de5252d0 Mon Sep 17 00:00:00 2001 |
| From: Mika Kuoppala <mika.kuoppala@linux.intel.com> |
| Date: Thu, 6 Jun 2013 15:18:41 +0300 |
| Subject: drm/i915: introduce i915_error_state_buf_init |
| |
| Make function for struct i915_error_state_buf initialization |
| and export it, for sysfs and debugfs. |
| |
| 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 4dc955f7f5241a92767e2b3ffd74f49a82938999) |
| (cherry picked from drm-intel-next-queued) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_debugfs.c | 50 ++++++++++++++++++++++--------------- |
| drivers/gpu/drm/i915/i915_drv.h | 7 ++++++ |
| 2 files changed, 37 insertions(+), 20 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c |
| index eef4c01ab61a..3e36756d0439 100644 |
| --- a/drivers/gpu/drm/i915/i915_debugfs.c |
| +++ b/drivers/gpu/drm/i915/i915_debugfs.c |
| @@ -1028,38 +1028,48 @@ static int i915_error_state_release(struct inode *inode, struct file *file) |
| return 0; |
| } |
| |
| -static ssize_t i915_error_state_read(struct file *file, char __user *userbuf, |
| - size_t count, loff_t *pos) |
| +int i915_error_state_buf_init(struct drm_i915_error_state_buf *ebuf, |
| + size_t count, loff_t pos) |
| { |
| - struct i915_error_state_file_priv *error_priv = file->private_data; |
| - struct drm_i915_error_state_buf error_str; |
| - loff_t tmp_pos = 0; |
| - ssize_t ret_count = 0; |
| - int ret = 0; |
| - |
| - memset(&error_str, 0, sizeof(error_str)); |
| + memset(ebuf, 0, sizeof(*ebuf)); |
| |
| /* We need to have enough room to store any i915_error_state printf |
| * so that we can move it to start position. |
| */ |
| - error_str.size = count + 1 > PAGE_SIZE ? count + 1 : PAGE_SIZE; |
| - error_str.buf = kmalloc(error_str.size, |
| + ebuf->size = count + 1 > PAGE_SIZE ? count + 1 : PAGE_SIZE; |
| + ebuf->buf = kmalloc(ebuf->size, |
| GFP_TEMPORARY | __GFP_NORETRY | __GFP_NOWARN); |
| |
| - if (error_str.buf == NULL) { |
| - error_str.size = PAGE_SIZE; |
| - error_str.buf = kmalloc(error_str.size, GFP_TEMPORARY); |
| + if (ebuf->buf == NULL) { |
| + ebuf->size = PAGE_SIZE; |
| + ebuf->buf = kmalloc(ebuf->size, GFP_TEMPORARY); |
| } |
| |
| - if (error_str.buf == NULL) { |
| - error_str.size = 128; |
| - error_str.buf = kmalloc(error_str.size, GFP_TEMPORARY); |
| + if (ebuf->buf == NULL) { |
| + ebuf->size = 128; |
| + ebuf->buf = kmalloc(ebuf->size, GFP_TEMPORARY); |
| } |
| |
| - if (error_str.buf == NULL) |
| + if (ebuf->buf == NULL) |
| return -ENOMEM; |
| |
| - error_str.start = *pos; |
| + ebuf->start = pos; |
| + |
| + return 0; |
| +} |
| + |
| +static ssize_t i915_error_state_read(struct file *file, char __user *userbuf, |
| + size_t count, loff_t *pos) |
| +{ |
| + struct i915_error_state_file_priv *error_priv = file->private_data; |
| + struct drm_i915_error_state_buf error_str; |
| + loff_t tmp_pos = 0; |
| + ssize_t ret_count = 0; |
| + int ret; |
| + |
| + ret = i915_error_state_buf_init(&error_str, count, *pos); |
| + if (ret) |
| + return ret; |
| |
| ret = i915_error_state_to_str(&error_str, error_priv); |
| if (ret) |
| @@ -1074,7 +1084,7 @@ static ssize_t i915_error_state_read(struct file *file, char __user *userbuf, |
| else |
| *pos = error_str.start + ret_count; |
| out: |
| - kfree(error_str.buf); |
| + i915_error_state_buf_release(&error_str); |
| return ret ?: ret_count; |
| } |
| |
| diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h |
| index 90ec48ed8052..98dfe0cbd2be 100644 |
| --- a/drivers/gpu/drm/i915/i915_drv.h |
| +++ b/drivers/gpu/drm/i915/i915_drv.h |
| @@ -1935,6 +1935,13 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *estr, |
| 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); |
| +int i915_error_state_buf_init(struct drm_i915_error_state_buf *eb, |
| + size_t count, loff_t pos); |
| +static inline void i915_error_state_buf_release( |
| + struct drm_i915_error_state_buf *eb) |
| +{ |
| + kfree(eb->buf); |
| +} |
| |
| /* i915_suspend.c */ |
| extern int i915_save_state(struct drm_device *dev); |
| -- |
| 1.8.5.rc3 |
| |