From patchwork Fri Jan 17 10:03:24 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mika Kuoppala X-Patchwork-Id: 3503261 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 013E19F32F for ; Fri, 17 Jan 2014 10:03:30 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id F016520131 for ; Fri, 17 Jan 2014 10:03:28 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id BF5232012F for ; Fri, 17 Jan 2014 10:03:27 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E3787FD375; Fri, 17 Jan 2014 02:03:25 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTP id 71510FD2D1 for ; Fri, 17 Jan 2014 02:03:22 -0800 (PST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 17 Jan 2014 02:03:22 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.95,670,1384329600"; d="scan'208";a="466607840" Received: from rosetta.fi.intel.com (HELO rosetta) ([10.237.72.60]) by fmsmga002.fm.intel.com with ESMTP; 17 Jan 2014 02:03:21 -0800 Received: by rosetta (Postfix, from userid 1000) id 2F96E8009C; Fri, 17 Jan 2014 12:03:25 +0200 (EET) From: Mika Kuoppala To: intel-gfx@lists.freedesktop.org Date: Fri, 17 Jan 2014 12:03:24 +0200 Message-Id: <1389953004-8830-1-git-send-email-mika.kuoppala@intel.com> X-Mailer: git-send-email 1.7.9.5 Subject: [Intel-gfx] [PATCH] drm/i915/ppgtt: Limit guilty hunt inside of relevant vm X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org X-Spam-Status: No, score=-4.5 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 With full ppgtt, ACTHD is only relevant inside one context (address space). Trying to find guilty batch only relying on ACTHD, the result is false positives as ACTHD points inside batches on different address spaces. Filter out nonrelated contexts by checking on which vm the ring was running on when the hang happened. Only after finding the relevant vm, use acthd to find the guilty batch inside it. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73652 Signed-off-by: Mika Kuoppala --- drivers/gpu/drm/i915/i915_gem.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 5fcdb14..a7cc060 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -2282,9 +2282,34 @@ request_to_vm(struct drm_i915_gem_request *request) return vm; } +static bool +request_vm_active(struct drm_i915_gem_request *request) +{ + struct intel_ring_buffer *ring = request->ring; + struct drm_device *dev = ring->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct i915_hw_ppgtt *ppgtt; + u32 pd_off; + + if (USES_FULL_PPGTT(dev) == false) + return true; + + if (WARN_ON(!request->ctx)) + return false; + + ppgtt = ctx_to_ppgtt(request->ctx); + + pd_off = (I915_READ(RING_PP_DIR_BASE(ring)) >> 16) * 64; + + return pd_off == ppgtt->pd_offset; +} + static bool i915_request_guilty(struct drm_i915_gem_request *request, const u32 acthd, bool *inside) { + if (!request_vm_active(request)) + return false; + /* There is a possibility that unmasked head address * pointing inside the ring, matches the batch_obj address range. * However this is extremely unlikely.