[Intel-gfx] [PATCH 3/5] drm/i915: fall through pwrite_gtt_slow to the shmem slow path
Chris Wilson
chris at chris-wilson.co.uk
Sat Sep 17 22:57:05 CEST 2011
On Sat, 17 Sep 2011 20:55:47 +0200, Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
> The gtt_pwrite slowpath grabs the userspace memory with
> get_user_pages. This will not work for non-page backed memory, like a
> gtt mmapped gem object. Hence fall throuh to the shmem paths if we hit
> -EFAULT in the gtt paths.
>
> Now the shmem paths have exactly the same problem, but this way we
> only need to rearrange the code in one write path.
>
> Signed-Off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
> drivers/gpu/drm/i915/i915_gem.c | 24 +++++++++++++++---------
> 1 files changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index e0475ca..9c28d48 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -1018,18 +1018,24 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
>
> out_unpin:
> i915_gem_object_unpin(obj);
> - } else {
> - ret = i915_gem_object_set_to_cpu_domain(obj, 1);
> - if (ret)
> - goto out;
>
> - ret = -EFAULT;
> - if (!i915_gem_object_needs_bit17_swizzle(obj))
> - ret = i915_gem_shmem_pwrite_fast(dev, obj, args, file);
> - if (ret == -EFAULT)
> - ret = i915_gem_shmem_pwrite_slow(dev, obj, args, file);
> + if (ret != -EFAULT)
> + goto out;
> + /* Fall through to the shmfs paths because the gtt paths might
> + * fail with non-page-backed user pointers (e.g. gtt mappings
> + * when moving data between textures). */
> }
I'd actually prefer to have an
if (ret == -EFAULT) {
and comments here in order to mark the shmem paths as a logical unit to the
reader. Better yet would be to move the two paths (GTT/CPU) into their own
routines:
ret = -EFAULT;
if (can_gtt)
ret = i915_gem_gtt_pwrite();
/* Fallback to the slow shmem paths if we need to handle
* GTT mapped user pointers, or otherwise can not do the upload in
* place.
*/
if (ret == -EFAULT)
ret = i915_gem_cpu_pwrite();
And whilst you are here, can you incorporate this patch?
else if (obj->gtt_space &&
+ obj->map_and_fenceable &&
obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
ret = i915_gem_object_pin(obj, 0, true);
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list