[PATCH] drm/amdgpu: fix VM page table reference counting

Alex Deucher alexdeucher at gmail.com
Mon Nov 30 11:42:21 PST 2015


On Fri, Nov 27, 2015 at 10:49 AM, Christian König
<deathsimple at vodafone.de> wrote:
> From: Christian König <christian.koenig at amd.com>
>
> We use the reservation object of the page directory for the page tables as
> well, because of this the page directory should be freed last. Ensure that
> by keeping a reference from the page tables to the directory.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>

Applied.  Thanks!

Alex

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h        | 1 +
>  drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 1 +
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c     | 5 +++++
>  3 files changed, 7 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 306f757..595bb86 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -538,6 +538,7 @@ struct amdgpu_bo {
>         /* Constant after initialization */
>         struct amdgpu_device            *adev;
>         struct drm_gem_object           gem_base;
> +       struct amdgpu_bo                *parent;
>
>         struct ttm_bo_kmap_obj          dma_buf_vmap;
>         pid_t                           pid;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index 0d52438..c3ce103 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -100,6 +100,7 @@ static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
>         list_del_init(&bo->list);
>         mutex_unlock(&bo->adev->gem.mutex);
>         drm_gem_object_release(&bo->gem_base);
> +       amdgpu_bo_unref(&bo->parent);
>         kfree(bo->metadata);
>         kfree(bo);
>  }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 159ce54..9acdf50 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -1076,6 +1076,11 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
>                 if (r)
>                         goto error_free;
>
> +               /* Keep a reference to the page table to avoid freeing
> +                * them up in the wrong order.
> +                */
> +               pt->parent = amdgpu_bo_ref(vm->page_directory);
> +
>                 r = amdgpu_vm_clear_bo(adev, pt);
>                 if (r) {
>                         amdgpu_bo_unref(&pt);
> --
> 2.5.0
>


More information about the dri-devel mailing list