Messages in this thread Patch in this message | | | From | Jakob Koschel <> | Subject | [PATCH] list: always set pos in list_prepare_entry() | Date | Sun, 6 Mar 2022 17:26:35 +0100 |
| |
In order to assign the result from list_prepare_entry() to another variable, it should also be set when pos != NULL.
This will be useful once the list iterator is no longer used after the loop.
The original code:
list_for_each_entry(fl, head, list) { if (...) break; }
list_for_each_entry_continue(fl, head, list) {
}
can then just be turned into something like this:
list_for_each_entry(fl, head, list) { if (...) { tmp = fl; break; } }
fl = list_prepare_entry(tmp, head, list); list_for_each_entry_continue(fl, head, list) {
}
The compiler should happily optimize away the TRUE case if the variable being assigned is the same:
pos = list_prepare_entry(pos, head, list);
and only do it in the case where the variable to assign is different:
pos = list_prepare_entry(tmp, head, list);
Signed-off-by: Jakob Koschel <jakobkoschel@gmail.com> --- include/linux/list.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/linux/list.h b/include/linux/list.h index dd6c2041d09c..050747fb5ea8 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -659,7 +659,7 @@ static inline void list_splice_tail_init(struct list_head *list, * Prepares a pos entry for use as a start point in list_for_each_entry_continue(). */ #define list_prepare_entry(pos, head, member) \ - ((pos) ? : list_entry(head, typeof(*pos), member)) + ((pos) ? pos : list_entry(head, typeof(*pos), member))
/** * list_for_each_entry_continue - continue iteration over list of given type base-commit: 719fce7539cd3e186598e2aed36325fe892150cf -- 2.25.1
| |