diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2022-10-17 16:52:26 +0200 |
---|---|---|
committer | Andrew Morton <akpm@linux-foundation.org> | 2022-11-18 13:55:06 -0800 |
commit | 6a6d7602caec1b49dda423b0d15a8c4f72c9c73d (patch) | |
tree | 59032d176d8d1229607e1bece6487369cc9282b2 /lib/llist.c | |
parent | add891f68d9d17dece8e1592c5e59a484fb7090e (diff) | |
download | lwn-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.c | 4 |
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; |