| From 5de5b6ecf97a021f29403aa272cb4e03318ef586 Mon Sep 17 00:00:00 2001 |
| From: Dave Airlie <airlied@redhat.com> |
| Date: Tue, 28 Jul 2020 14:17:36 +1000 |
| Subject: drm/ttm/nouveau: don't call tt destroy callback on alloc failure. |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Dave Airlie <airlied@redhat.com> |
| |
| commit 5de5b6ecf97a021f29403aa272cb4e03318ef586 upstream. |
| |
| This is confusing, and from my reading of all the drivers only |
| nouveau got this right. |
| |
| Just make the API act under driver control of it's own allocation |
| failing, and don't call destroy, if the page table fails to |
| create there is nothing to cleanup here. |
| |
| (I'm willing to believe I've missed something here, so please |
| review deeply). |
| |
| Reviewed-by: Christian König <christian.koenig@amd.com> |
| Signed-off-by: Dave Airlie <airlied@redhat.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20200728041736.20689-1-airlied@gmail.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/nouveau/nouveau_sgdma.c | 9 +++------ |
| drivers/gpu/drm/ttm/ttm_tt.c | 3 --- |
| 2 files changed, 3 insertions(+), 9 deletions(-) |
| |
| --- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c |
| +++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c |
| @@ -96,12 +96,9 @@ nouveau_sgdma_create_ttm(struct ttm_buff |
| else |
| nvbe->ttm.ttm.func = &nv50_sgdma_backend; |
| |
| - if (ttm_dma_tt_init(&nvbe->ttm, bo, page_flags)) |
| - /* |
| - * A failing ttm_dma_tt_init() will call ttm_tt_destroy() |
| - * and thus our nouveau_sgdma_destroy() hook, so we don't need |
| - * to free nvbe here. |
| - */ |
| + if (ttm_dma_tt_init(&nvbe->ttm, bo, page_flags)) { |
| + kfree(nvbe); |
| return NULL; |
| + } |
| return &nvbe->ttm.ttm; |
| } |
| --- a/drivers/gpu/drm/ttm/ttm_tt.c |
| +++ b/drivers/gpu/drm/ttm/ttm_tt.c |
| @@ -242,7 +242,6 @@ int ttm_tt_init(struct ttm_tt *ttm, stru |
| ttm_tt_init_fields(ttm, bo, page_flags); |
| |
| if (ttm_tt_alloc_page_directory(ttm)) { |
| - ttm_tt_destroy(ttm); |
| pr_err("Failed allocating page table\n"); |
| return -ENOMEM; |
| } |
| @@ -266,7 +265,6 @@ int ttm_dma_tt_init(struct ttm_dma_tt *t |
| |
| INIT_LIST_HEAD(&ttm_dma->pages_list); |
| if (ttm_dma_tt_alloc_page_directory(ttm_dma)) { |
| - ttm_tt_destroy(ttm); |
| pr_err("Failed allocating page table\n"); |
| return -ENOMEM; |
| } |
| @@ -288,7 +286,6 @@ int ttm_sg_tt_init(struct ttm_dma_tt *tt |
| else |
| ret = ttm_dma_tt_alloc_page_directory(ttm_dma); |
| if (ret) { |
| - ttm_tt_destroy(ttm); |
| pr_err("Failed allocating page table\n"); |
| return -ENOMEM; |
| } |