Re: [PATCH net-next v4 01/13] list: Add list_next_entry_circular() and list_prev_entry_circular()
flat view
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date: 2022-01-14 13:46:37
Also in:
linux-wireless
On Thu, Jan 13, 2022 at 06:06:15PM -0700, Ricardo Martinez wrote:
Add macros to get the next or previous entries and wraparound if needed. For example, calling list_next_entry_circular() on the last element should return the first element in the list.
FWIW, Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
quoted hunk ↗ jump to hunk
Signed-off-by: Ricardo Martinez <ricardo.martinez@linux.intel.com> --- include/linux/list.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)diff --git a/include/linux/list.h b/include/linux/list.h index dd6c2041d09c..c147eeb2d39d 100644 --- a/include/linux/list.h +++ b/include/linux/list.h@@ -563,6 +563,19 @@ static inline void list_splice_tail_init(struct list_head *list, #define list_next_entry(pos, member) \ list_entry((pos)->member.next, typeof(*(pos)), member) +/** + * list_next_entry_circular - get the next element in list + * @pos: the type * to cursor. + * @head: the list head to take the element from. + * @member: the name of the list_head within the struct. + * + * Wraparound if pos is the last element (return the first element). + * Note, that list is expected to be not empty. + */ +#define list_next_entry_circular(pos, head, member) \ + (list_is_last(&(pos)->member, head) ? \ + list_first_entry(head, typeof(*(pos)), member) : list_next_entry(pos, member)) + /** * list_prev_entry - get the prev element in list * @pos: the type * to cursor@@ -571,6 +584,19 @@ static inline void list_splice_tail_init(struct list_head *list, #define list_prev_entry(pos, member) \ list_entry((pos)->member.prev, typeof(*(pos)), member) +/** + * list_prev_entry_circular - get the prev element in list + * @pos: the type * to cursor. + * @head: the list head to take the element from. + * @member: the name of the list_head within the struct. + * + * Wraparound if pos is the first element (return the last element). + * Note, that list is expected to be not empty. + */ +#define list_prev_entry_circular(pos, head, member) \ + (list_is_first(&(pos)->member, head) ? \ + list_last_entry(head, typeof(*(pos)), member) : list_prev_entry(pos, member)) + /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop cursor.-- 2.17.1
-- With Best Regards, Andy Shevchenko