From 48a71ae76f5b7535f787a34b34162c2235550261 Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Sat, 9 Jul 2016 11:31:01 +0200 Subject: [PATCH] include: add linked list implementation from kernel Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1342515 Upstream Status: iproute2.git commit 4952b45946d73 Conflicts: Dropped changes in tc/tc_class.c since commit d954b34a1f8d8 ("tc class: Show classes as ASCII graph") is missing. commit 4952b45946d73a4e5dd673928cf50327251de1de Author: Jiri Pirko Date: Tue Mar 22 10:02:20 2016 +0100 include: add linked list implementation from kernel Rename hlist.h to list.h while adding it to be aligned with kernel Signed-off-by: Jiri Pirko --- include/hlist.h | 56 ---------------------------- include/list.h | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ip/ipnetns.c | 2 +- lib/ll_map.c | 2 +- 4 files changed, 114 insertions(+), 58 deletions(-) delete mode 100644 include/hlist.h create mode 100644 include/list.h diff --git a/include/hlist.h b/include/hlist.h deleted file mode 100644 index 4e8de9e..0000000 --- a/include/hlist.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef __HLIST_H__ -#define __HLIST_H__ 1 -/* Hash list stuff from kernel */ - -#include - -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) - -struct hlist_head { - struct hlist_node *first; -}; - -struct hlist_node { - struct hlist_node *next, **pprev; -}; - -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_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; -} - -#define hlist_for_each(pos, head) \ - 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; }); \ - pos = n) - -#define hlist_entry_safe(ptr, type, member) \ - ({ typeof(ptr) ____ptr = (ptr); \ - ____ptr ? hlist_entry(____ptr, type, member) : NULL; \ - }) - -#define hlist_for_each_entry(pos, head, member) \ - for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\ - pos; \ - pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) - -#endif /* __HLIST_H__ */ diff --git a/include/list.h b/include/list.h new file mode 100644 index 0000000..cdebe4d --- /dev/null +++ b/include/list.h @@ -0,0 +1,112 @@ +#ifndef __LIST_H__ +#define __LIST_H__ 1 +/* List and hash list stuff from kernel */ + +#include + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +struct list_head { + struct list_head *next, *prev; +}; + +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = 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; +} + +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +static inline void __list_del(struct list_head *prev, struct list_head *next) +{ + next->prev = prev; + prev->next = next; +} + +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +#define list_next_entry(pos, member) \ + list_entry((pos)->member.next, typeof(*(pos)), member) + +#define list_for_each_entry(pos, head, member) \ + for (pos = list_first_entry(head, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_next_entry(pos, member)) + +#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); \ + pos = n, n = list_next_entry(n, member)) + +struct hlist_head { + struct hlist_node *first; +}; + +struct hlist_node { + struct hlist_node *next, **pprev; +}; + +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_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; +} + +#define hlist_for_each(pos, head) \ + 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; }); \ + pos = n) + +#define hlist_entry_safe(ptr, type, member) \ + ({ typeof(ptr) ____ptr = (ptr); \ + ____ptr ? hlist_entry(____ptr, type, member) : NULL; \ + }) + +#define hlist_for_each_entry(pos, head, member) \ + for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\ + pos; \ + pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) + +#endif /* __LIST_H__ */ diff --git a/ip/ipnetns.c b/ip/ipnetns.c index 2c848bc..ef05ff3 100644 --- a/ip/ipnetns.c +++ b/ip/ipnetns.c @@ -19,7 +19,7 @@ #include #include "utils.h" -#include "hlist.h" +#include "list.h" #include "ip_common.h" #include "namespace.h" diff --git a/lib/ll_map.c b/lib/ll_map.c index c6f7027..fa14a77 100644 --- a/lib/ll_map.c +++ b/lib/ll_map.c @@ -22,7 +22,7 @@ #include "libnetlink.h" #include "ll_map.h" -#include "hlist.h" +#include "list.h" struct ll_cache { struct hlist_node idx_hash; -- 1.8.3.1