drm/i915: Use mutex_lock_killable() from inside the shrinker
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 9 Jan 2019 16:42:03 +0000 (16:42 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 10 Jan 2019 13:44:08 +0000 (13:44 +0000)
If the current process is being killed (it was interrupted with SIGKILL
or equivalent), it will not make any progress in page allocation and we
can abort performing the shrinking on its behalf. So we can use
mutex_lock_killable() instead (although this path should only be
reachable from kswapd currently).

Tvrtko pointed out that it should also be reachable from debugfs, which
he would prefer retain its interruptiblity. As a compromise, killable is a
step in the right direction!

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190109164204.23935-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_shrinker.c

index 34b108f73f1d635e6ba8c0f06116d229c9e93e55..8ad9519779ccb1f1d9e1eec0ea9f7f652f438d66 100644 (file)
@@ -39,18 +39,18 @@ static bool shrinker_lock(struct drm_i915_private *i915,
                          unsigned int flags,
                          bool *unlock)
 {
-       switch (mutex_trylock_recursive(&i915->drm.struct_mutex)) {
+       struct mutex *m = &i915->drm.struct_mutex;
+
+       switch (mutex_trylock_recursive(m)) {
        case MUTEX_TRYLOCK_RECURSIVE:
                *unlock = false;
                return true;
 
        case MUTEX_TRYLOCK_FAILED:
                *unlock = false;
-               if (flags & I915_SHRINK_ACTIVE) {
-                       mutex_lock_nested(&i915->drm.struct_mutex,
-                                         I915_MM_SHRINKER);
+               if (flags & I915_SHRINK_ACTIVE &&
+                   mutex_lock_killable_nested(m, I915_MM_SHRINKER) == 0)
                        *unlock = true;
-               }
                return *unlock;
 
        case MUTEX_TRYLOCK_SUCCESS: