On Mon, Nov 02, 2009 at 02:36:43PM +0100, Sascha Hauer wrote: > > We accidently have two list implementations in the tree: > include/list.h and include/linux/list.h. This patch moves > the latter (newer one) to include/linux/list.h. applied. Sascha > > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > --- > arch/arm/lib/armlinux.c | 2 +- > common/command.c | 2 +- > common/complete.c | 2 +- > common/console.c | 2 +- > common/module.c | 2 +- > include/boot.h | 2 +- > include/command.h | 2 +- > include/complete.h | 2 +- > include/console.h | 2 +- > include/driver.h | 2 +- > include/linux/list.h | 427 ++++++++++++++++++++++++++++++--- > include/linux/mtd/mtd.h | 2 +- > include/list.h | 605 ----------------------------------------------- > include/module.h | 2 +- > include/stringlist.h | 2 +- > include/usb/gadget.h | 2 +- > lib/driver.c | 2 +- > lib/notifier.c | 2 +- > 18 files changed, 403 insertions(+), 661 deletions(-) > delete mode 100644 include/list.h > > diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c > index 04dcf49..365a4d2 100644 > --- a/arch/arm/lib/armlinux.c > +++ b/arch/arm/lib/armlinux.c > @@ -30,7 +30,7 @@ > #include <zlib.h> > #include <init.h> > #include <fs.h> > -#include <list.h> > +#include <linux/list.h> > #include <xfuncs.h> > #include <malloc.h> > #include <fcntl.h> > diff --git a/common/command.c b/common/command.c > index f484520..a46e07e 100644 > --- a/common/command.c > +++ b/common/command.c > @@ -30,7 +30,7 @@ > #include <xfuncs.h> > #include <malloc.h> > #include <environment.h> > -#include <list.h> > +#include <linux/list.h> > #include <init.h> > #include <complete.h> > #include <linux/utsrelease.h> > diff --git a/common/complete.c b/common/complete.c > index c499e09..87435ee 100644 > --- a/common/complete.c > +++ b/common/complete.c > @@ -20,7 +20,7 @@ > #include <common.h> > #include <complete.h> > #include <xfuncs.h> > -#include <list.h> > +#include <linux/list.h> > #include <malloc.h> > #include <fs.h> > #include <linux/stat.h> > diff --git a/common/console.c b/common/console.c > index 52d7119..d3d31f7 100644 > --- a/common/console.c > +++ b/common/console.c > @@ -34,7 +34,7 @@ > #include <clock.h> > #include <kfifo.h> > #include <module.h> > -#include <list.h> > +#include <linux/list.h> > > LIST_HEAD(console_list); > EXPORT_SYMBOL(console_list); > diff --git a/common/module.c b/common/module.c > index e45c992..302aefa 100644 > --- a/common/module.c > +++ b/common/module.c > @@ -26,7 +26,7 @@ > #include <command.h> > #include <fs.h> > #include <kallsyms.h> > -#include <list.h> > +#include <linux/list.h> > > static unsigned int find_sec(Elf_Ehdr *hdr, > Elf_Shdr *sechdrs, > diff --git a/include/boot.h b/include/boot.h > index 2ba918b..623f443 100644 > --- a/include/boot.h > +++ b/include/boot.h > @@ -2,7 +2,7 @@ > #define __BOOT_H > > #include <image.h> > -#include <list.h> > +#include <linux/list.h> > > struct image_data { > struct image_handle *os; > diff --git a/include/command.h b/include/command.h > index a72f240..a769d54 100644 > --- a/include/command.h > +++ b/include/command.h > @@ -27,7 +27,7 @@ > #ifndef __COMMAND_H > #define __COMMAND_H > > -#include <list.h> > +#include <linux/list.h> > > #ifndef NULL > #define NULL 0 > diff --git a/include/complete.h b/include/complete.h > index 26fed65..cc0e88d 100644 > --- a/include/complete.h > +++ b/include/complete.h > @@ -1,7 +1,7 @@ > #ifndef __COMPLETE_ > #define __COMPLETE_ > > -#include <list.h> > +#include <linux/list.h> > > int complete(char *instr, char **outstr); > void complete_reset(void); > diff --git a/include/console.h b/include/console.h > index e632946..3568c56 100644 > --- a/include/console.h > +++ b/include/console.h > @@ -25,7 +25,7 @@ > #define _CONSOLE_H_ > > #include <param.h> > -#include <list.h> > +#include <linux/list.h> > #include <driver.h> > > #define CONSOLE_STDIN (1 << 0) > diff --git a/include/driver.h b/include/driver.h > index 91a3aaa..1dde38e 100644 > --- a/include/driver.h > +++ b/include/driver.h > @@ -23,7 +23,7 @@ > #ifndef DRIVER_H > #define DRIVER_H > > -#include <list.h> > +#include <linux/list.h> > > #define MAX_DRIVER_NAME 32 > > diff --git a/include/linux/list.h b/include/linux/list.h > index e6492f7..8af1eeb 100644 > --- a/include/linux/list.h > +++ b/include/linux/list.h > @@ -1,11 +1,6 @@ > #ifndef _LINUX_LIST_H > #define _LINUX_LIST_H > > -#ifndef ARCH_HAS_PREFETCH > -#define ARCH_HAS_PREFETCH > -static inline void prefetch(const void *x) {;} > -#endif > - > /* > * Simple doubly linked list implementation. > * > @@ -16,6 +11,10 @@ static inline void prefetch(const void *x) {;} > * using the generic single-entry routines. > */ > > +#define LIST_POISON1 ((void *) 0x00100100) > +#define LIST_POISON2 ((void *) 0x00200200) > +static inline void prefetch(const void *x) {;} > + > struct list_head { > struct list_head *next, *prev; > }; > @@ -25,9 +24,11 @@ struct list_head { > #define LIST_HEAD(name) \ > struct list_head name = LIST_HEAD_INIT(name) > > -#define INIT_LIST_HEAD(ptr) do { \ > - (ptr)->next = (ptr); (ptr)->prev = (ptr); \ > -} while (0) > +static inline void INIT_LIST_HEAD(struct list_head *list) > +{ > + list->next = list; > + list->prev = list; > +} > > /* > * Insert a new entry between two known consecutive entries. > @@ -35,6 +36,7 @@ struct list_head { > * This is only for internal list manipulation where we know > * the prev/next entries already! > */ > +#ifndef CONFIG_DEBUG_LIST > static inline void __list_add(struct list_head *new, > struct list_head *prev, > struct list_head *next) > @@ -44,6 +46,11 @@ static inline void __list_add(struct list_head *new, > new->prev = prev; > prev->next = new; > } > +#else > +extern void __list_add(struct list_head *new, > + struct list_head *prev, > + struct list_head *next); > +#endif > > /** > * list_add - add a new entry > @@ -53,10 +60,15 @@ static inline void __list_add(struct list_head *new, > * Insert a new entry after the specified head. > * This is good for implementing stacks. > */ > +#ifndef CONFIG_DEBUG_LIST > static inline void list_add(struct list_head *new, struct list_head *head) > { > __list_add(new, head, head->next); > } > +#else > +extern void list_add(struct list_head *new, struct list_head *head); > +#endif > + > > /** > * list_add_tail - add a new entry > @@ -78,7 +90,7 @@ static inline void list_add_tail(struct list_head *new, struct list_head *head) > * This is only for internal list manipulation where we know > * the prev/next entries already! > */ > -static inline void __list_del(struct list_head *prev, struct list_head *next) > +static inline void __list_del(struct list_head * prev, struct list_head * next) > { > next->prev = prev; > prev->next = next; > @@ -87,13 +99,41 @@ static inline void __list_del(struct list_head *prev, struct list_head *next) > /** > * list_del - deletes entry from list. > * @entry: the element to delete from the list. > - * Note: list_empty on entry does not return true after this, the entry is in an undefined state. > + * Note: list_empty() on entry does not return true after this, the entry is > + * in an undefined state. > */ > +#ifndef CONFIG_DEBUG_LIST > static inline void list_del(struct list_head *entry) > { > __list_del(entry->prev, entry->next); > - entry->next = (void *) 0; > - entry->prev = (void *) 0; > + entry->next = LIST_POISON1; > + entry->prev = LIST_POISON2; > +} > +#else > +extern void list_del(struct list_head *entry); > +#endif > + > +/** > + * list_replace - replace old entry by new one > + * @old : the element to be replaced > + * @new : the new element to insert > + * > + * If @old was empty, it will be overwritten. > + */ > +static inline void list_replace(struct list_head *old, > + struct list_head *new) > +{ > + new->next = old->next; > + new->next->prev = new; > + new->prev = old->prev; > + new->prev->next = new; > +} > + > +static inline void list_replace_init(struct list_head *old, > + struct list_head *new) > +{ > + list_replace(old, new); > + INIT_LIST_HEAD(old); > } > > /** > @@ -130,14 +170,44 @@ static inline void list_move_tail(struct list_head *list, > } > > /** > + * list_is_last - tests whether @list is the last entry in list @head > + * @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) > +{ > + return list->next == head; > +} > + > +/** > * list_empty - tests whether a list is empty > * @head: the list to test. > */ > -static inline int list_empty(struct list_head *head) > +static inline int list_empty(const struct list_head *head) > { > return head->next == head; > } > > +/** > + * list_empty_careful - tests whether a list is empty and not being modified > + * @head: the list to test > + * > + * Description: > + * tests whether a list is empty _and_ checks that no other CPU might be > + * in the process of modifying either member (next or prev) > + * > + * NOTE: using list_empty_careful() without synchronization > + * can only be safe if the only activity that can happen > + * to the list entry is list_del_init(). Eg. it cannot be used > + * if another CPU could re-list_add() it. > + */ > +static inline int list_empty_careful(const struct list_head *head) > +{ > + struct list_head *next = head->next; > + return (next == head) && (next == head->prev); > +} > + > static inline void __list_splice(struct list_head *list, > struct list_head *head) > { > @@ -186,28 +256,53 @@ static inline void list_splice_init(struct list_head *list, > * @member: the name of the list_struct within the struct. > */ > #define list_entry(ptr, type, member) \ > - ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) > + container_of(ptr, type, member) > + > +/** > + * list_first_entry - get the first element from a list > + * @ptr: the list head to take the element from. > + * @type: the type of the struct this is embedded in. > + * @member: the name of the list_struct within the struct. > + * > + * Note, that list is expected to be not empty. > + */ > +#define list_first_entry(ptr, type, member) \ > + list_entry((ptr)->next, type, member) > > /** > * list_for_each - iterate over a list > - * @pos: the &struct list_head to use as a loop counter. > + * @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, prefetch(pos->next)) > + 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) > + > /** > * list_for_each_prev - iterate over a list backwards > - * @pos: the &struct list_head to use as a loop counter. > + * @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, prefetch(pos->prev); pos != (head); \ > - pos = pos->prev, prefetch(pos->prev)) > + for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \ > + pos = pos->prev) > > /** > - * list_for_each_safe - iterate over a list safe against removal of list entry > - * @pos: the &struct list_head to use as a loop counter. > + * list_for_each_safe - iterate over a list safe against removal of list entry > + * @pos: the &struct list_head to use as a loop cursor. > * @n: another &struct list_head to use as temporary storage > * @head: the head for your list. > */ > @@ -217,42 +312,294 @@ static inline void list_splice_init(struct list_head *list, > > /** > * list_for_each_entry - iterate over list of given type > - * @pos: the type * to use as a loop counter. > + * @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. > */ > #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), \ > - prefetch(pos->member.next)) > + 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)) > + > +/** > + * 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. > + */ > +#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)) > + > +/** > + * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() > + * @pos: the type * to use as a start point > + * @head: the head of the list > + * @member: the name of the list_struct within the struct. > + * > + * 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)) > + > +/** > + * 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. > + * > + * 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)) > + > +/** > + * 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. > + * > + * 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)) > > /** > * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry > - * @pos: the type * to use as a loop counter. > + * @pos: the type * to use as a loop cursor. > * @n: another type * to use as temporary storage > * @head: the head for your list. > * @member: the name of the list_struct within the struct. > */ > #define list_for_each_entry_safe(pos, n, head, member) \ > for (pos = list_entry((head)->next, typeof(*pos), member), \ > - n = list_entry(pos->member.next, typeof(*pos), member); \ > - &pos->member != (head); \ > + n = list_entry(pos->member.next, typeof(*pos), member); \ > + &pos->member != (head); \ > pos = n, n = list_entry(n->member.next, typeof(*n), member)) > > /** > - * list_for_each_entry_continue - iterate over list of given type > - * continuing after existing point > - * @pos: the type * to use as a loop counter. > + * list_for_each_entry_safe_continue > + * @pos: the type * to use as a loop cursor. > + * @n: another type * to use as temporary storage > * @head: the head for your list. > * @member: the name of the list_struct within the struct. > + * > + * Iterate over list of given type, continuing after current point, > + * safe against removal of list entry. > + */ > +#define list_for_each_entry_safe_continue(pos, n, head, member) \ > + for (pos = list_entry(pos->member.next, typeof(*pos), member), \ > + n = list_entry(pos->member.next, typeof(*pos), member); \ > + &pos->member != (head); \ > + pos = n, n = list_entry(n->member.next, typeof(*n), member)) > + > +/** > + * list_for_each_entry_safe_from > + * @pos: the type * to use as a loop cursor. > + * @n: another type * to use as temporary storage > + * @head: the head for your list. > + * @member: the name of the list_struct within the struct. > + * > + * Iterate over list of given type from current point, safe against > + * removal of list entry. > + */ > +#define list_for_each_entry_safe_from(pos, n, head, member) \ > + for (n = list_entry(pos->member.next, typeof(*pos), member); \ > + &pos->member != (head); \ > + pos = n, n = list_entry(n->member.next, typeof(*n), member)) > + > +/** > + * list_for_each_entry_safe_reverse > + * @pos: the type * to use as a loop cursor. > + * @n: another type * to use as temporary storage > + * @head: the head for your list. > + * @member: the name of the list_struct within the struct. > + * > + * Iterate backwards over list of given type, safe against removal > + * of list entry. > + */ > +#define list_for_each_entry_safe_reverse(pos, n, head, member) \ > + for (pos = list_entry((head)->prev, typeof(*pos), member), \ > + n = list_entry(pos->member.prev, typeof(*pos), member); \ > + &pos->member != (head); \ > + pos = n, n = list_entry(n->member.prev, typeof(*n), member)) > + > +/** > + * list_add_sort - add a new entry to a sorted list > + * @new: new entry to be added > + * @head: list head to add it in > + * @compare: Compare function to compare two list entries > + * > + * Insert a new entry before the specified head. > + * This is useful for implementing queues. > + */ > +static inline void list_add_sort(struct list_head *new, struct list_head *head, > + int (*compare)(struct list_head *a, struct list_head *b)) > +{ > + struct list_head *pos, *insert = head; > + > + list_for_each(pos, head) { > + if (compare(pos, new) < 0) > + continue; > + insert = pos; > + break; > + } > + > + list_add_tail(new, insert); > +} > + > +/* > + * Double linked lists with a single pointer list head. > + * Mostly useful for hash tables where the two pointer list head is > + * too wasteful. > + * You lose the ability to access the tail in O(1). > + */ > + > +struct hlist_head { > + struct hlist_node *first; > +}; > + > +struct hlist_node { > + struct hlist_node *next, **pprev; > +}; > + > +#define HLIST_HEAD_INIT { .first = NULL } > +#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } > +#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) > +static inline void INIT_HLIST_NODE(struct hlist_node *h) > +{ > + h->next = NULL; > + h->pprev = NULL; > +} > + > +static inline int hlist_unhashed(const struct hlist_node *h) > +{ > + return !h->pprev; > +} > + > +static inline int hlist_empty(const struct hlist_head *h) > +{ > + return !h->first; > +} > + > +static inline void __hlist_del(struct hlist_node *n) > +{ > + struct hlist_node *next = n->next; > + struct hlist_node **pprev = n->pprev; > + *pprev = next; > + if (next) > + next->pprev = pprev; > +} > + > +static inline void hlist_del(struct hlist_node *n) > +{ > + __hlist_del(n); > + n->next = LIST_POISON1; > + n->pprev = LIST_POISON2; > +} > + > +static inline void hlist_del_init(struct hlist_node *n) > +{ > + if (!hlist_unhashed(n)) { > + __hlist_del(n); > + INIT_HLIST_NODE(n); > + } > +} > + > +static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) > +{ > + struct hlist_node *first = h->first; > + n->next = first; > + if (first) > + first->pprev = &n->next; > + h->first = n; > + n->pprev = &h->first; > +} > + > +/* next must be != NULL */ > +static inline void hlist_add_before(struct hlist_node *n, > + struct hlist_node *next) > +{ > + n->pprev = next->pprev; > + n->next = next; > + next->pprev = &n->next; > + *(n->pprev) = n; > +} > + > +static inline void hlist_add_after(struct hlist_node *n, > + struct hlist_node *next) > +{ > + next->next = n->next; > + n->next = next; > + next->pprev = &n->next; > + > + if(next->next) > + next->next->pprev = &next->next; > +} > + > +#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) > + > +#define hlist_for_each_safe(pos, n, head) \ > + for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ > + pos = n) > + > +/** > + * hlist_for_each_entry - iterate over list of given type > + * @tpos: the type * to use as a loop cursor. > + * @pos: the &struct hlist_node to use as a loop cursor. > + * @head: the head for your list. > + * @member: the name of the hlist_node within the struct. > + */ > +#define hlist_for_each_entry(tpos, pos, head, member) \ > + for (pos = (head)->first; \ > + pos && ({ prefetch(pos->next); 1;}) && \ > + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ > + pos = pos->next) > + > +/** > + * hlist_for_each_entry_continue - iterate over a hlist continuing after current point > + * @tpos: the type * to use as a loop cursor. > + * @pos: the &struct hlist_node to use as a loop cursor. > + * @member: the name of the hlist_node within the struct. > + */ > +#define hlist_for_each_entry_continue(tpos, pos, member) \ > + for (pos = (pos)->next; \ > + pos && ({ prefetch(pos->next); 1;}) && \ > + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ > + pos = pos->next) > + > +/** > + * hlist_for_each_entry_from - iterate over a hlist continuing from current point > + * @tpos: the type * to use as a loop cursor. > + * @pos: the &struct hlist_node to use as a loop cursor. > + * @member: the name of the hlist_node within the struct. > + */ > +#define hlist_for_each_entry_from(tpos, pos, member) \ > + for (; pos && ({ prefetch(pos->next); 1;}) && \ > + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ > + pos = pos->next) > + > +/** > + * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry > + * @tpos: the type * to use as a loop cursor. > + * @pos: the &struct hlist_node to use as a loop cursor. > + * @n: another &struct hlist_node to use as temporary storage > + * @head: the head for your list. > + * @member: the name of the hlist_node within the struct. > */ > -#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), \ > - prefetch(pos->member.next)) > +#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ > + for (pos = (head)->first; \ > + pos && ({ n = pos->next; 1; }) && \ > + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ > + pos = n) > > #endif > diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h > index 6a1fcb9..b574778 100644 > --- a/include/linux/mtd/mtd.h > +++ b/include/linux/mtd/mtd.h > @@ -11,7 +11,7 @@ > > #include <driver.h> > #include <linux/types.h> > -#include <list.h> > +#include <linux/list.h> > #include <linux/mtd/mtd-abi.h> > > #define MTD_CHAR_MAJOR 90 > diff --git a/include/list.h b/include/list.h > deleted file mode 100644 > index 1e8bc51..0000000 > --- a/include/list.h > +++ /dev/null > @@ -1,605 +0,0 @@ > -#ifndef _LINUX_LIST_H > -#define _LINUX_LIST_H > - > -/* > - * Simple doubly linked list implementation. > - * > - * Some of the internal functions ("__xxx") are useful when > - * manipulating whole lists rather than single entries, as > - * sometimes we already know the next/prev entries and we can > - * generate better code by using them directly rather than > - * using the generic single-entry routines. > - */ > - > -#define LIST_POISON1 ((void *) 0x00100100) > -#define LIST_POISON2 ((void *) 0x00200200) > -static inline void prefetch(const void *x) {;} > - > -struct list_head { > - struct list_head *next, *prev; > -}; > - > -#define LIST_HEAD_INIT(name) { &(name), &(name) } > - > -#define LIST_HEAD(name) \ > - struct list_head name = LIST_HEAD_INIT(name) > - > -static inline void INIT_LIST_HEAD(struct list_head *list) > -{ > - list->next = list; > - list->prev = list; > -} > - > -/* > - * Insert a new entry between two known consecutive entries. > - * > - * This is only for internal list manipulation where we know > - * the prev/next entries already! > - */ > -#ifndef CONFIG_DEBUG_LIST > -static inline void __list_add(struct list_head *new, > - struct list_head *prev, > - struct list_head *next) > -{ > - next->prev = new; > - new->next = next; > - new->prev = prev; > - prev->next = new; > -} > -#else > -extern void __list_add(struct list_head *new, > - struct list_head *prev, > - struct list_head *next); > -#endif > - > -/** > - * list_add - add a new entry > - * @new: new entry to be added > - * @head: list head to add it after > - * > - * Insert a new entry after the specified head. > - * This is good for implementing stacks. > - */ > -#ifndef CONFIG_DEBUG_LIST > -static inline void list_add(struct list_head *new, struct list_head *head) > -{ > - __list_add(new, head, head->next); > -} > -#else > -extern void list_add(struct list_head *new, struct list_head *head); > -#endif > - > - > -/** > - * list_add_tail - add a new entry > - * @new: new entry to be added > - * @head: list head to add it before > - * > - * Insert a new entry before the specified head. > - * This is useful for implementing queues. > - */ > -static inline void list_add_tail(struct list_head *new, struct list_head *head) > -{ > - __list_add(new, head->prev, head); > -} > - > -/* > - * Delete a list entry by making the prev/next entries > - * point to each other. > - * > - * This is only for internal list manipulation where we know > - * the prev/next entries already! > - */ > -static inline void __list_del(struct list_head * prev, struct list_head * next) > -{ > - next->prev = prev; > - prev->next = next; > -} > - > -/** > - * list_del - deletes entry from list. > - * @entry: the element to delete from the list. > - * Note: list_empty() on entry does not return true after this, the entry is > - * in an undefined state. > - */ > -#ifndef CONFIG_DEBUG_LIST > -static inline void list_del(struct list_head *entry) > -{ > - __list_del(entry->prev, entry->next); > - entry->next = LIST_POISON1; > - entry->prev = LIST_POISON2; > -} > -#else > -extern void list_del(struct list_head *entry); > -#endif > - > -/** > - * list_replace - replace old entry by new one > - * @old : the element to be replaced > - * @new : the new element to insert > - * > - * If @old was empty, it will be overwritten. > - */ > -static inline void list_replace(struct list_head *old, > - struct list_head *new) > -{ > - new->next = old->next; > - new->next->prev = new; > - new->prev = old->prev; > - new->prev->next = new; > -} > - > -static inline void list_replace_init(struct list_head *old, > - struct list_head *new) > -{ > - list_replace(old, new); > - INIT_LIST_HEAD(old); > -} > - > -/** > - * list_del_init - deletes entry from list and reinitialize it. > - * @entry: the element to delete from the list. > - */ > -static inline void list_del_init(struct list_head *entry) > -{ > - __list_del(entry->prev, entry->next); > - INIT_LIST_HEAD(entry); > -} > - > -/** > - * list_move - delete from one list and add as another's head > - * @list: the entry to move > - * @head: the head that will precede our entry > - */ > -static inline void list_move(struct list_head *list, struct list_head *head) > -{ > - __list_del(list->prev, list->next); > - list_add(list, head); > -} > - > -/** > - * list_move_tail - delete from one list and add as another's tail > - * @list: the entry to move > - * @head: the head that will follow our entry > - */ > -static inline void list_move_tail(struct list_head *list, > - struct list_head *head) > -{ > - __list_del(list->prev, list->next); > - list_add_tail(list, head); > -} > - > -/** > - * list_is_last - tests whether @list is the last entry in list @head > - * @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) > -{ > - return list->next == head; > -} > - > -/** > - * list_empty - tests whether a list is empty > - * @head: the list to test. > - */ > -static inline int list_empty(const struct list_head *head) > -{ > - return head->next == head; > -} > - > -/** > - * list_empty_careful - tests whether a list is empty and not being modified > - * @head: the list to test > - * > - * Description: > - * tests whether a list is empty _and_ checks that no other CPU might be > - * in the process of modifying either member (next or prev) > - * > - * NOTE: using list_empty_careful() without synchronization > - * can only be safe if the only activity that can happen > - * to the list entry is list_del_init(). Eg. it cannot be used > - * if another CPU could re-list_add() it. > - */ > -static inline int list_empty_careful(const struct list_head *head) > -{ > - struct list_head *next = head->next; > - return (next == head) && (next == head->prev); > -} > - > -static inline void __list_splice(struct list_head *list, > - struct list_head *head) > -{ > - struct list_head *first = list->next; > - struct list_head *last = list->prev; > - struct list_head *at = head->next; > - > - first->prev = head; > - head->next = first; > - > - last->next = at; > - at->prev = last; > -} > - > -/** > - * list_splice - join two lists > - * @list: the new list to add. > - * @head: the place to add it in the first list. > - */ > -static inline void list_splice(struct list_head *list, struct list_head *head) > -{ > - if (!list_empty(list)) > - __list_splice(list, head); > -} > - > -/** > - * list_splice_init - join two lists and reinitialise the emptied list. > - * @list: the new list to add. > - * @head: the place to add it in the first list. > - * > - * The list at @list is reinitialised > - */ > -static inline void list_splice_init(struct list_head *list, > - struct list_head *head) > -{ > - if (!list_empty(list)) { > - __list_splice(list, head); > - INIT_LIST_HEAD(list); > - } > -} > - > -/** > - * list_entry - get the struct for this entry > - * @ptr: the &struct list_head pointer. > - * @type: the type of the struct this is embedded in. > - * @member: the name of the list_struct within the struct. > - */ > -#define list_entry(ptr, type, member) \ > - container_of(ptr, type, member) > - > -/** > - * list_first_entry - get the first element from a list > - * @ptr: the list head to take the element from. > - * @type: the type of the struct this is embedded in. > - * @member: the name of the list_struct within the struct. > - * > - * Note, that list is expected to be not empty. > - */ > -#define list_first_entry(ptr, type, member) \ > - list_entry((ptr)->next, type, 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) > - > -/** > - * 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; prefetch(pos->prev), pos != (head); \ > - pos = pos->prev) > - > -/** > - * list_for_each_safe - iterate over a list safe against removal of list entry > - * @pos: the &struct list_head to use as a loop cursor. > - * @n: another &struct list_head to use as temporary storage > - * @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) > - > -/** > - * 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. > - */ > -#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)) > - > -/** > - * 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. > - */ > -#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)) > - > -/** > - * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() > - * @pos: the type * to use as a start point > - * @head: the head of the list > - * @member: the name of the list_struct within the struct. > - * > - * 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)) > - > -/** > - * 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. > - * > - * 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)) > - > -/** > - * 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. > - * > - * 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)) > - > -/** > - * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry > - * @pos: the type * to use as a loop cursor. > - * @n: another type * to use as temporary storage > - * @head: the head for your list. > - * @member: the name of the list_struct within the struct. > - */ > -#define list_for_each_entry_safe(pos, n, head, member) \ > - for (pos = list_entry((head)->next, typeof(*pos), member), \ > - n = list_entry(pos->member.next, typeof(*pos), member); \ > - &pos->member != (head); \ > - pos = n, n = list_entry(n->member.next, typeof(*n), member)) > - > -/** > - * list_for_each_entry_safe_continue > - * @pos: the type * to use as a loop cursor. > - * @n: another type * to use as temporary storage > - * @head: the head for your list. > - * @member: the name of the list_struct within the struct. > - * > - * Iterate over list of given type, continuing after current point, > - * safe against removal of list entry. > - */ > -#define list_for_each_entry_safe_continue(pos, n, head, member) \ > - for (pos = list_entry(pos->member.next, typeof(*pos), member), \ > - n = list_entry(pos->member.next, typeof(*pos), member); \ > - &pos->member != (head); \ > - pos = n, n = list_entry(n->member.next, typeof(*n), member)) > - > -/** > - * list_for_each_entry_safe_from > - * @pos: the type * to use as a loop cursor. > - * @n: another type * to use as temporary storage > - * @head: the head for your list. > - * @member: the name of the list_struct within the struct. > - * > - * Iterate over list of given type from current point, safe against > - * removal of list entry. > - */ > -#define list_for_each_entry_safe_from(pos, n, head, member) \ > - for (n = list_entry(pos->member.next, typeof(*pos), member); \ > - &pos->member != (head); \ > - pos = n, n = list_entry(n->member.next, typeof(*n), member)) > - > -/** > - * list_for_each_entry_safe_reverse > - * @pos: the type * to use as a loop cursor. > - * @n: another type * to use as temporary storage > - * @head: the head for your list. > - * @member: the name of the list_struct within the struct. > - * > - * Iterate backwards over list of given type, safe against removal > - * of list entry. > - */ > -#define list_for_each_entry_safe_reverse(pos, n, head, member) \ > - for (pos = list_entry((head)->prev, typeof(*pos), member), \ > - n = list_entry(pos->member.prev, typeof(*pos), member); \ > - &pos->member != (head); \ > - pos = n, n = list_entry(n->member.prev, typeof(*n), member)) > - > -/** > - * list_add_sort - add a new entry to a sorted list > - * @new: new entry to be added > - * @head: list head to add it in > - * @compare: Compare function to compare two list entries > - * > - * Insert a new entry before the specified head. > - * This is useful for implementing queues. > - */ > -static inline void list_add_sort(struct list_head *new, struct list_head *head, > - int (*compare)(struct list_head *a, struct list_head *b)) > -{ > - struct list_head *pos, *insert = head; > - > - list_for_each(pos, head) { > - if (compare(pos, new) < 0) > - continue; > - insert = pos; > - break; > - } > - > - list_add_tail(new, insert); > -} > - > -/* > - * Double linked lists with a single pointer list head. > - * Mostly useful for hash tables where the two pointer list head is > - * too wasteful. > - * You lose the ability to access the tail in O(1). > - */ > - > -struct hlist_head { > - struct hlist_node *first; > -}; > - > -struct hlist_node { > - struct hlist_node *next, **pprev; > -}; > - > -#define HLIST_HEAD_INIT { .first = NULL } > -#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } > -#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) > -static inline void INIT_HLIST_NODE(struct hlist_node *h) > -{ > - h->next = NULL; > - h->pprev = NULL; > -} > - > -static inline int hlist_unhashed(const struct hlist_node *h) > -{ > - return !h->pprev; > -} > - > -static inline int hlist_empty(const struct hlist_head *h) > -{ > - return !h->first; > -} > - > -static inline void __hlist_del(struct hlist_node *n) > -{ > - struct hlist_node *next = n->next; > - struct hlist_node **pprev = n->pprev; > - *pprev = next; > - if (next) > - next->pprev = pprev; > -} > - > -static inline void hlist_del(struct hlist_node *n) > -{ > - __hlist_del(n); > - n->next = LIST_POISON1; > - n->pprev = LIST_POISON2; > -} > - > -static inline void hlist_del_init(struct hlist_node *n) > -{ > - if (!hlist_unhashed(n)) { > - __hlist_del(n); > - INIT_HLIST_NODE(n); > - } > -} > - > -static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) > -{ > - struct hlist_node *first = h->first; > - n->next = first; > - if (first) > - first->pprev = &n->next; > - h->first = n; > - n->pprev = &h->first; > -} > - > -/* next must be != NULL */ > -static inline void hlist_add_before(struct hlist_node *n, > - struct hlist_node *next) > -{ > - n->pprev = next->pprev; > - n->next = next; > - next->pprev = &n->next; > - *(n->pprev) = n; > -} > - > -static inline void hlist_add_after(struct hlist_node *n, > - struct hlist_node *next) > -{ > - next->next = n->next; > - n->next = next; > - next->pprev = &n->next; > - > - if(next->next) > - next->next->pprev = &next->next; > -} > - > -#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) > - > -#define hlist_for_each_safe(pos, n, head) \ > - for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ > - pos = n) > - > -/** > - * hlist_for_each_entry - iterate over list of given type > - * @tpos: the type * to use as a loop cursor. > - * @pos: the &struct hlist_node to use as a loop cursor. > - * @head: the head for your list. > - * @member: the name of the hlist_node within the struct. > - */ > -#define hlist_for_each_entry(tpos, pos, head, member) \ > - for (pos = (head)->first; \ > - pos && ({ prefetch(pos->next); 1;}) && \ > - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ > - pos = pos->next) > - > -/** > - * hlist_for_each_entry_continue - iterate over a hlist continuing after current point > - * @tpos: the type * to use as a loop cursor. > - * @pos: the &struct hlist_node to use as a loop cursor. > - * @member: the name of the hlist_node within the struct. > - */ > -#define hlist_for_each_entry_continue(tpos, pos, member) \ > - for (pos = (pos)->next; \ > - pos && ({ prefetch(pos->next); 1;}) && \ > - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ > - pos = pos->next) > - > -/** > - * hlist_for_each_entry_from - iterate over a hlist continuing from current point > - * @tpos: the type * to use as a loop cursor. > - * @pos: the &struct hlist_node to use as a loop cursor. > - * @member: the name of the hlist_node within the struct. > - */ > -#define hlist_for_each_entry_from(tpos, pos, member) \ > - for (; pos && ({ prefetch(pos->next); 1;}) && \ > - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ > - pos = pos->next) > - > -/** > - * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry > - * @tpos: the type * to use as a loop cursor. > - * @pos: the &struct hlist_node to use as a loop cursor. > - * @n: another &struct hlist_node to use as temporary storage > - * @head: the head for your list. > - * @member: the name of the hlist_node within the struct. > - */ > -#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ > - for (pos = (head)->first; \ > - pos && ({ n = pos->next; 1; }) && \ > - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ > - pos = n) > - > -#endif > diff --git a/include/module.h b/include/module.h > index 3c8f39a..03b226a 100644 > --- a/include/module.h > +++ b/include/module.h > @@ -3,7 +3,7 @@ > > #include <elf.h> > #include <linux/compiler.h> > -#include <list.h> > +#include <linux/list.h> > > #ifndef MODULE_SYMBOL_PREFIX > #define MODULE_SYMBOL_PREFIX > diff --git a/include/stringlist.h b/include/stringlist.h > index 87380cb..3453e9a 100644 > --- a/include/stringlist.h > +++ b/include/stringlist.h > @@ -1,7 +1,7 @@ > #ifndef __STRING_H > #define __STRING_H > > -#include <list.h> > +#include <linux/list.h> > > struct string_list { > struct list_head list; > diff --git a/include/usb/gadget.h b/include/usb/gadget.h > index 67f3ee4..798b51b 100644 > --- a/include/usb/gadget.h > +++ b/include/usb/gadget.h > @@ -18,7 +18,7 @@ > #include <usb/ch9.h> > #include <malloc.h> > #include <errno.h> > -#include <list.h> > +#include <linux/list.h> > > struct usb_ep; > > diff --git a/lib/driver.c b/lib/driver.c > index 73bd9a8..67c7b0f 100644 > --- a/lib/driver.c > +++ b/lib/driver.c > @@ -32,7 +32,7 @@ > #include <linux/ctype.h> > #include <errno.h> > #include <fs.h> > -#include <list.h> > +#include <linux/list.h> > > LIST_HEAD(device_list); > EXPORT_SYMBOL(device_list); > diff --git a/lib/notifier.c b/lib/notifier.c > index 9e8eb4e..a2aac53 100644 > --- a/lib/notifier.c > +++ b/lib/notifier.c > @@ -1,5 +1,5 @@ > #include <common.h> > -#include <list.h> > +#include <linux/list.h> > #include <notifier.h> > > int notifier_chain_register(struct notifier_head *nh, struct notifier_block *n) > -- > 1.6.5 > > -- > Pengutronix e.K. | | > Industrial Linux Solutions | http://www.pengutronix.de/ | > Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | > Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | > > _______________________________________________ > u-boot-v2 mailing list > u-boot-v2@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/u-boot-v2 > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ u-boot-v2 mailing list u-boot-v2@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/u-boot-v2