lkml.org 
[lkml]   [2021]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 104/217] include/linux/list.h: add a macro to test if entry is pointing to the head
    Date
    From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

    commit e130816164e244b692921de49771eeb28205152d upstream.

    Add a macro to test if entry is pointing to the head of the list which is
    useful in cases like:

    list_for_each_entry(pos, &head, member) {
    if (cond)
    break;
    }
    if (list_entry_is_head(pos, &head, member))
    return -ERRNO;

    that allows to avoid additional variable to be added to track if loop has
    not been stopped in the middle.

    While here, convert list_for_each_entry*() family of macros to use a new one.

    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
    Link: https://lkml.kernel.org/r/20200929134342.51489-1-andriy.shevchenko@linux.intel.com
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    include/linux/list.h | 29 +++++++++++++++++++----------
    1 file changed, 19 insertions(+), 10 deletions(-)

    --- a/include/linux/list.h
    +++ b/include/linux/list.h
    @@ -485,6 +485,15 @@ static inline void list_splice_tail_init
    pos = n, n = pos->prev)

    /**
    + * list_entry_is_head - test if the entry points to the head of the list
    + * @pos: the type * to cursor
    + * @head: the head for your list.
    + * @member: the name of the list_head within the struct.
    + */
    +#define list_entry_is_head(pos, head, member) \
    + (&pos->member == (head))
    +
    +/**
    * list_for_each_entry - iterate over list of given type
    * @pos: the type * to use as a loop cursor.
    * @head: the head for your list.
    @@ -492,7 +501,7 @@ static inline void list_splice_tail_init
    */
    #define list_for_each_entry(pos, head, member) \
    for (pos = list_first_entry(head, typeof(*pos), member); \
    - &pos->member != (head); \
    + !list_entry_is_head(pos, head, member); \
    pos = list_next_entry(pos, member))

    /**
    @@ -503,7 +512,7 @@ static inline void list_splice_tail_init
    */
    #define list_for_each_entry_reverse(pos, head, member) \
    for (pos = list_last_entry(head, typeof(*pos), member); \
    - &pos->member != (head); \
    + !list_entry_is_head(pos, head, member); \
    pos = list_prev_entry(pos, member))

    /**
    @@ -528,7 +537,7 @@ static inline void list_splice_tail_init
    */
    #define list_for_each_entry_continue(pos, head, member) \
    for (pos = list_next_entry(pos, member); \
    - &pos->member != (head); \
    + !list_entry_is_head(pos, head, member); \
    pos = list_next_entry(pos, member))

    /**
    @@ -542,7 +551,7 @@ static inline void list_splice_tail_init
    */
    #define list_for_each_entry_continue_reverse(pos, head, member) \
    for (pos = list_prev_entry(pos, member); \
    - &pos->member != (head); \
    + !list_entry_is_head(pos, head, member); \
    pos = list_prev_entry(pos, member))

    /**
    @@ -554,7 +563,7 @@ static inline void list_splice_tail_init
    * Iterate over list of given type, continuing from current position.
    */
    #define list_for_each_entry_from(pos, head, member) \
    - for (; &pos->member != (head); \
    + for (; !list_entry_is_head(pos, head, member); \
    pos = list_next_entry(pos, member))

    /**
    @@ -567,7 +576,7 @@ static inline void list_splice_tail_init
    * Iterate backwards over list of given type, continuing from current position.
    */
    #define list_for_each_entry_from_reverse(pos, head, member) \
    - for (; &pos->member != (head); \
    + for (; !list_entry_is_head(pos, head, member); \
    pos = list_prev_entry(pos, member))

    /**
    @@ -580,7 +589,7 @@ static inline void list_splice_tail_init
    #define list_for_each_entry_safe(pos, n, head, member) \
    for (pos = list_first_entry(head, typeof(*pos), member), \
    n = list_next_entry(pos, member); \
    - &pos->member != (head); \
    + !list_entry_is_head(pos, head, member); \
    pos = n, n = list_next_entry(n, member))

    /**
    @@ -596,7 +605,7 @@ static inline void list_splice_tail_init
    #define list_for_each_entry_safe_continue(pos, n, head, member) \
    for (pos = list_next_entry(pos, member), \
    n = list_next_entry(pos, member); \
    - &pos->member != (head); \
    + !list_entry_is_head(pos, head, member); \
    pos = n, n = list_next_entry(n, member))

    /**
    @@ -611,7 +620,7 @@ static inline void list_splice_tail_init
    */
    #define list_for_each_entry_safe_from(pos, n, head, member) \
    for (n = list_next_entry(pos, member); \
    - &pos->member != (head); \
    + !list_entry_is_head(pos, head, member); \
    pos = n, n = list_next_entry(n, member))

    /**
    @@ -627,7 +636,7 @@ static inline void list_splice_tail_init
    #define list_for_each_entry_safe_reverse(pos, n, head, member) \
    for (pos = list_last_entry(head, typeof(*pos), member), \
    n = list_prev_entry(pos, member); \
    - &pos->member != (head); \
    + !list_entry_is_head(pos, head, member); \
    pos = n, n = list_prev_entry(n, member))

    /**

    \
     
     \ /
      Last update: 2021-09-20 19:37    [W:3.520 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site