anv/allocator: Move the alignment assert for the pointer free list
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 8 Mar 2016 05:22:46 +0000 (21:22 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 8 Mar 2016 06:23:44 +0000 (22:23 -0800)
Previously we asserted every time you tried to pack a pointer and a counter
together.  However, this wasn't really correct.  In the case where you try
to grab the last element of the list, the "next elemnet" value you get may
be bogus if someonoe else got there first.  This was leading to assertion
failures even though the allocator would safely fall through to the failure
case below.

src/intel/vulkan/anv_allocator.c

index d7c09103344c07b0d07a4e8c355d7fc63e7d067f..385c63f99458095c73b7e942ea3a2d111254e003 100644 (file)
@@ -200,7 +200,6 @@ anv_free_list_push(union anv_free_list *list, void *map, int32_t offset)
 #define PFL_COUNT(x) ((uintptr_t)(x) & 0xfff)
 #define PFL_PTR(x) ((void *)((uintptr_t)(x) & ~0xfff))
 #define PFL_PACK(ptr, count) ({           \
-   assert(((uintptr_t)(ptr) & 0xfff) == 0); \
    (void *)((uintptr_t)(ptr) | (uintptr_t)((count) & 0xfff)); \
 })
 
@@ -230,6 +229,12 @@ anv_ptr_free_list_push(void **list, void *elem)
    void *old, *current;
    void **next_ptr = elem;
 
+   /* The pointer-based free list requires that the pointer be
+    * page-aligned.  This is because we use the bottom 12 bits of the
+    * pointer to store a counter to solve the ABA concurrency problem.
+    */
+   assert(((uintptr_t)elem & 0xfff) == 0);
+
    old = *list;
    do {
       current = old;