From: david.laight.linux@gmail.com
To: Waiman Long <longman@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>, Will Deacon <will@kernel.org>,
Boqun Feng <boqun@kernel.org>,
linux-kernel@vger.kernel.org,
Linus Torvalds <torvalds@linux-foundation.org>,
Yafang Shao <loaor.shao@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>
Cc: David Laight <david.laight.linux@gmail.com>
Subject: [PATCH v3 next 4/5] Optimise decode_cpu() and per_cpu_ptr()
Date: Fri, 6 Mar 2026 22:51:49 +0000 [thread overview]
Message-ID: <20260306225150.93178-5-david.laight.linux@gmail.com> (raw)
In-Reply-To: <20260306225150.93178-1-david.laight.linux@gmail.com>
From: David Laight <david.laight.linux@gmail.com>
Changing the 'cpu number' variables to 'unsigned int' generates
slightly better code (and the values can never be negative).
More specifically gcc knows that decrementing the 'encoded' value
zeros the high 32bits (on sane 64bit architectures) so that it doesn't
need to zero/sign extend the value to index __per_cpu_offset[].
Not massive but saves two instructions.
Signed-off-by: David Laight <david.laight.linux@gmail.com>
---
Proposed by Linus.
Part of a discussion from v1 about whether removing the offset would help.
kernel/locking/osq_lock.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/kernel/locking/osq_lock.c b/kernel/locking/osq_lock.c
index 5dd7e08d4fda..0619691e2756 100644
--- a/kernel/locking/osq_lock.c
+++ b/kernel/locking/osq_lock.c
@@ -15,7 +15,7 @@
struct optimistic_spin_node {
struct optimistic_spin_node *next;
int locked; /* 1 if lock acquired */
- int prev_cpu; /* encoded CPU # + 1 value */
+ unsigned int prev_cpu; /* encoded CPU # + 1 value */
};
static DEFINE_PER_CPU_SHARED_ALIGNED(struct optimistic_spin_node, osq_node);
@@ -24,19 +24,19 @@ static DEFINE_PER_CPU_SHARED_ALIGNED(struct optimistic_spin_node, osq_node);
* We use the value 0 to represent "no CPU", thus the encoded value
* will be the CPU number incremented by 1.
*/
-static inline int encode_cpu(int cpu_nr)
+static inline unsigned int encode_cpu(unsigned int cpu_nr)
{
return cpu_nr + 1;
}
-static inline int prev_cpu_nr(struct optimistic_spin_node *node)
+static inline unsigned int prev_cpu_nr(struct optimistic_spin_node *node)
{
return READ_ONCE(node->prev_cpu) - 1;
}
-static inline struct optimistic_spin_node *decode_cpu(int encoded_cpu_val)
+static inline struct optimistic_spin_node *decode_cpu(unsigned int encoded_cpu_val)
{
- int cpu_nr = encoded_cpu_val - 1;
+ unsigned int cpu_nr = encoded_cpu_val - 1;
return per_cpu_ptr(&osq_node, cpu_nr);
}
@@ -53,9 +53,9 @@ static inline struct optimistic_spin_node *decode_cpu(int encoded_cpu_val)
static inline struct optimistic_spin_node *
osq_wait_next(struct optimistic_spin_queue *lock,
struct optimistic_spin_node *node,
- int old_cpu)
+ unsigned int old_cpu)
{
- int curr = encode_cpu(smp_processor_id());
+ unsigned int curr = encode_cpu(smp_processor_id());
for (;;) {
if (atomic_read(&lock->tail) == curr &&
@@ -94,8 +94,8 @@ bool osq_lock(struct optimistic_spin_queue *lock)
{
struct optimistic_spin_node *node = this_cpu_ptr(&osq_node);
struct optimistic_spin_node *prev, *next;
- int curr = encode_cpu(smp_processor_id());
- int prev_cpu;
+ unsigned int curr = encode_cpu(smp_processor_id());
+ unsigned int prev_cpu;
node->next = NULL;
--
2.39.5
next prev parent reply other threads:[~2026-03-06 22:51 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-06 22:51 [PATCH v3 next 0/5] locking/osq_lock: Optimisations to osq_lock code david.laight.linux
2026-03-06 22:51 ` [PATCH v3 next 1/5] Only clear node->locked in the slow osq_lock() path david.laight.linux
2026-03-06 23:01 ` David Laight
2026-03-06 22:51 ` [PATCH v3 next 2/5] Optimise vcpu_is_preempted() check david.laight.linux
2026-03-06 23:01 ` David Laight
2026-03-06 23:03 ` David Laight
2026-03-06 22:51 ` [PATCH v3 next 3/5] Use node->prev_cpu instead of saving node->prev david.laight.linux
2026-03-06 23:01 ` David Laight
2026-03-06 23:03 ` David Laight
2026-03-06 22:51 ` david.laight.linux [this message]
2026-03-06 23:01 ` [PATCH v3 next 4/5] Optimise decode_cpu() and per_cpu_ptr() David Laight
2026-03-06 23:03 ` David Laight
2026-03-06 22:51 ` [PATCH v3 next 5/5] Avoid writing to node->next in the osq_lock() fast path david.laight.linux
2026-03-06 23:04 ` David Laight
2026-03-07 0:06 ` Linus Torvalds
2026-03-07 11:32 ` David Laight
2026-03-11 19:27 ` Waiman Long
2026-03-11 19:40 ` Waiman Long
2026-03-11 21:50 ` David Laight
2026-03-06 22:59 ` [PATCH v3 next 0/5] locking/osq_lock: Optimisations to osq_lock code David Laight
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260306225150.93178-5-david.laight.linux@gmail.com \
--to=david.laight.linux@gmail.com \
--cc=boqun@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=loaor.shao@gmail.com \
--cc=longman@redhat.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=torvalds@linux-foundation.org \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox