util/list: Fix next instruction removal usecase for non safe iterators

Introducing this iterator debug information breaks the usecase of removing
elements in the list other than the current element.

Fixes: 372e83b95f

Reviewed-by: Rob Clark <rob.clark@oss.qualcomm.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37061>
This commit is contained in:
Ella Stanforth 2025-08-28 15:08:42 +01:00 committed by Marge Bot
parent c739d836f7
commit 6863223033

View file

@ -44,6 +44,9 @@
#define list_assert(cond, msg) assert(cond && msg)
#define list_validate_iter(item, msg) \
list_assert(list_is_linked(item) && !list_is_empty(item), msg)
struct list_head
{
struct list_head *prev;
@ -234,12 +237,10 @@ static inline void list_move_to(struct list_head *item, struct list_head *loc) {
pos = list_container_of(pos->member.prev, pos, member))
#define list_for_each_entry(type, pos, head, member) \
for (type *pos = list_entry((head)->next, type, member), \
*__next = list_entry(pos->member.next, type, member); \
for (type *pos = list_entry((head)->next, type, member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, type, member), \
list_assert(pos == __next, "use _safe iterator"), \
__next = list_entry(__next->member.next, type, member))
list_validate_iter(&pos->member, "use _safe iterator"), \
pos = list_entry(pos->member.next, type, member))
#define list_for_each_entry_safe(type, pos, head, member) \
for (type *pos = list_entry((head)->next, type, member), \
@ -249,12 +250,10 @@ static inline void list_move_to(struct list_head *item, struct list_head *loc) {
__next = list_entry(__next->member.next, type, member))
#define list_for_each_entry_rev(type, pos, head, member) \
for (type *pos = list_entry((head)->prev, type, member), \
*__prev = list_entry(pos->member.prev, type, member); \
for (type *pos = list_entry((head)->prev, type, member); \
&pos->member != (head); \
pos = list_entry(pos->member.prev, type, member), \
list_assert(pos == __prev, "use _safe iterator"), \
__prev = list_entry(__prev->member.prev, type, member))
list_validate_iter(&pos->member, "use _safe iterator"), \
pos = list_entry(pos->member.prev, type, member))
#define list_for_each_entry_safe_rev(type, pos, head, member) \
for (type *pos = list_entry((head)->prev, type, member), \