[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