Just a spark of an idea to see if this is valid. Given extreme memory pressure where we must zap our own caches and bound buffers or else we fail to allocate a structure, we have a choice of propagating that interrupt back to userspace or to quietly suppress it in the hope of making the allocation. i915_gem_shrink_all() is a likely candidate for that last ditch effort that currently fails to propagate the interruption back... --- drivers/gpu/drm/i915/i915_gem.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 453335c..353332a 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1868,11 +1868,19 @@ static void i915_gem_shrink_all(struct drm_i915_private *dev_priv) { struct drm_i915_gem_object *obj, *next; + bool was_interruptible; - i915_gem_evict_everything(dev_priv->dev); + /* As we are called in a last-ditch attempt to recover memory, + * make sure we wait for any unbind attempts to finish. + */ + was_interruptible = dev_priv->mm.interruptible; + dev_priv->mm.interruptible = false; + i915_gem_evict_everything(dev_priv->dev); list_for_each_entry_safe(obj, next, &dev_priv->mm.unbound_list, gtt_list) i915_gem_object_put_pages(obj); + + dev_priv->mm.interruptible = was_interruptible; } static int -- 1.7.10.4