diff options
author | Oleg Nesterov <oleg@redhat.com> | 2013-07-08 17:24:19 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-07-13 05:29:32 -0400 |
commit | e9a17bd73a29e5323c37ec5ffe50fc0e825d3d03 (patch) | |
tree | bae88dcb02c02d93bd2eca8ba3334b2f16a14b9d /include | |
parent | fb4214db50b00558cc6e274c88b3f7325068e942 (diff) |
llist: llist_add() can use llist_add_batch()
llist_add(new, head) can simply use llist_add_batch(new, new, head),
no need to duplicate the code.
This obviously uninlines llist_add() and to me this is a win. But we
can make llist_add_batch() inline if this is desirable, in this case
gcc can notice that new_first == new_last if the caller is llist_add().
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andrey Vagin <avagin@openvz.org>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Huang Ying <ying.huang@intel.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/llist.h | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/include/linux/llist.h b/include/linux/llist.h index 3e2b969d68f6..cdaa7f023899 100644 --- a/include/linux/llist.h +++ b/include/linux/llist.h | |||
@@ -142,6 +142,9 @@ static inline struct llist_node *llist_next(struct llist_node *node) | |||
142 | return node->next; | 142 | return node->next; |
143 | } | 143 | } |
144 | 144 | ||
145 | extern bool llist_add_batch(struct llist_node *new_first, | ||
146 | struct llist_node *new_last, | ||
147 | struct llist_head *head); | ||
145 | /** | 148 | /** |
146 | * llist_add - add a new entry | 149 | * llist_add - add a new entry |
147 | * @new: new entry to be added | 150 | * @new: new entry to be added |
@@ -151,13 +154,7 @@ static inline struct llist_node *llist_next(struct llist_node *node) | |||
151 | */ | 154 | */ |
152 | static inline bool llist_add(struct llist_node *new, struct llist_head *head) | 155 | static inline bool llist_add(struct llist_node *new, struct llist_head *head) |
153 | { | 156 | { |
154 | struct llist_node *first; | 157 | return llist_add_batch(new, new, head); |
155 | |||
156 | do { | ||
157 | new->next = first = ACCESS_ONCE(head->first); | ||
158 | } while (cmpxchg(&head->first, first, new) != first); | ||
159 | |||
160 | return !first; | ||
161 | } | 158 | } |
162 | 159 | ||
163 | /** | 160 | /** |
@@ -173,9 +170,6 @@ static inline struct llist_node *llist_del_all(struct llist_head *head) | |||
173 | return xchg(&head->first, NULL); | 170 | return xchg(&head->first, NULL); |
174 | } | 171 | } |
175 | 172 | ||
176 | extern bool llist_add_batch(struct llist_node *new_first, | ||
177 | struct llist_node *new_last, | ||
178 | struct llist_head *head); | ||
179 | extern struct llist_node *llist_del_first(struct llist_head *head); | 173 | extern struct llist_node *llist_del_first(struct llist_head *head); |
180 | 174 | ||
181 | #endif /* LLIST_H */ | 175 | #endif /* LLIST_H */ |