@@ -1032,63 +1032,72 @@ static void i915_gem_record_rings(struct drm_device *dev,
}
}
-/* FIXME: Since pin count/bound list is global, we duplicate what we capture per
+/**
+ * i915_gem_capture_vm() - Capture a VMs error state.
+ * @error: The main error structure
+ * @vm: The address space we're capturing.
+ * @vm_ndx: Which vm without the buffer array
+ *
+ * FIXME: Since pin count/bound list is global, we duplicate what we capture per
* VM.
*/
static void i915_gem_capture_vm(struct drm_i915_private *dev_priv,
struct drm_i915_error_state *error,
struct i915_address_space *vm,
- const int ndx)
+ const int vm_ndx)
{
struct drm_i915_error_buffer *active_bo = NULL, *pinned_bo = NULL;
struct drm_i915_gem_object *obj;
struct i915_vma *vma;
- int i;
+ int active_vma_count = 0;
- i = 0;
list_for_each_entry(vma, &vm->active_list, mm_list)
- i++;
- error->active_bo_count[ndx] = i;
+ active_vma_count++;
+
+ error->active_bo_count[vm_ndx] = active_vma_count;
+
list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list)
if (i915_gem_obj_is_pinned(obj))
- i++;
- error->pinned_bo_count[ndx] = i - error->active_bo_count[ndx];
+ active_vma_count++;
+
+ /* XXX: this is an incorrect measurement of pinned BOs */
+ error->pinned_bo_count[vm_ndx] = active_vma_count - error->active_bo_count[vm_ndx];
- if (i) {
- active_bo = kcalloc(i, sizeof(*active_bo), GFP_ATOMIC);
+ if (active_vma_count) {
+ active_bo = kcalloc(active_vma_count, sizeof(*active_bo), GFP_ATOMIC);
if (active_bo)
- pinned_bo = active_bo + error->active_bo_count[ndx];
+ pinned_bo = active_bo + error->active_bo_count[vm_ndx];
}
if (active_bo)
- error->active_bo_count[ndx] =
+ error->active_bo_count[vm_ndx] =
capture_active_bo(active_bo,
- error->active_bo_count[ndx],
+ error->active_bo_count[vm_ndx],
&vm->active_list);
if (pinned_bo)
- error->pinned_bo_count[ndx] =
+ error->pinned_bo_count[vm_ndx] =
capture_pinned_bo(pinned_bo,
- error->pinned_bo_count[ndx],
+ error->pinned_bo_count[vm_ndx],
&dev_priv->mm.bound_list);
- error->active_bo[ndx] = active_bo;
- error->pinned_bo[ndx] = pinned_bo;
+ error->active_bo[vm_ndx] = active_bo;
+ error->pinned_bo[vm_ndx] = pinned_bo;
}
static void i915_gem_capture_buffers(struct drm_i915_private *dev_priv,
struct drm_i915_error_state *error)
{
struct i915_address_space *vm;
- int cnt = 0, i = 0;
+ int vm_count = 0, i = 0;
list_for_each_entry(vm, &dev_priv->vm_list, global_link)
- cnt++;
+ vm_count++;
- error->active_bo = kcalloc(cnt, sizeof(*error->active_bo), GFP_ATOMIC);
- error->pinned_bo = kcalloc(cnt, sizeof(*error->pinned_bo), GFP_ATOMIC);
- error->active_bo_count = kcalloc(cnt, sizeof(*error->active_bo_count),
+ error->active_bo = kcalloc(vm_count, sizeof(*error->active_bo), GFP_ATOMIC);
+ error->pinned_bo = kcalloc(vm_count, sizeof(*error->pinned_bo), GFP_ATOMIC);
+ error->active_bo_count = kcalloc(vm_count, sizeof(*error->active_bo_count),
GFP_ATOMIC);
- error->pinned_bo_count = kcalloc(cnt, sizeof(*error->pinned_bo_count),
+ error->pinned_bo_count = kcalloc(vm_count, sizeof(*error->pinned_bo_count),
GFP_ATOMIC);
list_for_each_entry(vm, &dev_priv->vm_list, global_link)
Rename some variables, and clean up the code a bit to make things clearer in our error capture. There isn't an intentional functional change here. Signed-off-by: Ben Widawsky <ben@bwidawsk.net> --- drivers/gpu/drm/i915/i915_gpu_error.c | 55 ++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 23 deletions(-)