<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div class="gmail_quote"><br>On Fri, Nov 25, 2016 at 6:34 AM, Mun Gwan-gyeong <span dir="ltr"><<a href="mailto:elongbug@gmail.com" target="_blank">elongbug@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">When the memfd_create() and u_vector_init() fail on anv_block_pool_init(),<br>
this patch makes to return VK_ERROR_INITIALIZATION_<wbr>FAILED.<br>
All of initialization success on anv_block_pool_init(), it makes to return<br>
VK_SUCCESS.<br>
<br>
CID 1394319<br>
<br>
v2: Fixes from Emil's review:<br>
  a) Add the return type for propagating the return value to caller.<br>
  b) Changed anv_block_pool_init() to return VK_ERROR_INITIALIZATION_FAILED<br>
     on failure of initialization.<br>
<br>
Signed-off-by: Mun Gwan-gyeong <<a href="mailto:elongbug@gmail.com">elongbug@gmail.com</a>><br>
---<br>
 src/intel/vulkan/anv_<wbr>allocator.c | 27 +++++++++++++++++++++------<br>
 src/intel/vulkan/anv_private.h   |  4 ++--<br>
 2 files changed, 23 insertions(+), 8 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_<wbr>allocator.c b/src/intel/vulkan/anv_<wbr>allocator.c<br>
index f472213..45c663b 100644<br>
--- a/src/intel/vulkan/anv_<wbr>allocator.c<br>
+++ b/src/intel/vulkan/anv_<wbr>allocator.c<br>
@@ -246,10 +246,12 @@ anv_ptr_free_list_push(void **list, void *elem)<br>
 static uint32_t<br>
 anv_block_pool_grow(struct anv_block_pool *pool, struct anv_block_state *state);<br>
<br>
-void<br>
+VkResult<br>
 anv_block_pool_init(struct anv_block_pool *pool,<br>
                     struct anv_device *device, uint32_t block_size)<br>
 {<br>
+   VkResult result;<br>
+<br>
    assert(util_is_power_of_two(<wbr>block_size));<br>
<br>
    pool->device = device;<br>
@@ -260,17 +262,23 @@ anv_block_pool_init(struct anv_block_pool *pool,<br>
<br>
    pool->fd = memfd_create("block pool", MFD_CLOEXEC);<br>
    if (pool->fd == -1)<br>
-      return;<br>
+      return vk_error(VK_ERROR_<wbr>INITIALIZATION_FAILED);<br>
<br>
    /* Just make it 2GB up-front.  The Linux kernel won't actually back it<br>
     * with pages until we either map and fault on one of them or we use<br>
     * userptr and send a chunk of it off to the GPU.<br>
     */<br>
-   if (ftruncate(pool->fd, BLOCK_POOL_MEMFD_SIZE) == -1)<br>
-      return;<br>
+   if (ftruncate(pool->fd, BLOCK_POOL_MEMFD_SIZE) == -1) {<br>
+      result = vk_error(VK_ERROR_<wbr>INITIALIZATION_FAILED);<br>
+      goto fail_fd;<br>
+   }<br>
<br>
-   u_vector_init(&pool->mmap_<wbr>cleanups,<br>
-                   round_to_power_of_two(sizeof(<wbr>struct anv_mmap_cleanup)), 128);<br>
+   if (!u_vector_init(&pool->mmap_<wbr>cleanups,<br>
+                      round_to_power_of_two(sizeof(<wbr>struct anv_mmap_cleanup)),<br>
+                      128)) {<br>
+      result = vk_error(VK_ERROR_<wbr>INITIALIZATION_FAILED);<br>
+      goto fail_fd;<br>
+   }<br>
<br>
    pool->state.next = 0;<br>
    pool->state.end = 0;<br>
@@ -279,6 +287,13 @@ anv_block_pool_init(struct anv_block_pool *pool,<br>
<br>
    /* Immediately grow the pool so we'll have a backing bo. */<br>
    pool->state.end = anv_block_pool_grow(pool, &pool->state);<br>
+<br>
+   return VK_SUCCESS;<br>
+<br>
+ fail_fd:<br>
+   close(pool->fd);<br>
+<br>
+   return result;<br>
 }<br>
<br>
 void<br>
diff --git a/src/intel/vulkan/anv_<wbr>private.h b/src/intel/vulkan/anv_<wbr>private.h<br>
index 2fc543d..a7c31e3 100644<br>
--- a/src/intel/vulkan/anv_<wbr>private.h<br>
+++ b/src/intel/vulkan/anv_<wbr>private.h<br>
@@ -432,8 +432,8 @@ anv_state_clflush(struct anv_state state)<br>
    anv_clflush_range(state.map, state.alloc_size);<br>
 }<br>
<br>
-void anv_block_pool_init(struct anv_block_pool *pool,<br>
-                         struct anv_device *device, uint32_t block_size);<br>
+VkResult anv_block_pool_init(struct anv_block_pool *pool,<br>
+                             struct anv_device *device, uint32_t block_size);<br>
 void anv_block_pool_finish(struct anv_block_pool *pool);<br>
 int32_t anv_block_pool_alloc(struct anv_block_pool *pool);<br>
 int32_t anv_block_pool_alloc_back(<wbr>struct anv_block_pool *pool);<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.10.2<br>
<br>
</font></span></blockquote></div><br></div></div>