[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