drm/ttm/nouveau: don't call tt destroy callback on alloc failure.
authorDave Airlie <airlied@redhat.com>
Tue, 28 Jul 2020 04:17:36 +0000 (14:17 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jan 2022 08:01:01 +0000 (09:01 +0100)
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
[bwh: Backported to 4.14:
 - Drop change in ttm_sg_tt_init()
 - Adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/nouveau/nouveau_sgdma.c
drivers/gpu/drm/ttm/ttm_tt.c

index fde11ce466e45cca46ee81c611e9e345332ab525..495c4043467e86673ae29184972bfd5f919dd9a3 100644 (file)
@@ -106,12 +106,9 @@ nouveau_sgdma_create_ttm(struct ttm_bo_device *bdev,
        else
                nvbe->ttm.ttm.func = &nv50_sgdma_backend;
 
-       if (ttm_dma_tt_init(&nvbe->ttm, bdev, size, page_flags, dummy_read_page))
-               /*
-                * 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, bdev, size, page_flags, dummy_read_page)) {
+               kfree(nvbe);
                return NULL;
+       }
        return &nvbe->ttm.ttm;
 }
index 8ebc8d3560c3669aab85072877703f977e9cc3ef..fc8bdcc1541b6b3f7b1b2853d35a682de5689834 100644 (file)
@@ -199,7 +199,6 @@ int ttm_tt_init(struct ttm_tt *ttm, struct ttm_bo_device *bdev,
 
        ttm_tt_alloc_page_directory(ttm);
        if (!ttm->pages) {
-               ttm_tt_destroy(ttm);
                pr_err("Failed allocating page table\n");
                return -ENOMEM;
        }
@@ -232,7 +231,6 @@ int ttm_dma_tt_init(struct ttm_dma_tt *ttm_dma, struct ttm_bo_device *bdev,
        INIT_LIST_HEAD(&ttm_dma->pages_list);
        ttm_dma_tt_alloc_page_directory(ttm_dma);
        if (!ttm->pages) {
-               ttm_tt_destroy(ttm);
                pr_err("Failed allocating page table\n");
                return -ENOMEM;
        }