diff options
author | Yong-Xuan Wang <yongxuan.wang@sifive.com> | 2025-06-18 10:54:16 +0800 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2025-07-20 20:45:59 +0530 |
commit | 61083eb504e853e18c57f9f5794f8318c267d091 (patch) | |
tree | af3d83bc9443c138410196b2d908f1ca584b3121 | |
parent | b8f370aa3714ef37023e523c37c1981b0a5d1e12 (diff) | |
download | opensbi-61083eb504e853e18c57f9f5794f8318c267d091.zip opensbi-61083eb504e853e18c57f9f5794f8318c267d091.tar.gz opensbi-61083eb504e853e18c57f9f5794f8318c267d091.tar.bz2 |
lib: sbi_list: add a helper for safe list iteration
Some use cases require iterating safe against removal of list entry.
Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20250618025416.5331-1-yongxuan.wang@sifive.com
Signed-off-by: Anup Patel <anup@brainfault.org>
-rw-r--r-- | include/sbi/sbi_list.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/include/sbi/sbi_list.h b/include/sbi/sbi_list.h index 9e56c52..be69fc4 100644 --- a/include/sbi/sbi_list.h +++ b/include/sbi/sbi_list.h @@ -160,4 +160,17 @@ static inline void sbi_list_del_init(struct sbi_dlist *entry) &pos->member != (head); \ pos = sbi_list_entry(pos->member.next, typeof(*pos), member)) +/** + * Iterate over list of given type safe against removal of list entry + * @param pos the type * to use as a loop cursor. + * @param n another type * to use as temporary storage. + * @param head the head for your list. + * @param member the name of the list_struct within the struct. + */ +#define sbi_list_for_each_entry_safe(pos, n, head, member) \ + for (pos = sbi_list_entry((head)->next, typeof(*pos), member), \ + n = sbi_list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = sbi_list_entry(pos->member.next, typeof(*pos), member)) + #endif |