[PATCH] drm/etnaviv: trick drm_mm into giving out a low IOVA

Wladimir J. van der Laan laanwj at gmail.com
Tue Dec 13 06:38:08 UTC 2016


On Mon, Dec 12, 2016 at 04:27:16PM +0100, Lucas Stach wrote:
> After rollover of the IOVA space, we want to get a low IOVA address,
> otherwise the the games we play by remembering the last IOVA are
> pointless. When we search for a free hole with DRM_MM_SEARCH_DEFAULT,
> drm_mm will pop the next entry from the free holes stack, which will
> likely be a high IOVA. By using DRM_MM_SEARCH_BELOW we can trick
> drm_mm into reversing the search and provide us with a low IOVA.
> 
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>

I can confirm this solves the MMU issue for me, thanks,

Reviewed-By: Wladimir van der Laan <laanwj at gmail.com>

Regards,
Wladimir

> ---
> This is intended to fix the GPU MMU fault on a <= 4.10 kernel. Later
> kernels will hopefully fix this by removing the IOVA gaming completely,
> but this will need some bigger re-writes of the code in question.
> ---
>  drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> index 169ac96e8f08..fe0e85b41310 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> @@ -116,9 +116,14 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu *mmu,
>  		struct list_head list;
>  		bool found;
>  
> +		/*
> +		 * XXX: The DRM_MM_SEARCH_BELOW is really a hack to trick
> +		 * drm_mm into giving out a low IOVA after address space
> +		 * rollover. This needs a proper fix.
> +		 */
>  		ret = drm_mm_insert_node_in_range(&mmu->mm, node,
>  			size, 0, mmu->last_iova, ~0UL,
> -			DRM_MM_SEARCH_DEFAULT);
> +			mmu->last_iova ? DRM_MM_SEARCH_DEFAULT : DRM_MM_SEARCH_BELOW);
>  
>  		if (ret != -ENOSPC)
>  			break;
> -- 
> 2.10.2
> 


More information about the etnaviv mailing list