If you are using linked lists for queus list_splice() will not do what you would expect even if you use the elements passed reversed. We need to handle these differently. We add list_splice_tail() and list_splice_tail_init() Signed-off-by: Luis R. Rodriguez <lrodriguez@xxxxxxxxxxx> --- drivers/net/wireless/ath9k/core.h | 42 ---------------------------------- include/linux/list.h | 45 ++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h index 1499f6e..807dcdf 100644 --- a/drivers/net/wireless/ath9k/core.h +++ b/drivers/net/wireless/ath9k/core.h @@ -52,19 +52,6 @@ struct ath_node; /* An attempt will be made to merge these link list helpers upstream * instead */ -static inline void __list_splice_tail(const struct list_head *list, - struct list_head *head) -{ - struct list_head *first = list->next; - struct list_head *last = list->prev; - struct list_head *current_tail = head->prev; - - current_tail->next = first; - last->next = head; - head->prev = last; - first->prev = current_tail; -} - static inline void __list_cut_position(struct list_head *list, struct list_head *head, struct list_head *entry) { @@ -79,35 +66,6 @@ static inline void __list_cut_position(struct list_head *list, } /** - * list_splice_tail - join two lists, each list being a queue - * @list: the new list to add. - * @head: the place to add it in the first list. - */ -static inline void list_splice_tail(const struct list_head *list, - struct list_head *head) -{ - if (!list_empty(list)) - __list_splice_tail(list, head); -} - -/** - * list_splice_tail_init - join two lists, each list being a queue, 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_tail_init(struct list_head *list, - struct list_head *head) -{ - if (!list_empty(list)) { - __list_splice_tail(list, head); - INIT_LIST_HEAD(list); - } -} - -/** * list_cut_position - cut a list into two * @list: a new list to add all removed entries * @head: a list with entries diff --git a/include/linux/list.h b/include/linux/list.h index 08cf4f6..fc7b700 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -341,7 +341,7 @@ static inline void __list_splice(const struct list_head *list, } /** - * list_splice - join two lists + * list_splice - join two lists, this is designed for stacks * @list: the new list to add. * @head: the place to add it in the first list. */ @@ -368,6 +368,49 @@ static inline void list_splice_init(struct list_head *list, } } +static inline void __list_splice_tail(const struct list_head *list, + struct list_head *head) +{ + struct list_head *first = list->next; + struct list_head *last = list->prev; + struct list_head *current_tail = head->prev; + + current_tail->next = first; + last->next = head; + head->prev = last; + first->prev = current_tail; +} + +/** + * list_splice_tail - join two lists, each list being a queue + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static inline void list_splice_tail(const struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) + __list_splice_tail(list, head); +} + +/** + * list_splice_tail_init - join two lists, each list being a queue, 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_tail_init(struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) { + __list_splice_tail(list, head); + INIT_LIST_HEAD(list); + } +} + + /** * list_splice_init_rcu - splice an RCU-protected list into an existing list. * @list: the RCU-protected list to splice -- 1.5.4.3 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html