llist: Move cpu_relax() to after the cmpxchg()
[platform/adaptation/renesas_rcar/renesas_kernel.git] / lib / llist.c
index b445f2c..6c69f1d 100644 (file)
@@ -41,11 +41,14 @@ void llist_add_batch(struct llist_node *new_first, struct llist_node *new_last,
        struct llist_node *entry, *old_entry;
 
        entry = head->first;
-       do {
+       for (;;) {
                old_entry = entry;
                new_last->next = entry;
+               entry = cmpxchg(&head->first, old_entry, new_first);
+               if (entry == old_entry)
+                       break;
                cpu_relax();
-       } while ((entry = cmpxchg(&head->first, old_entry, new_first)) != old_entry);
+       }
 }
 EXPORT_SYMBOL_GPL(llist_add_batch);
 
@@ -68,13 +71,16 @@ struct llist_node *llist_del_first(struct llist_head *head)
        struct llist_node *entry, *old_entry, *next;
 
        entry = head->first;
-       do {
+       for (;;) {
                if (entry == NULL)
                        return NULL;
                old_entry = entry;
                next = entry->next;
+               entry = cmpxchg(&head->first, old_entry, next);
+               if (entry == old_entry)
+                       break;
                cpu_relax();
-       } while ((entry = cmpxchg(&head->first, old_entry, next)) != old_entry);
+       }
 
        return entry;
 }