|
@@ -39,18 +39,13 @@
|
|
|
bool llist_add_batch(struct llist_node *new_first, struct llist_node *new_last,
|
|
|
struct llist_head *head)
|
|
|
{
|
|
|
- struct llist_node *entry, *old_entry;
|
|
|
+ struct llist_node *first;
|
|
|
|
|
|
- entry = head->first;
|
|
|
- for (;;) {
|
|
|
- old_entry = entry;
|
|
|
- new_last->next = entry;
|
|
|
- entry = cmpxchg(&head->first, old_entry, new_first);
|
|
|
- if (entry == old_entry)
|
|
|
- break;
|
|
|
- }
|
|
|
+ do {
|
|
|
+ new_last->next = first = ACCESS_ONCE(head->first);
|
|
|
+ } while (cmpxchg(&head->first, first, new_first) != first);
|
|
|
|
|
|
- return old_entry == NULL;
|
|
|
+ return !first;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(llist_add_batch);
|
|
|
|