Mesa (master): util/sparse_array: don't stomp head's counter on pop operations
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Apr 17 19:03:53 UTC 2020
Module: Mesa
Branch: master
Commit: dc3a17997b479f91f36b2421e9c41c11a025de47
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dc3a17997b479f91f36b2421e9c41c11a025de47
Author: D Scott Phillips <d.scott.phillips at intel.com>
Date: Fri Apr 17 10:28:06 2020 -0700
util/sparse_array: don't stomp head's counter on pop operations
By temporarily storing the new_head by a uint32_t, we wipe out the
counter section of the head pointer.
Fixes: e4f01eca ("util: Add a free list structure for use with util_sparse_array")
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Rafael Antognolli <rafael.antognolli at intel.com>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4612>
---
src/util/sparse_array.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/util/sparse_array.c b/src/util/sparse_array.c
index 61dbd2acdff..0c04fd0d6dc 100644
--- a/src/util/sparse_array.c
+++ b/src/util/sparse_array.c
@@ -270,7 +270,7 @@ util_sparse_array_free_list_pop_idx(struct util_sparse_array_free_list *fl)
uint32_t head_idx = current_head; /* Index is the bottom 32 bits */
void *head_elem = util_sparse_array_get(fl->arr, head_idx);
uint32_t *head_next = (uint32_t *)((char *)head_elem + fl->next_offset);
- uint32_t new_head = free_list_head(current_head, *head_next);
+ uint64_t new_head = free_list_head(current_head, *head_next);
uint64_t old_head = p_atomic_cmpxchg(&fl->head, current_head, new_head);
if (old_head == current_head)
return head_idx;
@@ -291,7 +291,7 @@ util_sparse_array_free_list_pop_elem(struct util_sparse_array_free_list *fl)
uint32_t head_idx = current_head; /* Index is the bottom 32 bits */
void *head_elem = util_sparse_array_get(fl->arr, head_idx);
uint32_t *head_next = (uint32_t *)((char *)head_elem + fl->next_offset);
- uint32_t new_head = free_list_head(current_head, *head_next);
+ uint64_t new_head = free_list_head(current_head, *head_next);
uint64_t old_head = p_atomic_cmpxchg(&fl->head, current_head, new_head);
if (old_head == current_head)
return head_elem;
More information about the mesa-commit
mailing list