Re: [Mesa-dev] [PATCH 1/5] anv: Add missing error-checking to anv_block_pool_init (v2)

2016-11-25 Thread Jason Ekstrand
Reviewed-by: Jason Ekstrand 

On Fri, Nov 25, 2016 at 6:34 AM, Mun Gwan-gyeong  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 
> ---
>  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(>mmap_cleanups,
> -   round_to_power_of_two(sizeof(struct
> anv_mmap_cleanup)), 128);
> +   if (!u_vector_init(>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, >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
>
>
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/5] anv: Add missing error-checking to anv_block_pool_init (v2)

2016-11-25 Thread Mun Gwan-gyeong
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 
---
 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(>mmap_cleanups,
-   round_to_power_of_two(sizeof(struct anv_mmap_cleanup)), 
128);
+   if (!u_vector_init(>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, >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

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev