summaryrefslogtreecommitdiff
path: root/lib/llist.c
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2022-10-17 16:52:26 +0200
committerAndrew Morton <akpm@linux-foundation.org>2022-11-18 13:55:06 -0800
commit6a6d7602caec1b49dda423b0d15a8c4f72c9c73d (patch)
tree59032d176d8d1229607e1bece6487369cc9282b2 /lib/llist.c
parentadd891f68d9d17dece8e1592c5e59a484fb7090e (diff)
downloadlwn-6a6d7602caec1b49dda423b0d15a8c4f72c9c73d.tar.gz
lwn-6a6d7602caec1b49dda423b0d15a8c4f72c9c73d.zip
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>
Diffstat (limited to 'lib/llist.c')
-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;