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>
(cherry picked from commit 6863223033)
This commit is contained in:
Ella Stanforth 2025-08-28 15:08:42 +01:00 committed by Eric Engestrom
parent 9517120528
commit 693b12113d
2 changed files with 10 additions and 11 deletions

View file

@ -6504,7 +6504,7 @@
"description": "util/list: Fix next instruction removal usecase for non safe iterators",
"nominated": true,
"nomination_type": 2,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "372e83b95f9277fe1d09b1c65c70a38918843b6f",
"notes": null

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), \