From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Widawsky Subject: [PATCH] drm/i915: Paranoia - get zeroed page table pages Date: Thu, 27 Feb 2014 10:30:02 -0800 Message-ID: <1393525802-978-1-git-send-email-benjamin.widawsky@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTP id 7BD0BFB8B4 for ; Thu, 27 Feb 2014 10:30:06 -0800 (PST) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org To: Intel GFX Cc: Ben Widawsky , Ben Widawsky List-Id: intel-gfx@lists.freedesktop.org We normally clear the page tables as one of the first things during initialization. They are however wired up (and potentially valid) before we clear them. To prevent the GPU from doing anything we might later regret, simply get zeroed pages, which always mean invalid on all GENs. NOTE: that a similar paranoia could be applied to GGTT via making sure all entries are invalid ASAP. I think the extra work required to fix such a BIOS bug is unwarranted until proven necessary. Signed-off-by: Ben Widawsky --- drivers/gpu/drm/i915/i915_gem_gtt.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 0c27d8a..f94d39d 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c @@ -354,12 +354,13 @@ static struct page **__gen8_alloc_page_tables(void) struct page **pt_pages; int i; - pt_pages = kcalloc(GEN8_PDES_PER_PAGE, sizeof(struct page *), GFP_KERNEL); + pt_pages = kcalloc(GEN8_PDES_PER_PAGE, sizeof(struct page *), + GFP_KERNEL | __GFP_ZERO); if (!pt_pages) return ERR_PTR(-ENOMEM); for (i = 0; i < GEN8_PDES_PER_PAGE; i++) { - pt_pages[i] = alloc_page(GFP_KERNEL); + pt_pages[i] = alloc_page(GFP_KERNEL | __GFP_ZERO); if (!pt_pages[i]) goto bail; } @@ -410,7 +411,7 @@ static int gen8_ppgtt_allocate_dma(struct i915_hw_ppgtt *ppgtt) for (i = 0; i < ppgtt->num_pd_pages; i++) { ppgtt->gen8_pt_dma_addr[i] = kcalloc(GEN8_PDES_PER_PAGE, sizeof(dma_addr_t), - GFP_KERNEL); + GFP_KERNEL | __GFP_ZERO); if (!ppgtt->gen8_pt_dma_addr[i]) return -ENOMEM; } @@ -421,7 +422,8 @@ static int gen8_ppgtt_allocate_dma(struct i915_hw_ppgtt *ppgtt) static int gen8_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt, const int max_pdp) { - ppgtt->pd_pages = alloc_pages(GFP_KERNEL, get_order(max_pdp << PAGE_SHIFT)); + ppgtt->pd_pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, + get_order(max_pdp << PAGE_SHIFT)); if (!ppgtt->pd_pages) return -ENOMEM; @@ -1015,13 +1017,13 @@ static int gen6_ppgtt_allocate_page_tables(struct i915_hw_ppgtt *ppgtt) int i; ppgtt->pt_pages = kcalloc(ppgtt->num_pd_entries, sizeof(struct page *), - GFP_KERNEL); + GFP_KERNEL | __GFP_ZERO); if (!ppgtt->pt_pages) return -ENOMEM; for (i = 0; i < ppgtt->num_pd_entries; i++) { - ppgtt->pt_pages[i] = alloc_page(GFP_KERNEL); + ppgtt->pt_pages[i] = alloc_page(GFP_KERNEL | __GFP_ZERO); if (!ppgtt->pt_pages[i]) { gen6_ppgtt_free(ppgtt); return -ENOMEM; @@ -1046,7 +1048,7 @@ static int gen6_ppgtt_alloc(struct i915_hw_ppgtt *ppgtt) } ppgtt->pt_dma_addr = kcalloc(ppgtt->num_pd_entries, sizeof(dma_addr_t), - GFP_KERNEL); + GFP_KERNEL | __GFP_ZERO); if (!ppgtt->pt_dma_addr) { drm_mm_remove_node(&ppgtt->node); gen6_ppgtt_free(ppgtt); -- 1.9.0