summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2022-10-17 16:52:26 +0200
committerAndrew Morton <akpm@linux-foundation.org>2022-10-25 21:11:15 -0700
commite6f45b3d1bb6b7de2de274b628e3148cc03ab114 (patch)
treeda7428b030e3e0a82f27f6dd36ed0d2570c7006b
parente47e369b6180423c9beb8a25338c842f3668ebd8 (diff)
downloadlinux-e6f45b3d1bb6b7de2de274b628e3148cc03ab114.tar.gz
linux-e6f45b3d1bb6b7de2de274b628e3148cc03ab114.tar.xz
llist: avoid extra memory read in llist_add_batch
try_cmpxchg implicitly assigns old head->first value to "first" when cmpxchg fails. There is no need to re-read the value in the loop. Link: https://lkml.kernel.org/r/20221017145226.4044-1-ubizjak@gmail.com Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-rw-r--r--lib/llist.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/llist.c b/lib/llist.c
index 7d78b736e8af..6e668fa5a2c6 100644
--- a/lib/llist.c
+++ b/lib/llist.c
@@ -26,10 +26,10 @@
bool llist_add_batch(struct llist_node *new_first, struct llist_node *new_last,
struct llist_head *head)
{
- struct llist_node *first;
+ struct llist_node *first = READ_ONCE(head->first);
do {
- new_last->next = first = READ_ONCE(head->first);
+ new_last->next = first;
} while (!try_cmpxchg(&head->first, &first, new_first));
return !first;