[Mesa-dev] [PATCH 1/5] anv: Add missing error-checking to anv_block_pool_init (v2)
Jason Ekstrand
jason at jlekstrand.net
Sat Nov 26 05:29:13 UTC 2016
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
On Fri, Nov 25, 2016 at 6:34 AM, Mun Gwan-gyeong <elongbug at gmail.com> wrote:
> When the memfd_create() and u_vector_init() fail on anv_block_pool_init(),
> this patch makes to return VK_ERROR_INITIALIZATION_FAILED.
> All of initialization success on anv_block_pool_init(), it makes to return
> VK_SUCCESS.
>
> CID 1394319
>
> v2: Fixes from Emil's review:
> a) Add the return type for propagating the return value to caller.
> b) Changed anv_block_pool_init() to return VK_ERROR_INITIALIZATION_FAILED
> on failure of initialization.
>
> Signed-off-by: Mun Gwan-gyeong <elongbug at gmail.com>
> ---
> src/intel/vulkan/anv_allocator.c | 27 +++++++++++++++++++++------
> src/intel/vulkan/anv_private.h | 4 ++--
> 2 files changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_
> allocator.c
> index f472213..45c663b 100644
> --- a/src/intel/vulkan/anv_allocator.c
> +++ b/src/intel/vulkan/anv_allocator.c
> @@ -246,10 +246,12 @@ anv_ptr_free_list_push(void **list, void *elem)
> static uint32_t
> anv_block_pool_grow(struct anv_block_pool *pool, struct anv_block_state
> *state);
>
> -void
> +VkResult
> anv_block_pool_init(struct anv_block_pool *pool,
> struct anv_device *device, uint32_t block_size)
> {
> + VkResult result;
> +
> assert(util_is_power_of_two(block_size));
>
> pool->device = device;
> @@ -260,17 +262,23 @@ anv_block_pool_init(struct anv_block_pool *pool,
>
> pool->fd = memfd_create("block pool", MFD_CLOEXEC);
> if (pool->fd == -1)
> - return;
> + return vk_error(VK_ERROR_INITIALIZATION_FAILED);
>
> /* Just make it 2GB up-front. The Linux kernel won't actually back it
> * with pages until we either map and fault on one of them or we use
> * userptr and send a chunk of it off to the GPU.
> */
> - if (ftruncate(pool->fd, BLOCK_POOL_MEMFD_SIZE) == -1)
> - return;
> + if (ftruncate(pool->fd, BLOCK_POOL_MEMFD_SIZE) == -1) {
> + result = vk_error(VK_ERROR_INITIALIZATION_FAILED);
> + goto fail_fd;
> + }
>
> - u_vector_init(&pool->mmap_cleanups,
> - round_to_power_of_two(sizeof(struct
> anv_mmap_cleanup)), 128);
> + if (!u_vector_init(&pool->mmap_cleanups,
> + round_to_power_of_two(sizeof(struct
> anv_mmap_cleanup)),
> + 128)) {
> + result = vk_error(VK_ERROR_INITIALIZATION_FAILED);
> + goto fail_fd;
> + }
>
> pool->state.next = 0;
> pool->state.end = 0;
> @@ -279,6 +287,13 @@ anv_block_pool_init(struct anv_block_pool *pool,
>
> /* Immediately grow the pool so we'll have a backing bo. */
> pool->state.end = anv_block_pool_grow(pool, &pool->state);
> +
> + return VK_SUCCESS;
> +
> + fail_fd:
> + close(pool->fd);
> +
> + return result;
> }
>
> void
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_
> private.h
> index 2fc543d..a7c31e3 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -432,8 +432,8 @@ anv_state_clflush(struct anv_state state)
> anv_clflush_range(state.map, state.alloc_size);
> }
>
> -void anv_block_pool_init(struct anv_block_pool *pool,
> - struct anv_device *device, uint32_t block_size);
> +VkResult anv_block_pool_init(struct anv_block_pool *pool,
> + struct anv_device *device, uint32_t
> block_size);
> void anv_block_pool_finish(struct anv_block_pool *pool);
> int32_t anv_block_pool_alloc(struct anv_block_pool *pool);
> int32_t anv_block_pool_alloc_back(struct anv_block_pool *pool);
> --
> 2.10.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161125/6e2e7bb5/attachment.html>
More information about the mesa-dev
mailing list