From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Waiman Long <Waiman.Long@hp.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
Arnd Bergmann <arnd@arndb.de>,
linux-arch@vger.kernel.org, x86@kernel.org,
linux-kernel@vger.kernel.org,
Peter Zijlstra <peterz@infradead.org>,
Steven Rostedt <rostedt@goodmis.org>,
Andrew Morton <akpm@linux-foundation.org>,
Michel Lespinasse <walken@google.com>,
Andi Kleen <andi@firstfloor.org>, Rik van Riel <riel@redhat.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
George Spelvin <linux@horizon.com>,
Tim Chen <tim.c.chen@linux.intel.com>,
"Aswin Chandramouleeswaran\"" <aswin@hp.com>,
Scott J Norton <scott.norton@hp.com>
Subject: Re: [PATCH v7 3/4] qrwlock: Use the mcs_spinlock helper functions for MCS queuing
Date: Tue, 17 Dec 2013 11:23:59 -0800 [thread overview]
Message-ID: <20131217192359.GC15969@linux.vnet.ibm.com> (raw)
In-Reply-To: <1385147087-26588-4-git-send-email-Waiman.Long@hp.com>
On Fri, Nov 22, 2013 at 02:04:46PM -0500, Waiman Long wrote:
> There is a pending MCS lock patch series that adds generic MCS lock
> helper functions to do MCS-style locking. This patch will enable
> the queue rwlock to use that generic MCS lock/unlock primitives for
> internal queuing. This patch should only be merged after the merging
> of that generic MCS locking patch.
>
> Signed-off-by: Waiman Long <Waiman.Long@hp.com>
Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> ---
> include/asm-generic/qrwlock.h | 7 +--
> kernel/locking/qrwlock.c | 83 +++-------------------------------------
> 2 files changed, 9 insertions(+), 81 deletions(-)
>
> diff --git a/include/asm-generic/qrwlock.h b/include/asm-generic/qrwlock.h
> index 9d085cb..335473a 100644
> --- a/include/asm-generic/qrwlock.h
> +++ b/include/asm-generic/qrwlock.h
> @@ -37,10 +37,7 @@
> * the writer field. The least significant 8 bits is the writer field
> * whereas the remaining 24 bits is the reader count.
> */
> -struct qrwnode {
> - struct qrwnode *next;
> - bool wait; /* Waiting flag */
> -};
> +struct mcs_spinlock;
>
> typedef struct qrwlock {
> union qrwcnts {
> @@ -55,7 +52,7 @@ typedef struct qrwlock {
> };
> u32 rw; /* Reader/writer number pair */
> } cnts;
> - struct qrwnode *waitq; /* Tail of waiting queue */
> + struct mcs_spinlock *waitq; /* Tail of waiting queue */
> } arch_rwlock_t;
>
> /*
> diff --git a/kernel/locking/qrwlock.c b/kernel/locking/qrwlock.c
> index ea5553d..b3e5c2b 100644
> --- a/kernel/locking/qrwlock.c
> +++ b/kernel/locking/qrwlock.c
> @@ -20,6 +20,7 @@
> #include <linux/cpumask.h>
> #include <linux/percpu.h>
> #include <linux/hardirq.h>
> +#include <linux/mcs_spinlock.h>
> #include <asm-generic/qrwlock.h>
>
> /*
> @@ -55,76 +56,6 @@
> # endif
> #endif
>
> -#ifndef smp_mb__store_release
> -# ifdef CONFIG_X86
> -# define smp_mb__store_release() barrier()
> -# else
> -# define smp_mb__store_release() smp_mb()
> -# endif
> -#endif
> -
> -/**
> - * wait_in_queue - Add to queue and wait until it is at the head
> - * @lock: Pointer to queue rwlock structure
> - * @node: Node pointer to be added to the queue
> - */
> -static __always_inline void
> -wait_in_queue(struct qrwlock *lock, struct qrwnode *node)
> -{
> - struct qrwnode *prev;
> -
> - node->next = NULL;
> - node->wait = true;
> - prev = xchg(&lock->waitq, node);
> - if (prev) {
> - prev->next = node;
> - /*
> - * Wait until the waiting flag is off
> - */
> - while (ACCESS_ONCE(node->wait))
> - arch_mutex_cpu_relax();
> - smp_mb__load_acquire();
> - }
> -}
> -
> -/**
> - * signal_next - Signal the next one in queue to be at the head
> - * @lock: Pointer to queue rwlock structure
> - * @node: Node pointer to the current head of queue
> - */
> -static __always_inline void
> -signal_next(struct qrwlock *lock, struct qrwnode *node)
> -{
> - struct qrwnode *next;
> -
> - /*
> - * Try to notify the next node first without disturbing the cacheline
> - * of the lock. If that fails, check to see if it is the last node
> - * and so should clear the wait queue.
> - */
> - next = ACCESS_ONCE(node->next);
> - if (likely(next))
> - goto notify_next;
> -
> - /*
> - * Clear the wait queue if it is the last node
> - */
> - if ((ACCESS_ONCE(lock->waitq) == node) &&
> - (cmpxchg(&lock->waitq, node, NULL) == node))
> - return;
> - /*
> - * Wait until the next one in queue set up the next field
> - */
> - while (likely(!(next = ACCESS_ONCE(node->next))))
> - arch_mutex_cpu_relax();
> - /*
> - * The next one in queue is now at the head
> - */
> -notify_next:
> - smp_mb__store_release();
> - ACCESS_ONCE(next->wait) = false;
> -}
> -
> /**
> * rspin_until_writer_unlock - inc reader count & spin until writer is gone
> * @lock: Pointer to queue rwlock structure
> @@ -148,7 +79,7 @@ rspin_until_writer_unlock(struct qrwlock *lock, union qrwcnts cnts)
> */
> void queue_read_lock_slowpath(struct qrwlock *lock)
> {
> - struct qrwnode node;
> + struct mcs_spinlock node;
> union qrwcnts cnts;
>
> /*
> @@ -168,7 +99,7 @@ void queue_read_lock_slowpath(struct qrwlock *lock)
> /*
> * Put the reader into the wait queue
> */
> - wait_in_queue(lock, &node);
> + mcs_spin_lock(&lock->waitq, &node);
>
> /*
> * At the head of the wait queue now, wait until the writer state
> @@ -183,7 +114,7 @@ void queue_read_lock_slowpath(struct qrwlock *lock)
> * Need to have a barrier with read-acquire semantics
> */
> smp_mb__load_acquire();
> - signal_next(lock, &node);
> + mcs_spin_unlock(&lock->waitq, &node);
> }
> EXPORT_SYMBOL(queue_read_lock_slowpath);
>
> @@ -247,12 +178,12 @@ static noinline int queue_write_3step_lock(struct qrwlock *lock)
> */
> void queue_write_lock_slowpath(struct qrwlock *lock)
> {
> - struct qrwnode node;
> + struct mcs_spinlock node;
>
> /*
> * Put the writer into the wait queue
> */
> - wait_in_queue(lock, &node);
> + mcs_spin_lock(&lock->waitq, &node);
>
> /*
> * At the head of the wait queue now, call queue_write_3step_lock()
> @@ -260,6 +191,6 @@ void queue_write_lock_slowpath(struct qrwlock *lock)
> */
> while (!queue_write_3step_lock(lock))
> arch_mutex_cpu_relax();
> - signal_next(lock, &node);
> + mcs_spin_unlock(&lock->waitq, &node);
> }
> EXPORT_SYMBOL(queue_write_lock_slowpath);
> --
> 1.7.1
>
next prev parent reply other threads:[~2013-12-17 19:24 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-22 19:04 [PATCH v7 0/4] qrwlock: Introducing a queue read/write lock implementation Waiman Long
2013-11-22 19:04 ` [PATCH v7 1/4] qrwlock: A " Waiman Long
2013-11-22 19:14 ` Linus Torvalds
2013-11-22 20:35 ` Waiman Long
2013-11-22 21:14 ` Linus Torvalds
2013-12-17 19:21 ` Paul E. McKenney
2013-12-17 19:27 ` Linus Torvalds
2013-12-17 19:49 ` Paul E. McKenney
2013-12-18 18:51 ` Waiman Long
2013-12-18 19:38 ` Andi Kleen
2013-12-18 19:38 ` Andi Kleen
2013-12-18 19:42 ` Andi Kleen
2013-12-18 19:42 ` Andi Kleen
2013-12-18 19:46 ` Peter Zijlstra
2013-12-18 20:16 ` Andi Kleen
2013-12-18 20:16 ` Andi Kleen
2013-12-18 18:45 ` Waiman Long
2013-12-18 18:45 ` Waiman Long
2013-12-18 18:59 ` Paul E. McKenney
2013-12-18 19:16 ` Peter Zijlstra
2013-11-22 19:04 ` [PATCH v7 2/4] qrwlock x86: Enable x86 to use queue read/write lock Waiman Long
2013-12-17 19:22 ` Paul E. McKenney
2013-11-22 19:04 ` [PATCH v7 3/4] qrwlock: Use the mcs_spinlock helper functions for MCS queuing Waiman Long
2013-12-17 19:23 ` Paul E. McKenney [this message]
2013-11-22 19:04 ` [PATCH v7 4/4] qrwlock: Use smp_store_release() in write_unlock() Waiman Long
2013-12-17 19:24 ` Paul E. McKenney
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=20131217192359.GC15969@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=Waiman.Long@hp.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=arnd@arndb.de \
--cc=aswin@hp.com \
--cc=hpa@zytor.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@horizon.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=raghavendra.kt@linux.vnet.ibm.com \
--cc=riel@redhat.com \
--cc=rostedt@goodmis.org \
--cc=scott.norton@hp.com \
--cc=tglx@linutronix.de \
--cc=tim.c.chen@linux.intel.com \
--cc=torvalds@linux-foundation.org \
--cc=walken@google.com \
--cc=x86@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.