mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
drm/i915/gem: Avoid implicit vmap for highmem on x86-32
On 32b, highmem using a finite set of indirect PTE (i.e. vmap) to provide virtual mappings of the high pages. As these are finite, map_new_virtual() must wait for some other kmap() to finish when it runs out. If we map a large number of objects, there is no method for it to tell us to release the mappings, and we deadlock. However, if we make an explicit vmap of the page, that uses a larger vmalloc arena, and also has the ability to tell us to release unwanted mappings. Most importantly, it will fail and propagate an error instead of waiting forever. Fixes:fb8621d3be
("drm/i915: Avoid allocating a vmap arena for a single page") #x86-32 References:e87666b52f
("drm/i915/shrinker: Hook up vmap allocation failure notifier") Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Cc: <stable@vger.kernel.org> # v4.7+ Link: https://patchwork.freedesktop.org/patch/msgid/20200915091417.4086-1-chris@chris-wilson.co.uk (cherry picked from commit 060bb115c2d664f04db9c7613a104dfaef3fdd98) Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
This commit is contained in:
parent
ef80c1a1d2
commit
4caf017ee9
@ -255,8 +255,30 @@ static void *i915_gem_object_map(struct drm_i915_gem_object *obj,
|
||||
return NULL;
|
||||
|
||||
/* A single page can always be kmapped */
|
||||
if (n_pte == 1 && type == I915_MAP_WB)
|
||||
return kmap(sg_page(sgt->sgl));
|
||||
if (n_pte == 1 && type == I915_MAP_WB) {
|
||||
struct page *page = sg_page(sgt->sgl);
|
||||
|
||||
/*
|
||||
* On 32b, highmem using a finite set of indirect PTE (i.e.
|
||||
* vmap) to provide virtual mappings of the high pages.
|
||||
* As these are finite, map_new_virtual() must wait for some
|
||||
* other kmap() to finish when it runs out. If we map a large
|
||||
* number of objects, there is no method for it to tell us
|
||||
* to release the mappings, and we deadlock.
|
||||
*
|
||||
* However, if we make an explicit vmap of the page, that
|
||||
* uses a larger vmalloc arena, and also has the ability
|
||||
* to tell us to release unwanted mappings. Most importantly,
|
||||
* it will fail and propagate an error instead of waiting
|
||||
* forever.
|
||||
*
|
||||
* So if the page is beyond the 32b boundary, make an explicit
|
||||
* vmap. On 64b, this check will be optimised away as we can
|
||||
* directly kmap any page on the system.
|
||||
*/
|
||||
if (!PageHighMem(page))
|
||||
return kmap(page);
|
||||
}
|
||||
|
||||
mem = stack;
|
||||
if (n_pte > ARRAY_SIZE(stack)) {
|
||||
|
Loading…
Reference in New Issue
Block a user