anv/allocator: Create 2GB memfd up-front for the block pool
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 15 Sep 2015 23:54:56 +0000 (16:54 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 18 Sep 2015 00:44:20 +0000 (17:44 -0700)
src/vulkan/anv_allocator.c
src/vulkan/anv_private.h

index 201cc931cbb4040084c5eb253919047a5e687ee3..1b116a3a49a681a06783a024740c6a0a989fb507 100644 (file)
@@ -254,6 +254,18 @@ anv_block_pool_init(struct anv_block_pool *pool,
    pool->bo.offset = 0;
    pool->block_size = block_size;
    pool->free_list = ANV_FREE_LIST_EMPTY;
+
+   pool->fd = memfd_create("block pool", MFD_CLOEXEC);
+   if (pool->fd == -1)
+      return;
+
+   /* 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;
+
    anv_vector_init(&pool->mmap_cleanups,
                    round_to_power_of_two(sizeof(struct anv_mmap_cleanup)), 128);
 
@@ -300,15 +312,6 @@ anv_block_pool_grow(struct anv_block_pool *pool, uint32_t old_size)
       goto fail;
    *cleanup = ANV_MMAP_CLEANUP_INIT;
 
-   if (old_size == 0)
-      pool->fd = memfd_create("block pool", MFD_CLOEXEC);
-
-   if (pool->fd == -1)
-      goto fail;
-
-   if (ftruncate(pool->fd, size) == -1)
-      goto fail;
-
    /* First try to see if mremap can grow the map in place. */
    map = MAP_FAILED;
    if (old_size > 0)
index 5e4fa35e208b548104c536e605f8919017a76418..5931e0af98d6c37ef36d108d685f7807a31c3ee8 100644 (file)
@@ -268,6 +268,9 @@ struct anv_block_pool {
    struct anv_block_state state;
 };
 
+/* Block pools are backed by a fixed-size 2GB memfd */
+#define BLOCK_POOL_MEMFD_SIZE (1ull << 32)
+
 static inline uint32_t
 anv_block_pool_size(struct anv_block_pool *pool)
 {