From patchwork Fri Aug 22 03:11:31 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Widawsky X-Patchwork-Id: 4760551 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4F3AA9F344 for ; Fri, 22 Aug 2014 03:12:55 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 5D8412018E for ; Fri, 22 Aug 2014 03:12:54 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 7BE5120155 for ; Fri, 22 Aug 2014 03:12:53 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1355A6E856; Thu, 21 Aug 2014 20:12:53 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTP id 792AD6E855 for ; Thu, 21 Aug 2014 20:12:51 -0700 (PDT) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.fm.intel.com with ESMTP; 21 Aug 2014 20:05:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.97,862,1389772800"; d="scan'208";a="375575693" Received: from unknown (HELO ironside.intel.com) ([10.255.12.192]) by FMSMGA003.fm.intel.com with ESMTP; 21 Aug 2014 20:08:56 -0700 From: Ben Widawsky To: Intel GFX Date: Thu, 21 Aug 2014 20:11:31 -0700 Message-Id: <1408677155-1840-9-git-send-email-benjamin.widawsky@intel.com> X-Mailer: git-send-email 2.0.4 In-Reply-To: <1408677155-1840-1-git-send-email-benjamin.widawsky@intel.com> References: <1408677155-1840-1-git-send-email-benjamin.widawsky@intel.com> Cc: Ben Widawsky , Ben Widawsky Subject: [Intel-gfx] [PATCH 08/68] drm/i915/error: Capture vmas instead of BOs X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP To follow up on the last patch, we can now capture the VMAs instead of the BOs. The hope if we get more accurate error capture while debugging PPGTT. Note that this does not impact the previous argument about whether to capture all VMAs, or just the guilty VMA. This merely allows the code to do whatever we chose later. Signed-off-by: Ben Widawsky --- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/i915_gpu_error.c | 53 +++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index fab97bc..4f217f3 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -317,6 +317,7 @@ struct drm_i915_error_state { char error_msg[128]; u32 reset_count; u32 suspend_count; + u32 vm_count; /* Generic register state */ u32 eir; diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 5827915..82508dd 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -393,15 +393,19 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m, i915_ring_error_state(m, dev, &error->ring[i]); } - if (error->active_bo) - print_error_buffers(m, "Active", - error->active_bo[0], - error->active_bo_count[0]); + for (i = 0; i < error->vm_count; i++) { + if (error->active_bo[i]) + print_error_buffers(m, "Active", + error->active_bo[i], + error->active_bo_count[i]); + } - if (error->pinned_bo) - print_error_buffers(m, "Pinned", - error->pinned_bo[0], - error->pinned_bo_count[0]); + for (i = 0; i < error->vm_count; i++) { + if (error->pinned_bo[i]) + print_error_buffers(m, "Pinned", + error->pinned_bo[i], + error->pinned_bo_count[i]); + } for (i = 0; i < ARRAY_SIZE(error->ring); i++) { obj = error->ring[i].batchbuffer; @@ -643,22 +647,23 @@ unwind: i915_error_object_create_sized((dev_priv), (src), &(dev_priv)->gtt.base, \ (src)->base.size>>PAGE_SHIFT) -static void capture_bo(struct drm_i915_error_buffer *err, - struct drm_i915_gem_object *obj) +static void capture_vma(struct drm_i915_error_buffer *err, struct i915_vma *vma) { + struct drm_i915_gem_object *obj = vma->obj; + err->size = obj->base.size; err->name = obj->base.name; err->rseqno = obj->last_read_seqno; err->wseqno = obj->last_write_seqno; - err->gtt_offset = i915_gem_obj_ggtt_offset(obj); + err->gtt_offset = vma->node.start; err->read_domains = obj->base.read_domains; err->write_domain = obj->base.write_domain; err->fence_reg = obj->fence_reg; - err->pinned = 0; - if (i915_gem_obj_is_pinned(obj)) - err->pinned = 1; - if (obj->user_pin_count > 0) + if (obj->user_pin_count > 0) { + WARN_ON(i915_is_ggtt(vma->vm)); err->pinned = -1; + } else + err->pinned = !!vma->pin_count; err->tiling = obj->tiling_mode; err->dirty = obj->dirty; err->purgeable = obj->madv != I915_MADV_WILLNEED; @@ -674,7 +679,7 @@ static u32 capture_active_bo(struct drm_i915_error_buffer *err, int i = 0; list_for_each_entry(vma, head, mm_list) { - capture_bo(err++, vma->obj); + capture_vma(err++, vma); if (++i == count) break; } @@ -689,10 +694,10 @@ static u32 capture_pinned_bo(struct drm_i915_error_buffer *err, int i = 0; list_for_each_entry(vma, head, pin_capture_link) { - if (!i915_gem_obj_is_pinned(vma->obj)) + if (!vma->pin_count) continue; - capture_bo(err++, vma->obj); + capture_vma(err++, vma); if (++i == count) break; } @@ -1099,16 +1104,16 @@ static void i915_gem_capture_buffers(struct drm_i915_private *dev_priv, struct drm_i915_error_state *error) { struct i915_address_space *vm; - int vm_count = 0, i = 0; + int i = 0; list_for_each_entry(vm, &dev_priv->vm_list, global_link) - vm_count++; + error->vm_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), + error->active_bo = kcalloc(error->vm_count, sizeof(*error->active_bo), GFP_ATOMIC); + error->pinned_bo = kcalloc(error->vm_count, sizeof(*error->pinned_bo), GFP_ATOMIC); + error->active_bo_count = kcalloc(error->vm_count, sizeof(*error->active_bo_count), GFP_ATOMIC); - error->pinned_bo_count = kcalloc(vm_count, sizeof(*error->pinned_bo_count), + error->pinned_bo_count = kcalloc(error->vm_count, sizeof(*error->pinned_bo_count), GFP_ATOMIC); list_for_each_entry(vm, &dev_priv->vm_list, global_link)