diff mbox

drm/i915: Add missing rpm wakelock to GGTT pread

Message ID 1470298193-21765-1-git-send-email-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show

Commit Message

Chris Wilson Aug. 4, 2016, 8:09 a.m. UTC
Joonas spotted a discrepancy between the pwrite and pread ioctls, in
that pwrite takes the rpm wakelock around its GGTT access, The wakelock
is required in order for the GTT to function. In disregard for the
current convention, we take the rpm wakelock around the access itself
rather than around the struct_mutex as the nesting is not strictly
required and such ordering will one day be fixed by explicitly noting
the barrier dependencies between the GGTT and rpm.

Fixes: b50a53715f09 ("drm/i915: Support for pread/pwrite ...")
Reported-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Ankitprasad Sharma <ankitprasad.r.sharma@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: drm-intel-fixes@lists.freedesktop.org
---
 drivers/gpu/drm/i915/i915_gem.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Joonas Lahtinen Aug. 4, 2016, 8:41 a.m. UTC | #1
On to, 2016-08-04 at 09:09 +0100, Chris Wilson wrote:
> Joonas spotted a discrepancy between the pwrite and pread ioctls, in
> that pwrite takes the rpm wakelock around its GGTT access, The wakelock
> is required in order for the GTT to function. In disregard for the
> current convention, we take the rpm wakelock around the access itself
> rather than around the struct_mutex as the nesting is not strictly
> required and such ordering will one day be fixed by explicitly noting
> the barrier dependencies between the GGTT and rpm.
> 
> Fixes: b50a53715f09 ("drm/i915: Support for pread/pwrite ...")
> Reported-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>

Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>

> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Ankitprasad Sharma <ankitprasad.r.sharma@intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Cc: drm-intel-fixes@lists.freedesktop.org
> ---
>  drivers/gpu/drm/i915/i915_gem.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 9bef2c0803a5..9cb838ef8d02 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -887,9 +887,12 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
>  	ret = i915_gem_shmem_pread(dev, obj, args, file);
>  
>  	/* pread for non shmem backed objects */
> -	if (ret == -EFAULT || ret == -ENODEV)
> +	if (ret == -EFAULT || ret == -ENODEV) {
> +		intel_runtime_pm_get(to_i915(dev));
>  		ret = i915_gem_gtt_pread(dev, obj, args->size,
>  					args->offset, args->data_ptr);
> +		intel_runtime_pm_put(to_i915(dev));
> +	}
>  
>  out:
>  	i915_gem_object_put(obj);
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 9bef2c0803a5..9cb838ef8d02 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -887,9 +887,12 @@  i915_gem_pread_ioctl(struct drm_device *dev, void *data,
 	ret = i915_gem_shmem_pread(dev, obj, args, file);
 
 	/* pread for non shmem backed objects */
-	if (ret == -EFAULT || ret == -ENODEV)
+	if (ret == -EFAULT || ret == -ENODEV) {
+		intel_runtime_pm_get(to_i915(dev));
 		ret = i915_gem_gtt_pread(dev, obj, args->size,
 					args->offset, args->data_ptr);
+		intel_runtime_pm_put(to_i915(dev));
+	}
 
 out:
 	i915_gem_object_put(obj);