On Wed, 26 Aug 2020 at 14:29, Chris Wilson chris@chris-wilson.co.uk wrote:
On 32b, highmem uses 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: fb8621d3bee8 ("drm/i915: Avoid allocating a vmap arena for a single page") #x86-32 References: e87666b52f00 ("drm/i915/shrinker: Hook up vmap allocation failure notifier") Signed-off-by: Chris Wilson chris@chris-wilson.co.uk Cc: Harald Arnesen harald@skogtun.org Cc: stable@vger.kernel.org # v4.7+
Reviewed-by: Matthew Auld matthew.auld@intel.com