|
|
|
|
@@ -4,11 +4,6 @@
|
|
|
|
|
#include <linux/stddef.h>
|
|
|
|
|
#include <linux/poison.h>
|
|
|
|
|
|
|
|
|
|
#ifndef ARCH_HAS_PREFETCH
|
|
|
|
|
#define ARCH_HAS_PREFETCH
|
|
|
|
|
static inline void prefetch(const void *x) {;}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Simple doubly linked list implementation.
|
|
|
|
|
*
|
|
|
|
|
@@ -169,6 +164,16 @@ static inline int list_is_last(const struct list_head *list,
|
|
|
|
|
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.
|
|
|
|
|
@@ -362,27 +367,29 @@ static inline void list_splice_tail_init(struct list_head *list,
|
|
|
|
|
pos__ != head__ ? list_entry(pos__, type, member) : NULL; \
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* list_next_entry - get the next element in list
|
|
|
|
|
* @pos: the type * to cursor
|
|
|
|
|
* @member: the name of the list_head within the struct.
|
|
|
|
|
*/
|
|
|
|
|
#define list_next_entry(pos, member) \
|
|
|
|
|
list_entry((pos)->member.next, typeof(*(pos)), member)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* list_prev_entry - get the prev element in list
|
|
|
|
|
* @pos: the type * to cursor
|
|
|
|
|
* @member: the name of the list_head within the struct.
|
|
|
|
|
*/
|
|
|
|
|
#define list_prev_entry(pos, member) \
|
|
|
|
|
list_entry((pos)->member.prev, typeof(*(pos)), member)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* list_for_each - iterate over a list
|
|
|
|
|
* @pos: the &struct list_head to use as a loop cursor.
|
|
|
|
|
* @head: the head for your list.
|
|
|
|
|
*/
|
|
|
|
|
#define list_for_each(pos, head) \
|
|
|
|
|
for (pos = (head)->next; prefetch(pos->next), pos != (head); \
|
|
|
|
|
pos = pos->next)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* __list_for_each - iterate over a list
|
|
|
|
|
* @pos: the &struct list_head to use as a loop cursor.
|
|
|
|
|
* @head: the head for your list.
|
|
|
|
|
*
|
|
|
|
|
* This variant differs from list_for_each() in that it's the
|
|
|
|
|
* simplest possible list iteration code, no prefetching is done.
|
|
|
|
|
* Use this for code that knows the list to be very short (empty
|
|
|
|
|
* or 1 entry) most of the time.
|
|
|
|
|
*/
|
|
|
|
|
#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_prev - iterate over a list backwards
|
|
|
|
|
@@ -390,8 +397,7 @@ static inline void list_splice_tail_init(struct list_head *list,
|
|
|
|
|
* @head: the head for your list.
|
|
|
|
|
*/
|
|
|
|
|
#define list_for_each_prev(pos, head) \
|
|
|
|
|
for (pos = (head)->prev; prefetch(pos->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
|
|
|
|
|
@@ -411,30 +417,39 @@ 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; \
|
|
|
|
|
prefetch(pos->prev), pos != (head); \
|
|
|
|
|
!list_is_head(pos, (head)); \
|
|
|
|
|
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) \
|
|
|
|
|
list_is_head(&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.
|
|
|
|
|
* @member: the name of the list_struct within the struct.
|
|
|
|
|
* @member: the name of the list_head within the struct.
|
|
|
|
|
*/
|
|
|
|
|
#define list_for_each_entry(pos, head, member) \
|
|
|
|
|
for (pos = list_entry((head)->next, typeof(*pos), member); \
|
|
|
|
|
prefetch(pos->member.next), &pos->member != (head); \
|
|
|
|
|
pos = list_entry(pos->member.next, typeof(*pos), member))
|
|
|
|
|
for (pos = list_first_entry(head, typeof(*pos), member); \
|
|
|
|
|
!list_entry_is_head(pos, head, member); \
|
|
|
|
|
pos = list_next_entry(pos, member))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* list_for_each_entry_reverse - iterate backwards over list of given type.
|
|
|
|
|
* @pos: the type * to use as a loop cursor.
|
|
|
|
|
* @head: the head for your list.
|
|
|
|
|
* @member: the name of the list_struct within the struct.
|
|
|
|
|
* @member: the name of the list_head within the struct.
|
|
|
|
|
*/
|
|
|
|
|
#define list_for_each_entry_reverse(pos, head, member) \
|
|
|
|
|
for (pos = list_entry((head)->prev, typeof(*pos), member); \
|
|
|
|
|
prefetch(pos->member.prev), &pos->member != (head); \
|
|
|
|
|
pos = list_entry(pos->member.prev, typeof(*pos), member))
|
|
|
|
|
for (pos = list_last_entry(head, typeof(*pos), member); \
|
|
|
|
|
!list_entry_is_head(pos, head, member); \
|
|
|
|
|
pos = list_prev_entry(pos, member))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue()
|
|
|
|
|
@@ -451,41 +466,41 @@ static inline void list_splice_tail_init(struct list_head *list,
|
|
|
|
|
* list_for_each_entry_continue - continue iteration over list of given type
|
|
|
|
|
* @pos: the type * to use as a loop cursor.
|
|
|
|
|
* @head: the head for your list.
|
|
|
|
|
* @member: the name of the list_struct within the struct.
|
|
|
|
|
* @member: the name of the list_head within the struct.
|
|
|
|
|
*
|
|
|
|
|
* Continue to iterate over list of given type, continuing after
|
|
|
|
|
* the current position.
|
|
|
|
|
*/
|
|
|
|
|
#define list_for_each_entry_continue(pos, head, member) \
|
|
|
|
|
for (pos = list_entry(pos->member.next, typeof(*pos), member); \
|
|
|
|
|
prefetch(pos->member.next), &pos->member != (head); \
|
|
|
|
|
pos = list_entry(pos->member.next, typeof(*pos), member))
|
|
|
|
|
#define list_for_each_entry_continue(pos, head, member) \
|
|
|
|
|
for (pos = list_next_entry(pos, member); \
|
|
|
|
|
!list_entry_is_head(pos, head, member); \
|
|
|
|
|
pos = list_next_entry(pos, member))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* list_for_each_entry_continue_reverse - iterate backwards from the given point
|
|
|
|
|
* @pos: the type * to use as a loop cursor.
|
|
|
|
|
* @head: the head for your list.
|
|
|
|
|
* @member: the name of the list_struct within the struct.
|
|
|
|
|
* @member: the name of the list_head within the struct.
|
|
|
|
|
*
|
|
|
|
|
* Start to iterate over list of given type backwards, continuing after
|
|
|
|
|
* the current position.
|
|
|
|
|
*/
|
|
|
|
|
#define list_for_each_entry_continue_reverse(pos, head, member) \
|
|
|
|
|
for (pos = list_entry(pos->member.prev, typeof(*pos), member); \
|
|
|
|
|
prefetch(pos->member.prev), &pos->member != (head); \
|
|
|
|
|
pos = list_entry(pos->member.prev, typeof(*pos), member))
|
|
|
|
|
for (pos = list_prev_entry(pos, member); \
|
|
|
|
|
!list_entry_is_head(pos, head, member); \
|
|
|
|
|
pos = list_prev_entry(pos, member))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* list_for_each_entry_from - iterate over list of given type from the current point
|
|
|
|
|
* @pos: the type * to use as a loop cursor.
|
|
|
|
|
* @head: the head for your list.
|
|
|
|
|
* @member: the name of the list_struct within the struct.
|
|
|
|
|
* @member: the name of the list_head within the struct.
|
|
|
|
|
*
|
|
|
|
|
* Iterate over list of given type, continuing from current position.
|
|
|
|
|
*/
|
|
|
|
|
#define list_for_each_entry_from(pos, head, member) \
|
|
|
|
|
for (; prefetch(pos->member.next), &pos->member != (head); \
|
|
|
|
|
pos = list_entry(pos->member.next, typeof(*pos), member))
|
|
|
|
|
#define list_for_each_entry_from(pos, head, member) \
|
|
|
|
|
for (; !list_entry_is_head(pos, head, member); \
|
|
|
|
|
pos = list_next_entry(pos, member))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
|
|
|
|
|
@@ -654,8 +669,7 @@ static inline void hlist_add_after(struct hlist_node *n,
|
|
|
|
|
#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
|
|
|
|
|
|
|
|
|
|
#define hlist_for_each(pos, head) \
|
|
|
|
|
for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \
|
|
|
|
|
pos = pos->next)
|
|
|
|
|
for (pos = (head)->first; pos ; pos = pos->next)
|
|
|
|
|
|
|
|
|
|
#define hlist_for_each_safe(pos, n, head) \
|
|
|
|
|
for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
|
|
|
|
|
|