[Intel-gfx] [PATCH 1/2] drm/i915: Prefault the entire object on first page fault

Volkin, Bradley D bradley.d.volkin at intel.com
Wed Jun 11 22:41:45 CEST 2014


On Tue, Jun 10, 2014 at 04:14:40AM -0700, Chris Wilson wrote:
> Inserting additional PTEs has no side-effect for us as the pfn are fixed
> for the entire time the object is resident in the global GTT. The
> downside is that we pay the entire cost of faulting the object upon the
> first hit, for which we in return receive the benefit of removing the
> per-page faulting overhead.
> 
> On an Ivybridge i7-3720qm with 1600MHz DDR3, with 32 fences,
> Upload rate for 2 linear surfaces:	8127MiB/s -> 8134MiB/s
> Upload rate for 2 tiled surfaces:	8607MiB/s -> 8625MiB/s
> Upload rate for 4 linear surfaces:	8127MiB/s -> 8127MiB/s
> Upload rate for 4 tiled surfaces:	8611MiB/s -> 8602MiB/s
> Upload rate for 8 linear surfaces:	8114MiB/s -> 8124MiB/s
> Upload rate for 8 tiled surfaces:	8601MiB/s -> 8603MiB/s
> Upload rate for 16 linear surfaces:	8110MiB/s -> 8123MiB/s
> Upload rate for 16 tiled surfaces:	8595MiB/s -> 8606MiB/s
> Upload rate for 32 linear surfaces:	8104MiB/s -> 8121MiB/s
> Upload rate for 32 tiled surfaces:	8589MiB/s -> 8605MiB/s
> Upload rate for 64 linear surfaces:	8107MiB/s -> 8121MiB/s
> Upload rate for 64 tiled surfaces:	2013MiB/s -> 3017MiB/s
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: "Goel, Akash" <akash.goel at intel.com>

For reproducibility it would be nice to have the testcase info, assuming
it's something from i-g-t. Other than that, I think this change looks good.

Reviewed-by: Brad Volkin <bradley.d.volkin at intel.com>

> ---
>  drivers/gpu/drm/i915/i915_gem.c | 22 +++++++++++++++++-----
>  1 file changed, 17 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 3aaf7e01235e..e1f68f06c2ef 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -1704,14 +1704,26 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
>  	if (ret)
>  		goto unpin;
>  
> -	obj->fault_mappable = true;
> -
> +	/* Finally, remap it using the new GTT offset */
>  	pfn = dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj);
>  	pfn >>= PAGE_SHIFT;
> -	pfn += page_offset;
>  
> -	/* Finally, remap it using the new GTT offset */
> -	ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
> +	if (!obj->fault_mappable) {
> +		int i;
> +
> +		for (i = 0; i < obj->base.size >> PAGE_SHIFT; i++) {
> +			ret = vm_insert_pfn(vma,
> +					    (unsigned long)vma->vm_start + i * PAGE_SIZE,
> +					    pfn + i);
> +			if (ret)
> +				break;
> +		}
> +
> +		obj->fault_mappable = true;
> +	} else
> +		ret = vm_insert_pfn(vma,
> +				    (unsigned long)vmf->virtual_address,
> +				    pfn + page_offset);
>  unpin:
>  	i915_gem_object_ggtt_unpin(obj);
>  unlock:
> -- 
> 2.0.0
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



More information about the Intel-gfx mailing list