aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem.c
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2014-11-12 09:40:35 -0500
committerJani Nikula <jani.nikula@intel.com>2014-12-18 08:46:47 -0500
commit5d77d9c5e177d2182df5d9fd61ba986facb64415 (patch)
tree41c6602a2650c5bbdc60edd71998eadacd739e74 /drivers/gpu/drm/i915/i915_gem.c
parent01f5a6261cea395f72877aeb7c2fe2d42e1b1e00 (diff)
drm/i915: add missing rpm ref to i915_gem_pwrite_ioctl
Without this RPM ref we can hit the device suspended WARN via: i915_gem_object_pin()->ggtt_bind_vma->gen6_ggtt_insert_entries(). I noticed this on my BYT while keeping the i915 device in runtime suspended state for a while. I chose this place to take the ref to avoid the possible deadlock via the mutex_lock taken both later in this function and in the runtime suspend handler. This can happen if an RPM suspend event is queued and need to be flushed before taking the RPM ref. Testcase: igt/pm_rpm/gem-evict-pwrite Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=87363 Signed-off-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 4a9faea626db..18f802d674cd 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1050,6 +1050,7 @@ int
1050i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, 1050i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
1051 struct drm_file *file) 1051 struct drm_file *file)
1052{ 1052{
1053 struct drm_i915_private *dev_priv = dev->dev_private;
1053 struct drm_i915_gem_pwrite *args = data; 1054 struct drm_i915_gem_pwrite *args = data;
1054 struct drm_i915_gem_object *obj; 1055 struct drm_i915_gem_object *obj;
1055 int ret; 1056 int ret;
@@ -1069,9 +1070,11 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
1069 return -EFAULT; 1070 return -EFAULT;
1070 } 1071 }
1071 1072
1073 intel_runtime_pm_get(dev_priv);
1074
1072 ret = i915_mutex_lock_interruptible(dev); 1075 ret = i915_mutex_lock_interruptible(dev);
1073 if (ret) 1076 if (ret)
1074 return ret; 1077 goto put_rpm;
1075 1078
1076 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); 1079 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
1077 if (&obj->base == NULL) { 1080 if (&obj->base == NULL) {
@@ -1123,6 +1126,9 @@ out:
1123 drm_gem_object_unreference(&obj->base); 1126 drm_gem_object_unreference(&obj->base);
1124unlock: 1127unlock:
1125 mutex_unlock(&dev->struct_mutex); 1128 mutex_unlock(&dev->struct_mutex);
1129put_rpm:
1130 intel_runtime_pm_put(dev_priv);
1131
1126 return ret; 1132 return ret;
1127} 1133}
1128 1134