anv/allocator: Take the device mutex when growing a block pool
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 15 Sep 2015 21:52:26 +0000 (14:52 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 18 Sep 2015 00:44:20 +0000 (17:44 -0700)
commit74bf7aa07c0e87cafb1a9fb085a2fe99a548c8de
treedf314392b2cc040870b69f4c5b4a10387fd0b8b9
parent222ddac810fae965507b16702eb4e4c6eee97e16
anv/allocator: Take the device mutex when growing a block pool

We don't have any locking issues yet because we use the pool size itself as
a mutex in block_pool_alloc to guarantee that only one thread is resizing
at a time.  However, we are about to add support for growing the block pool
at both ends.  This introduces two potential races:

 1) You could have two block_pool_alloc() calls that both try to grow the
    block pool, one from each end.

 2) The relocation handling code will now have to think about not only the
    bo that we use for the block pool but also the offset from the start of
    that bo to the center of the block pool.  It's possible that the block
    pool growing code could race with the relocation handling code and get
    a bo and offset out of sync.

Grabbing the device mutex solves both of these problems.  Thanks to (2), we
can't really do anything more granular.
src/vulkan/anv_allocator.c
src/vulkan/tests/block_pool_no_free.c
src/vulkan/tests/state_pool.c
src/vulkan/tests/state_pool_free_list_only.c
src/vulkan/tests/state_pool_no_free.c