From: Boqun Feng <boqun.feng@gmail.com>
To: Nicholas Piggin <npiggin@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>, Will Deacon <will@kernel.org>,
Waiman Long <longman@redhat.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 01/13] locking/qspinlock: remove pv_node abstraction
Date: Wed, 6 Jul 2022 16:23:36 -0700 [thread overview]
Message-ID: <YsYZeMJHsHwrOAe7@boqun-archlinux> (raw)
In-Reply-To: <20220704143820.3071004-2-npiggin@gmail.com>
On Tue, Jul 05, 2022 at 12:38:08AM +1000, Nicholas Piggin wrote:
> There isn't much point trying to separate struct qnode from struct pv_node
> when struct qnode has to know about pv_node anyway.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> kernel/locking/qspinlock.c | 3 ++-
> kernel/locking/qspinlock_paravirt.h | 34 ++++++++++++-----------------
> 2 files changed, 16 insertions(+), 21 deletions(-)
>
> diff --git a/kernel/locking/qspinlock.c b/kernel/locking/qspinlock.c
> index 65a9a10caa6f..a0fc21d99199 100644
> --- a/kernel/locking/qspinlock.c
> +++ b/kernel/locking/qspinlock.c
> @@ -82,7 +82,8 @@
> struct qnode {
> struct mcs_spinlock mcs;
> #ifdef CONFIG_PARAVIRT_SPINLOCKS
> - long reserved[2];
> + int cpu;
> + u8 state;
> #endif
> };
>
> diff --git a/kernel/locking/qspinlock_paravirt.h b/kernel/locking/qspinlock_paravirt.h
> index e84d21aa0722..b6a175155f36 100644
> --- a/kernel/locking/qspinlock_paravirt.h
> +++ b/kernel/locking/qspinlock_paravirt.h
> @@ -47,12 +47,6 @@ enum vcpu_state {
> vcpu_hashed, /* = pv_hash'ed + vcpu_halted */
> };
>
> -struct pv_node {
> - struct mcs_spinlock mcs;
> - int cpu;
> - u8 state;
> -};
> -
> /*
> * Hybrid PV queued/unfair lock
> *
> @@ -170,7 +164,7 @@ static __always_inline int trylock_clear_pending(struct qspinlock *lock)
> */
> struct pv_hash_entry {
> struct qspinlock *lock;
> - struct pv_node *node;
> + struct qnode *node;
> };
>
> #define PV_HE_PER_LINE (SMP_CACHE_BYTES / sizeof(struct pv_hash_entry))
> @@ -209,7 +203,7 @@ void __init __pv_init_lock_hash(void)
> offset < (1 << pv_lock_hash_bits); \
> offset++, he = &pv_lock_hash[(hash + offset) & ((1 << pv_lock_hash_bits) - 1)])
>
> -static struct qspinlock **pv_hash(struct qspinlock *lock, struct pv_node *node)
> +static struct qspinlock **pv_hash(struct qspinlock *lock, struct qnode *node)
> {
> unsigned long offset, hash = hash_ptr(lock, pv_lock_hash_bits);
> struct pv_hash_entry *he;
> @@ -236,11 +230,11 @@ static struct qspinlock **pv_hash(struct qspinlock *lock, struct pv_node *node)
> BUG();
> }
>
> -static struct pv_node *pv_unhash(struct qspinlock *lock)
> +static struct qnode *pv_unhash(struct qspinlock *lock)
> {
> unsigned long offset, hash = hash_ptr(lock, pv_lock_hash_bits);
> struct pv_hash_entry *he;
> - struct pv_node *node;
> + struct qnode *node;
>
> for_each_hash_entry(he, offset, hash) {
> if (READ_ONCE(he->lock) == lock) {
> @@ -264,7 +258,7 @@ static struct pv_node *pv_unhash(struct qspinlock *lock)
> * in a running state.
> */
> static inline bool
> -pv_wait_early(struct pv_node *prev, int loop)
> +pv_wait_early(struct qnode *prev, int loop)
> {
> if ((loop & PV_PREV_CHECK_MASK) != 0)
> return false;
> @@ -277,9 +271,9 @@ pv_wait_early(struct pv_node *prev, int loop)
> */
> static void pv_init_node(struct mcs_spinlock *node)
> {
> - struct pv_node *pn = (struct pv_node *)node;
> + struct qnode *pn = (struct qnode *)node;
>
> - BUILD_BUG_ON(sizeof(struct pv_node) > sizeof(struct qnode));
> + BUILD_BUG_ON(sizeof(struct qnode) > sizeof(struct qnode));
This line can actually be removed ;-)
Other part looks good to me.
Acked-by: Boqun Feng <boqun.feng@gmail.com>
Regards,
Boqun
>
> pn->cpu = smp_processor_id();
> pn->state = vcpu_running;
> @@ -292,8 +286,8 @@ static void pv_init_node(struct mcs_spinlock *node)
> */
> static void pv_wait_node(struct mcs_spinlock *node, struct mcs_spinlock *prev)
> {
> - struct pv_node *pn = (struct pv_node *)node;
> - struct pv_node *pp = (struct pv_node *)prev;
> + struct qnode *pn = (struct qnode *)node;
> + struct qnode *pp = (struct qnode *)prev;
> int loop;
> bool wait_early;
>
> @@ -359,7 +353,7 @@ static void pv_wait_node(struct mcs_spinlock *node, struct mcs_spinlock *prev)
> */
> static void pv_kick_node(struct qspinlock *lock, struct mcs_spinlock *node)
> {
> - struct pv_node *pn = (struct pv_node *)node;
> + struct qnode *pn = (struct qnode *)node;
>
> /*
> * If the vCPU is indeed halted, advance its state to match that of
> @@ -402,7 +396,7 @@ static void pv_kick_node(struct qspinlock *lock, struct mcs_spinlock *node)
> static u32
> pv_wait_head_or_lock(struct qspinlock *lock, struct mcs_spinlock *node)
> {
> - struct pv_node *pn = (struct pv_node *)node;
> + struct qnode *pn = (struct qnode *)node;
> struct qspinlock **lp = NULL;
> int waitcnt = 0;
> int loop;
> @@ -492,7 +486,7 @@ pv_wait_head_or_lock(struct qspinlock *lock, struct mcs_spinlock *node)
> __visible void
> __pv_queued_spin_unlock_slowpath(struct qspinlock *lock, u8 locked)
> {
> - struct pv_node *node;
> + struct qnode *node;
>
> if (unlikely(locked != _Q_SLOW_VAL)) {
> WARN(!debug_locks_silent,
> @@ -517,14 +511,14 @@ __pv_queued_spin_unlock_slowpath(struct qspinlock *lock, u8 locked)
> node = pv_unhash(lock);
>
> /*
> - * Now that we have a reference to the (likely) blocked pv_node,
> + * Now that we have a reference to the (likely) blocked qnode,
> * release the lock.
> */
> smp_store_release(&lock->locked, 0);
>
> /*
> * At this point the memory pointed at by lock can be freed/reused,
> - * however we can still use the pv_node to kick the CPU.
> + * however we can still use the qnode to kick the CPU.
> * The other vCPU may not really be halted, but kicking an active
> * vCPU is harmless other than the additional latency in completing
> * the unlock.
> --
> 2.35.1
>
next prev parent reply other threads:[~2022-07-06 23:24 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-04 14:38 [PATCH 00/13] locking/qspinlock: simplify code generation Nicholas Piggin
2022-07-04 14:38 ` [PATCH 01/13] locking/qspinlock: remove pv_node abstraction Nicholas Piggin
2022-07-06 23:23 ` Boqun Feng [this message]
2022-07-04 14:38 ` [PATCH 02/13] locking/qspinlock: inline mcs_spinlock functions into qspinlock Nicholas Piggin
2022-07-05 16:57 ` Peter Zijlstra
2022-07-12 0:06 ` Nicholas Piggin
2022-07-04 14:38 ` [PATCH 03/13] locking/qspinlock: split common mcs queueing code into its own function Nicholas Piggin
2022-07-05 17:01 ` Peter Zijlstra
2022-07-12 0:10 ` Nicholas Piggin
2022-07-04 14:38 ` [PATCH 04/13] locking/qspinlock: move pv lock word helpers into qspinlock.c Nicholas Piggin
2022-07-05 19:34 ` Waiman Long
2022-07-12 0:11 ` Nicholas Piggin
2022-07-04 14:38 ` [PATCH 05/13] locking/qspinlock: be less clever with the preprocessor Nicholas Piggin
2022-07-05 17:08 ` Peter Zijlstra
2022-07-12 0:29 ` Nicholas Piggin
2022-07-05 20:02 ` Waiman Long
2022-07-12 0:33 ` Nicholas Piggin
2022-07-04 14:38 ` [PATCH 06/13] locking/qspinlock: merge qspinlock_paravirt.h into qspinlock.c Nicholas Piggin
2022-07-05 17:20 ` Peter Zijlstra
2022-07-05 17:36 ` Peter Zijlstra
2022-07-12 0:46 ` Nicholas Piggin
2022-07-06 13:35 ` Waiman Long
2022-07-06 14:16 ` Peter Zijlstra
2022-07-04 14:38 ` [PATCH 07/13] locking/qspinlock: remove arch qspinlock_paravirt.h includes Nicholas Piggin
2022-07-04 14:38 ` [PATCH 08/13] locking/qspinlock: stop renaming queued_spin_lock_slowpath to native_queued_spin_lock_slowpath Nicholas Piggin
2022-07-05 17:28 ` Peter Zijlstra
2022-07-04 14:38 ` [PATCH 09/13] locking/qspinlock: rename __pv_init_lock_hash to pv_spinlocks_init Nicholas Piggin
2022-07-04 14:38 ` [PATCH 10/13] locking/qspinlock: paravirt use simple trylock in case idx overflows Nicholas Piggin
2022-07-04 14:38 ` [PATCH 11/13] locking/qspinlock: Use queued_spin_trylock in pv_hybrid_queued_unfair_trylock Nicholas Piggin
2022-07-05 17:31 ` Peter Zijlstra
2022-07-05 20:15 ` Waiman Long
2022-07-12 0:48 ` Nicholas Piggin
2022-07-04 14:38 ` [PATCH 12/13] locking/qspinlock: separate pv_wait_node from the non-paravirt path Nicholas Piggin
2022-07-05 17:34 ` Peter Zijlstra
2022-07-12 0:50 ` Nicholas Piggin
2022-07-04 14:38 ` [PATCH 13/13] locking/qspinlock: simplify pv_wait_head_or_lock calling scheme Nicholas Piggin
2022-07-05 17:59 ` [PATCH 00/13] locking/qspinlock: simplify code generation Peter Zijlstra
2022-07-12 0:56 ` Nicholas Piggin
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=YsYZeMJHsHwrOAe7@boqun-archlinux \
--to=boqun.feng@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=longman@redhat.com \
--cc=mingo@redhat.com \
--cc=npiggin@gmail.com \
--cc=peterz@infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.