[Intel-gfx] [PATCH 06/15] drm/i915: align 64K objects to 2M

Chris Wilson chris at chris-wilson.co.uk
Thu Jun 1 09:55:05 UTC 2017


On Wed, May 31, 2017 at 07:52:01PM +0100, Matthew Auld wrote:
> We can't mix 64K and 4K pte's in the same page-table, so for now we
> align 64K objects to 2M to avoid any potential mixing. This is
> potentially wasteful but in reality shouldn't be too bad since this only
> applies to the virtual address space of a 48b PPGTT.
> 
> Suggested-by: Chris Wilson <chris at chris-wilson.co.uk>
> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_vma.c | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
> index c355ccb01872..af950d92fa13 100644
> --- a/drivers/gpu/drm/i915/i915_vma.c
> +++ b/drivers/gpu/drm/i915/i915_vma.c
> @@ -479,6 +479,15 @@ i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
>  			goto err_unpin;
>  		}
>  
> +		/* A current limitation in our implementation is that 64K
> +		 * objects must be aligned to 2M, and given that we can't
> +		 * enforce this for soft pinning, we need to fallback to normal
> +		 * pages if don't meet this restriction.
> +		 */
> +		if (obj->mm.page_sizes.sg == I915_GTT_PAGE_SIZE_64K &&

page_sizes.sg > I915_GTT_PAGE_SIZE_4K.

> +		    !IS_ALIGNED(offset | size, I915_GTT_PAGE_SIZE_2M))

Abusing the semantics of PAGE_SIZE_2M. It just happens to be the value
you want, but it doesn't mean what you say.

> +			obj->mm.page_sizes.sg = I915_GTT_PAGE_SIZE;
> +
>  		ret = i915_gem_gtt_reserve(vma->vm, &vma->node,
>  					   size, offset, obj->cache_level,
>  					   flags);
> @@ -493,6 +502,15 @@ i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
>  			if (!is_power_of_2(page_alignment))
>  				page_alignment = BIT(fls64(page_alignment)-1);
>  
> +			/* We can't mix 64K and 4K pte's in the same page-table (2M
> +			 * block), and so to avoid the ugliness and complexity of
> +			 * coloring we opt for just aligning 64K objects to 2M.
> +			 */
> +			if (obj->mm.page_sizes.sg == I915_GTT_PAGE_SIZE_64K) {

page_sizes.sg & SIZE_64K or page_sizes.sg > SIZE_4K

Also refer to earlier discussion that this should be vma->page_sizes
here not obj.

> +				page_alignment = I915_GTT_PAGE_SIZE_2M;
> +				size = roundup(size, page_alignment);

round_up.

> +			}
> +
>  			alignment = max_t(typeof(alignment), alignment,
>  					  page_alignment);
>  		}
> -- 
> 2.9.4
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list