Patch "drm/i915: Recreate internal objects with single page segments if dmar fails" has been added to the 4.10-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drm/i915: Recreate internal objects with single page segments if dmar fails
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-i915-recreate-internal-objects-with-single-page-segments-if-dmar-fails.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
2d2cfc12b1270c8451edc7d2dd5f79097b3a17d8Mon Sep 17 00:00:00 2001
From: Chris Wilson <[email protected]>
Date: Thu, 2 Feb 2017 13:27:21 +0000
Subject: drm/i915: Recreate internal objects with single page segments if dmar fails
From: Chris Wilson <[email protected]>
commit 2d2cfc12b1270c8451edc7d2dd5f79097b3a17d8 upstream.
If we fail to dma-map the object, the most common cause is lack of space inside the SW-IOTLB due to fragmentation. If we recreate the_sg_table using segments of PAGE_SIZE (and single page allocations), we may succeed in remapping the scatterlist.
First became a significant problem for the mock selftests after commit 5584f1b1d73e ("drm/i915: fix i915 running as dom0 under Xen") increased the max_order.
--- drivers/gpu/drm/i915/i915_gem_internal.c | 37 +++++++++++++++++++------------ 1 file changed, 23 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/i915_gem_internal.c +23 -14
@@ -46,24 +46,12 @@ static struct sg_table * i915_gem_object_get_pages_internal(struct drm_i915_gem_object *obj) {struct drm_i915_private *i915 =to_i915 (obj->base.dev); -unsigned int npages = obj->base.size /PAGE_SIZE ;struct sg_table *st;struct scatterlist *sg; +unsigned int npages;int max_order;gfp_t gfp; - st =kmalloc (sizeof (*st),GFP_KERNEL ); -if (!st) -return ERR_PTR (-ENOMEM ); - -if (sg_alloc_table (st, npages,GFP_KERNEL )) { -kfree (st); -return ERR_PTR (-ENOMEM ); - } - - sg = st->sgl; - st->nents =0 ; - max_order =MAX_ORDER ;#ifdef CONFIG_SWIOTLB if (swiotlb_nr_tbl ()) {
@@ -85,6 +73,20 @@ i915_gem_object_get_pages_internal(struc gfp |= __GFP_DMA32; } +create_st: + st =kmalloc (sizeof (*st),GFP_KERNEL ); +if (!st) +return ERR_PTR (-ENOMEM ); + + npages = obj->base.size /PAGE_SIZE ; +if (sg_alloc_table (st, npages,GFP_KERNEL )) { +kfree (st); +return ERR_PTR (-ENOMEM ); + } + + sg = st->sgl; + st->nents =0 ; + do { int order = min(fls(npages) - 1, max_order); struct page *page;
@@ -112,8 +114,15 @@ i915_gem_object_get_pages_internal(struc sg =__sg_next (sg); }while (1 ); -if (i915_gem_gtt_prepare_pages (obj, st)) +if (i915_gem_gtt_prepare_pages (obj, st)) { +/* Failed to dma-map try again with single page sg segments */ +if (get_order (st->sgl->length)) { +internal_free_pages (st); + max_order =0 ; + goto create_st; + } goto err; + }/* Mark the pages as dontneed whilst they are still pinned. As soon * as they are unpinned they are allowed to be reaped by the shrinker,
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/drm-i915-recreate-internal-objects-with-single-page-segments-if-dmar-fails.patch queue-4.10/drm-cancel-drm_fb_helper_dirty_work-on-unload.patch queue-4.10/drm-i915-gvt-disable-access-to-stolen-memory-as-a-guest.patch queue-4.10/drm-i915-check-for-timeout-completion-when-waiting-for-the-rq-to-submitted.patch queue-4.10/drm-cancel-drm_fb_helper_resume_work-on-unload.patch queue-4.10/drm-i915-pass-timeout-0-on-to-i915_gem_object_wait_fence.patch