Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24f8e00a authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Prefer to report ENOMEM rather than incur the oom for gfx allocations



Since gfx allocations tend to be large, unmovable and disposable, report
the allocation failure back to userspace as an ENOMEM rather than incur
the oomkiller. We have already tried to make room by purging our own
cached gfx objects, and the oomkiller doesn't attribute ownership of gfx
objects so will likely pick the wrong candidate. Instead, let userspace
see the ENOMEM.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/20170322110521.29930-1-chris@chris-wilson.co.uk


Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Acked-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 396a1200
Loading
Loading
Loading
Loading
+12 −3
Original line number Original line Diff line number Diff line
@@ -2321,7 +2321,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
	st->nents = 0;
	st->nents = 0;
	for (i = 0; i < page_count; i++) {
	for (i = 0; i < page_count; i++) {
		page = shmem_read_mapping_page_gfp(mapping, i, gfp);
		page = shmem_read_mapping_page_gfp(mapping, i, gfp);
		if (IS_ERR(page)) {
		if (unlikely(IS_ERR(page))) {
			i915_gem_shrink(dev_priv,
			i915_gem_shrink(dev_priv,
					page_count,
					page_count,
					I915_SHRINK_BOUND |
					I915_SHRINK_BOUND |
@@ -2329,12 +2329,21 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
					I915_SHRINK_PURGEABLE);
					I915_SHRINK_PURGEABLE);
			page = shmem_read_mapping_page_gfp(mapping, i, gfp);
			page = shmem_read_mapping_page_gfp(mapping, i, gfp);
		}
		}
		if (IS_ERR(page)) {
		if (unlikely(IS_ERR(page))) {
			gfp_t reclaim;

			/* We've tried hard to allocate the memory by reaping
			/* We've tried hard to allocate the memory by reaping
			 * our own buffer, now let the real VM do its job and
			 * our own buffer, now let the real VM do its job and
			 * go down in flames if truly OOM.
			 * go down in flames if truly OOM.
			 *
			 * However, since graphics tend to be disposable,
			 * defer the oom here by reporting the ENOMEM back
			 * to userspace.
			 */
			 */
			page = shmem_read_mapping_page(mapping, i);
			reclaim = mapping_gfp_constraint(mapping, 0);
			reclaim |= __GFP_NORETRY; /* reclaim, but no oom */

			page = shmem_read_mapping_page_gfp(mapping, i, gfp);
			if (IS_ERR(page)) {
			if (IS_ERR(page)) {
				ret = PTR_ERR(page);
				ret = PTR_ERR(page);
				goto err_sg;
				goto err_sg;