Skip to content

Commit

Permalink
list: introduce list_is_head() helper and re-use it in list.h
Browse files Browse the repository at this point in the history
[ Upstream commit 0425473 ]

Introduce list_is_head() in the similar (*) way as it's done for
list_entry_is_head().  Make use of it in the list.h.

*) it's done as inliner and not a macro to be aligned with other
   list_is_*() APIs; while at it, make all three to have the same
   style.

Link: https://lkml.kernel.org/r/20211201141824.81400-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
andy-shev authored and gregkh committed Jun 9, 2022
1 parent b53f6ba commit 8be3262
Showing 1 changed file with 22 additions and 14 deletions.
36 changes: 22 additions & 14 deletions include/linux/list.h
Expand Up @@ -256,8 +256,7 @@ static inline void list_bulk_move_tail(struct list_head *head,
* @list: the entry to test
* @head: the head of the list
*/
static inline int list_is_first(const struct list_head *list,
const struct list_head *head)
static inline int list_is_first(const struct list_head *list, const struct list_head *head)
{
return list->prev == head;
}
Expand All @@ -267,12 +266,21 @@ static inline int list_is_first(const struct list_head *list,
* @list: the entry to test
* @head: the head of the list
*/
static inline int list_is_last(const struct list_head *list,
const struct list_head *head)
static inline int list_is_last(const struct list_head *list, const struct list_head *head)
{
return list->next == head;
}

/**
* list_is_head - tests whether @list is the list @head
* @list: the entry to test
* @head: the head of the list
*/
static inline int list_is_head(const struct list_head *list, const struct list_head *head)
{
return list == head;
}

/**
* list_empty - tests whether a list is empty
* @head: the list to test.
Expand Down Expand Up @@ -316,7 +324,7 @@ static inline void list_del_init_careful(struct list_head *entry)
static inline int list_empty_careful(const struct list_head *head)
{
struct list_head *next = smp_load_acquire(&head->next);
return (next == head) && (next == head->prev);
return list_is_head(next, head) && (next == head->prev);
}

/**
Expand Down Expand Up @@ -391,10 +399,9 @@ static inline void list_cut_position(struct list_head *list,
{
if (list_empty(head))
return;
if (list_is_singular(head) &&
(head->next != entry && head != entry))
if (list_is_singular(head) && !list_is_head(entry, head) && (entry != head->next))
return;
if (entry == head)
if (list_is_head(entry, head))
INIT_LIST_HEAD(list);
else
__list_cut_position(list, head, entry);
Expand Down Expand Up @@ -568,7 +575,7 @@ static inline void list_splice_tail_init(struct list_head *list,
* @head: the head for your list.
*/
#define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next)
for (pos = (head)->next; !list_is_head(pos, (head)); pos = pos->next)

/**
* list_for_each_continue - continue iteration over a list
Expand All @@ -578,15 +585,15 @@ static inline void list_splice_tail_init(struct list_head *list,
* Continue to iterate over a list, continuing after the current position.
*/
#define list_for_each_continue(pos, head) \
for (pos = pos->next; pos != (head); pos = pos->next)
for (pos = pos->next; !list_is_head(pos, (head)); pos = pos->next)

/**
* list_for_each_prev - iterate over a list backwards
* @pos: the &struct list_head to use as a loop cursor.
* @head: the head for your list.
*/
#define list_for_each_prev(pos, head) \
for (pos = (head)->prev; pos != (head); pos = pos->prev)
for (pos = (head)->prev; !list_is_head(pos, (head)); pos = pos->prev)

/**
* list_for_each_safe - iterate over a list safe against removal of list entry
Expand All @@ -595,8 +602,9 @@ static inline void list_splice_tail_init(struct list_head *list,
* @head: the head for your list.
*/
#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)
for (pos = (head)->next, n = pos->next; \
!list_is_head(pos, (head)); \
pos = n, n = pos->next)

/**
* list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry
Expand All @@ -606,7 +614,7 @@ static inline void list_splice_tail_init(struct list_head *list,
*/
#define list_for_each_prev_safe(pos, n, head) \
for (pos = (head)->prev, n = pos->prev; \
pos != (head); \
!list_is_head(pos, (head)); \
pos = n, n = pos->prev)

/**
Expand Down

0 comments on commit 8be3262

Please sign in to comment.