From patchwork Mon Jun 10 09:28:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhenyu Wang X-Patchwork-Id: 10984547 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D761092A for ; Mon, 10 Jun 2019 09:28:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C5E8328414 for ; Mon, 10 Jun 2019 09:28:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AEB4328864; Mon, 10 Jun 2019 09:28:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5038828414 for ; Mon, 10 Jun 2019 09:28:29 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C274589100; Mon, 10 Jun 2019 09:28:28 +0000 (UTC) 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 ESMTPS id 68754890EA; Mon, 10 Jun 2019 09:28:27 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jun 2019 02:28:27 -0700 X-ExtLoop1: 1 Received: from debian-nuc.sh.intel.com ([10.239.160.63]) by fmsmga007.fm.intel.com with ESMTP; 10 Jun 2019 02:28:26 -0700 From: Zhenyu Wang To: intel-gfx@lists.freedesktop.org Date: Mon, 10 Jun 2019 17:28:19 +0800 Message-Id: <20190610092819.11371-1-zhenyuw@linux.intel.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH] drm/i915: Fix GVT balloon fail path handling X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gvt-dev@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP For any reason if GVT balloon failed, deballoon would be called. This adds a simple mask to check validity of balloon spaces. When failure happens, that mask is used to track for deballoon, so it won't cause any invalid space reference in fail path, which fixed kernel oops when balloon error happened. Signed-off-by: Zhenyu Wang --- drivers/gpu/drm/i915/i915_vgpu.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_vgpu.c b/drivers/gpu/drm/i915/i915_vgpu.c index 94d3992b599d..5aec34db1aaa 100644 --- a/drivers/gpu/drm/i915/i915_vgpu.c +++ b/drivers/gpu/drm/i915/i915_vgpu.c @@ -94,6 +94,7 @@ struct _balloon_info_ { * graphic memory, 2/3 for unmappable graphic memory. */ struct drm_mm_node space[4]; + u8 valid; }; static struct _balloon_info_ bl_info; @@ -126,8 +127,12 @@ void intel_vgt_deballoon(struct drm_i915_private *dev_priv) DRM_DEBUG("VGT deballoon.\n"); - for (i = 0; i < 4; i++) - vgt_deballoon_space(&dev_priv->ggtt, &bl_info.space[i]); + for (i = 0; i < 4; i++) { + if (bl_info.valid & BIT(i)) { + vgt_deballoon_space(&dev_priv->ggtt, &bl_info.space[i]); + bl_info.valid &= ~(u8)BIT(i); + } + } } static int vgt_balloon_space(struct i915_ggtt *ggtt, @@ -232,16 +237,17 @@ int intel_vgt_balloon(struct drm_i915_private *dev_priv) if (unmappable_base > ggtt->mappable_end) { ret = vgt_balloon_space(ggtt, &bl_info.space[2], ggtt->mappable_end, unmappable_base); - if (ret) goto err; + bl_info.valid |= BIT(2); } if (unmappable_end < ggtt_end) { ret = vgt_balloon_space(ggtt, &bl_info.space[3], unmappable_end, ggtt_end); if (ret) - goto err_upon_mappable; + goto err; + bl_info.valid |= BIT(3); } /* Mappable graphic memory ballooning */ @@ -250,7 +256,8 @@ int intel_vgt_balloon(struct drm_i915_private *dev_priv) 0, mappable_base); if (ret) - goto err_upon_unmappable; + goto err; + bl_info.valid |= BIT(0); } if (mappable_end < ggtt->mappable_end) { @@ -258,19 +265,15 @@ int intel_vgt_balloon(struct drm_i915_private *dev_priv) mappable_end, ggtt->mappable_end); if (ret) - goto err_below_mappable; + goto err; + bl_info.valid |= BIT(1); } DRM_INFO("VGT balloon successfully\n"); return 0; -err_below_mappable: - vgt_deballoon_space(ggtt, &bl_info.space[0]); -err_upon_unmappable: - vgt_deballoon_space(ggtt, &bl_info.space[3]); -err_upon_mappable: - vgt_deballoon_space(ggtt, &bl_info.space[2]); err: + intel_vgt_deballoon(dev_priv); DRM_ERROR("VGT balloon fail\n"); return ret; }