diff --git a/src/gallium/drivers/panfrost/pan_bo.c b/src/gallium/drivers/panfrost/pan_bo.c index ac340124a4f..61f92c6135c 100644 --- a/src/gallium/drivers/panfrost/pan_bo.c +++ b/src/gallium/drivers/panfrost/pan_bo.c @@ -80,7 +80,9 @@ panfrost_bo_alloc(struct panfrost_device *dev, size_t size, uint32_t flags, kmod_bo = pan_kmod_bo_alloc(dev->kmod.dev, exclusive_vm, size, to_kmod_bo_flags(flags)); - assert(kmod_bo); + + if (kmod_bo == NULL) + goto err_alloc; bo = pan_lookup_bo(dev, kmod_bo->handle); assert(!memcmp(bo, &((struct panfrost_bo){0}), sizeof(*bo))); @@ -100,15 +102,23 @@ panfrost_bo_alloc(struct panfrost_device *dev, size_t size, uint32_t flags, }, }; - ASSERTED int ret = + int ret = pan_kmod_vm_bind(dev->kmod.vm, PAN_KMOD_VM_OP_MODE_IMMEDIATE, &vm_op, 1); - assert(!ret); + + if (ret) + goto err_bind; bo->ptr.gpu = vm_op.va.start; bo->flags = flags; bo->dev = dev; bo->label = label; return bo; +err_bind: + pan_kmod_bo_put(kmod_bo); + /* BO will be freed with the sparse array, but zero to indicate free */ + memset(bo, 0, sizeof(*bo)); +err_alloc: + return NULL; } static void @@ -383,10 +393,8 @@ panfrost_bo_create(struct panfrost_device *dev, size_t size, uint32_t flags, bo = panfrost_bo_alloc(dev, size, flags, label); } - if (!bo) { - unreachable("BO creation failed. We don't handle that yet."); + if (!bo) return NULL; - } /* Only mmap now if we know we need to. For CPU-invisible buffers, we * never map since we don't care about their contents; they're purely diff --git a/src/gallium/drivers/panfrost/pan_device.c b/src/gallium/drivers/panfrost/pan_device.c index 17397c6a3bf..9c891b78788 100644 --- a/src/gallium/drivers/panfrost/pan_device.c +++ b/src/gallium/drivers/panfrost/pan_device.c @@ -127,6 +127,7 @@ panfrost_open_device(void *memctx, int fd, struct panfrost_device *dev) if (dev->arch < 10) { dev->tiler_heap = panfrost_bo_create( dev, 128 * 1024 * 1024, PAN_BO_INVISIBLE | PAN_BO_GROWABLE, "Tiler heap"); + assert(dev->tiler_heap); } pthread_mutex_init(&dev->submit_lock, NULL); @@ -134,6 +135,8 @@ panfrost_open_device(void *memctx, int fd, struct panfrost_device *dev) /* Done once on init */ dev->sample_positions = panfrost_bo_create( dev, panfrost_sample_positions_buffer_size(), 0, "Sample positions"); + assert(dev->sample_positions); + panfrost_upload_sample_positions(dev->sample_positions->ptr.cpu); return; diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index 4733cd5d680..ba32c68ab25 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -399,6 +399,7 @@ panfrost_batch_create_bo(struct panfrost_batch *batch, size_t size, bo = panfrost_bo_create(pan_device(batch->ctx->base.screen), size, create_flags, label); + assert(bo); panfrost_batch_add_bo(batch, bo, stage); /* panfrost_batch_add_bo() has retained a reference and diff --git a/src/gallium/drivers/panfrost/pan_mempool.c b/src/gallium/drivers/panfrost/pan_mempool.c index e3a54f51c9e..d4d38962e7b 100644 --- a/src/gallium/drivers/panfrost/pan_mempool.c +++ b/src/gallium/drivers/panfrost/pan_mempool.c @@ -54,6 +54,7 @@ panfrost_pool_alloc_backing(struct panfrost_pool *pool, size_t bo_sz) */ struct panfrost_bo *bo = panfrost_bo_create(pool->dev, bo_sz, pool->create_flags, pool->label); + assert(bo); if (pool->owned) util_dynarray_append(&pool->bos, struct panfrost_bo *, bo); diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index c2371d49e03..58f3d9f031f 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -714,6 +714,10 @@ panfrost_resource_create_with_modifier(struct pipe_screen *screen, struct panfrost_device *dev = pan_device(screen); struct panfrost_resource *so = CALLOC_STRUCT(panfrost_resource); + + if (!so) + return NULL; + so->base = *template; so->base.screen = screen; @@ -802,7 +806,7 @@ panfrost_resource_create_with_modifier(struct pipe_screen *screen, if (!so->scanout) { fprintf(stderr, "Failed to create scanout resource\n"); - free(so); + FREE(so); return NULL; } assert(handle.type == WINSYS_HANDLE_TYPE_FD); @@ -810,7 +814,7 @@ panfrost_resource_create_with_modifier(struct pipe_screen *screen, close(handle.handle); if (!so->bo) { - free(so); + FREE(so); return NULL; } @@ -826,6 +830,12 @@ panfrost_resource_create_with_modifier(struct pipe_screen *screen, so->bo = panfrost_bo_create(dev, so->image.layout.data_size, flags, label); + + if (!so->bo) { + FREE(so); + return NULL; + } + so->image.data.base = so->bo->ptr.gpu; so->constant_stencil = true; @@ -1562,6 +1572,7 @@ panfrost_get_afbc_superblock_sizes(struct panfrost_context *ctx, panfrost_flush_batches_accessing_rsrc(ctx, rsrc, "AFBC before size flush"); batch = panfrost_get_fresh_batch_for_fbo(ctx, "AFBC superblock sizes"); bo = panfrost_bo_create(dev, metadata_size, 0, "AFBC superblock sizes"); + assert(bo); for (int level = first_level; level <= last_level; ++level) { unsigned offset = out_offsets[level - first_level]; @@ -1658,6 +1669,7 @@ panfrost_pack_afbc(struct panfrost_context *ctx, struct panfrost_bo *dst = panfrost_bo_create(dev, new_size, 0, "AFBC compact texture"); + assert(dst); struct panfrost_batch *batch = panfrost_get_fresh_batch_for_fbo(ctx, "AFBC compaction");