anv/block_pool: Ensure allocations have contiguous maps
authorJason Ekstrand <jason@jlekstrand.net>
Tue, 28 Jan 2020 23:42:31 +0000 (17:42 -0600)
committerJason Ekstrand <jason@jlekstrand.net>
Wed, 29 Jan 2020 15:43:42 +0000 (09:43 -0600)
commite3f1a08c5641a6b100371a3c17f0b484e1da9b68
treeaa3a87a172bc4cd7d89e53e1ef7b6c2a5b9b7e79
parentee4cdef9aeb7f2c576d9e6a31b1f07351829b795
anv/block_pool: Ensure allocations have contiguous maps

Because softpin block pools are made up of a set of BOs with different
maps, it was possible for a single state to end up straddling blocks.
To fix this, we pass a contiguous size to anv_block_pool_grow and it
ensures that the next allocation in the pool will have at least that
size.

We also add an assert in anv_block_pool_map to ensure we always get
contiguous maps.  Prior to the changes to anv_block_pool_grow, the unit
tests failed with this assert.  With this patch, the tests pass.

This was causing problems on Gen12 where we allocate the pages for the
AUX table from the dynamic state pool.  The first chunk, which gets
allocated very early in the pool's history, is 1MB which was enough that
it was getting multiple BOs.  This caused the gen_aux_map code to write
outside of the map and overwrite the instruction state pool buffer which
lead to GPU hangs.

Fixes: 731c4adcf9b "anv/allocator: Add support for non-userptr"
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/vulkan/anv_allocator.c
src/intel/vulkan/anv_private.h
src/intel/vulkan/genX_blorp_exec.c
src/intel/vulkan/tests/block_pool_grow_first.c
src/intel/vulkan/tests/block_pool_no_free.c