summaryrefslogtreecommitdiffstats
path: root/src/util/sparse_array.c
diff options
context:
space:
mode:
authorLionel Landwerlin <[email protected]>2020-04-17 20:42:41 +0300
committerMarge Bot <[email protected]>2020-04-18 12:18:03 +0000
commitcdc43775917e301a7ca654fcebb94fad08dc4131 (patch)
tree06300278a665e6ad8b02a4af2a1de96ebf969d01 /src/util/sparse_array.c
parent36d2a0eed69b6f584c417bdbe0ea0f4623f1b514 (diff)
util/sparse_free_list: manipulate node pointers using atomic primitives
Probably doesn't fix anything but those should be accessed in an atomic way just like the head pointer. Signed-off-by: Lionel Landwerlin <[email protected]> Fixes: e4f01eca3b3cd1 ("util: Add a free list structure for use with util_sparse_array") Reviewed-by: Jason Ekstrand <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4613>
Diffstat (limited to 'src/util/sparse_array.c')
-rw-r--r--src/util/sparse_array.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/util/sparse_array.c b/src/util/sparse_array.c
index 0c04fd0d6dc..38b0431461b 100644
--- a/src/util/sparse_array.c
+++ b/src/util/sparse_array.c
@@ -241,7 +241,7 @@ util_sparse_array_free_list_push(struct util_sparse_array_free_list *fl,
void *last_elem = util_sparse_array_get(fl->arr, items[0]);
uint32_t *last_next = (uint32_t *)((char *)last_elem + fl->next_offset);
for (unsigned i = 1; i < num_items; i++) {
- *last_next = items[i];
+ p_atomic_set(last_next, items[i]);
assert(items[i] != fl->sentinel);
last_elem = util_sparse_array_get(fl->arr, items[i]);
last_next = (uint32_t *)((char *)last_elem + fl->next_offset);
@@ -251,7 +251,7 @@ util_sparse_array_free_list_push(struct util_sparse_array_free_list *fl,
old_head = p_atomic_read(&fl->head);
do {
current_head = old_head;
- *last_next = current_head; /* Index is the bottom 32 bits */
+ p_atomic_set(last_next, (uint32_t)current_head); /* Index is the bottom 32 bits */
uint64_t new_head = free_list_head(current_head, items[0]);
old_head = p_atomic_cmpxchg(&fl->head, current_head, new_head);
} while (old_head != current_head);
@@ -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);
- uint64_t new_head = free_list_head(current_head, *head_next);
+ uint64_t new_head = free_list_head(current_head, p_atomic_read(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);
- uint64_t new_head = free_list_head(current_head, *head_next);
+ uint64_t new_head = free_list_head(current_head, p_atomic_read(head_next));
uint64_t old_head = p_atomic_cmpxchg(&fl->head, current_head, new_head);
if (old_head == current_head)
return head_elem;