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/linux | |
| 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/linux')
| -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 */ |
