From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Ingo Molnar <mingo@elte.hu>,
Andrew Morton <akpm@linux-foundation.org>,
Thomas Gleixner <tglx@linutronix.de>,
Will Deacon <will.deacon@arm.com>,
linux-kernel@vger.kernel.org, linux-mm <linux-mm@kvack.org>,
linux-arch@vger.kernel.org,
Linus Torvalds <torvalds@linux-foundation.org>,
Waiman Long <waiman.long@hp.com>,
Andrea Arcangeli <aarcange@redhat.com>,
Alex Shi <alex.shi@linaro.org>, Andi Kleen <andi@firstfloor.org>,
Michel Lespinasse <walken@google.com>,
Davidlohr Bueso <davidlohr.bueso@hp.com>,
Matthew R Wilcox <matthew.r.wilcox@intel.com>,
Dave Hansen <dave.hansen@intel.com>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Rik van Riel <riel@redhat.com>,
Peter Hurley <peter@hurleysoftware.com>,
Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
George
Subject: Re: [PATCH v7 5/6] MCS Lock: allow architectures to hook in to contended paths
Date: Sun, 19 Jan 2014 18:34:48 -0800 [thread overview]
Message-ID: <20140120023448.GM10038@linux.vnet.ibm.com> (raw)
In-Reply-To: <1389917311.3138.15.camel@schen9-DESK>
On Thu, Jan 16, 2014 at 04:08:31PM -0800, Tim Chen wrote:
> When contended, architectures may be able to reduce the polling overhead
> in ways which aren't expressible using a simple relax() primitive.
>
> This patch allows architectures to hook into the mcs_{lock,unlock}
> functions for the contended cases only.
>
> From: Will Deacon <will.deacon@arm.com>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> ---
> kernel/locking/mcs_spinlock.c | 47 +++++++++++++++++++++++++------------------
> 1 file changed, 27 insertions(+), 20 deletions(-)
>
> diff --git a/kernel/locking/mcs_spinlock.c b/kernel/locking/mcs_spinlock.c
> index 6cdc730..66d8883 100644
> --- a/kernel/locking/mcs_spinlock.c
> +++ b/kernel/locking/mcs_spinlock.c
> @@ -7,19 +7,34 @@
> * It avoids expensive cache bouncings that common test-and-set spin-lock
> * implementations incur.
> */
> -/*
> - * asm/processor.h may define arch_mutex_cpu_relax().
> - * If it is not defined, cpu_relax() will be used.
> - */
> +
> #include <asm/barrier.h>
> #include <asm/cmpxchg.h>
> #include <asm/processor.h>
> #include <linux/compiler.h>
> #include <linux/mcs_spinlock.h>
> +#include <linux/mutex.h>
> #include <linux/export.h>
>
> -#ifndef arch_mutex_cpu_relax
> -# define arch_mutex_cpu_relax() cpu_relax()
> +#ifndef arch_mcs_spin_lock_contended
> +/*
> + * Using smp_load_acquire() provides a memory barrier that ensures
> + * subsequent operations happen after the lock is acquired.
> + */
> +#define arch_mcs_spin_lock_contended(l) \
> + while (!(smp_load_acquire(l))) { \
> + arch_mutex_cpu_relax(); \
> + }
> +#endif
> +
> +#ifndef arch_mcs_spin_unlock_contended
> +/*
> + * smp_store_release() provides a memory barrier to ensure all
> + * operations in the critical section has been completed before
> + * unlocking.
> + */
> +#define arch_mcs_spin_unlock_contended(l) \
> + smp_store_release((l), 1)
> #endif
>
> /*
> @@ -43,13 +58,9 @@ void mcs_spin_lock(struct mcs_spinlock **lock, struct mcs_spinlock *node)
> return;
> }
> ACCESS_ONCE(prev->next) = node;
> - /*
> - * Wait until the lock holder passes the lock down.
> - * Using smp_load_acquire() provides a memory barrier that
> - * ensures subsequent operations happen after the lock is acquired.
> - */
> - while (!(smp_load_acquire(&node->locked)))
> - arch_mutex_cpu_relax();
> +
> + /* Wait until the lock holder passes the lock down. */
> + arch_mcs_spin_lock_contended(&node->locked);
> }
> EXPORT_SYMBOL_GPL(mcs_spin_lock);
>
> @@ -71,12 +82,8 @@ void mcs_spin_unlock(struct mcs_spinlock **lock, struct mcs_spinlock *node)
> while (!(next = ACCESS_ONCE(node->next)))
> arch_mutex_cpu_relax();
> }
> - /*
> - * Pass lock to next waiter.
> - * smp_store_release() provides a memory barrier to ensure
> - * all operations in the critical section has been completed
> - * before unlocking.
> - */
> - smp_store_release(&next->locked, 1);
> +
> + /* Pass lock to next waiter. */
> + arch_mcs_spin_unlock_contended(&next->locked);
> }
> EXPORT_SYMBOL_GPL(mcs_spin_unlock);
> --
> 1.7.11.7
>
>
>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Ingo Molnar <mingo@elte.hu>,
Andrew Morton <akpm@linux-foundation.org>,
Thomas Gleixner <tglx@linutronix.de>,
Will Deacon <will.deacon@arm.com>,
linux-kernel@vger.kernel.org, linux-mm <linux-mm@kvack.org>,
linux-arch@vger.kernel.org,
Linus Torvalds <torvalds@linux-foundation.org>,
Waiman Long <waiman.long@hp.com>,
Andrea Arcangeli <aarcange@redhat.com>,
Alex Shi <alex.shi@linaro.org>, Andi Kleen <andi@firstfloor.org>,
Michel Lespinasse <walken@google.com>,
Davidlohr Bueso <davidlohr.bueso@hp.com>,
Matthew R Wilcox <matthew.r.wilcox@intel.com>,
Dave Hansen <dave.hansen@intel.com>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Rik van Riel <riel@redhat.com>,
Peter Hurley <peter@hurleysoftware.com>,
Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
George Spelvin <linux@horizon.com>,
"H. Peter Anvin" <hpa@zytor.com>, Arnd Bergmann <arnd@arndb.de>,
Aswin Chandramouleeswaran <aswin@hp.com>,
Scott J Norton <scott.norton@hp.com>,
"Figo.zhang" <figo1802@gmail.com>
Subject: Re: [PATCH v7 5/6] MCS Lock: allow architectures to hook in to contended paths
Date: Sun, 19 Jan 2014 18:34:48 -0800 [thread overview]
Message-ID: <20140120023448.GM10038@linux.vnet.ibm.com> (raw)
Message-ID: <20140120023448.jvKVfx1JL0DcMsuYVM1l80fRRBDscaD1PcUGgKl26Ng@z> (raw)
In-Reply-To: <1389917311.3138.15.camel@schen9-DESK>
On Thu, Jan 16, 2014 at 04:08:31PM -0800, Tim Chen wrote:
> When contended, architectures may be able to reduce the polling overhead
> in ways which aren't expressible using a simple relax() primitive.
>
> This patch allows architectures to hook into the mcs_{lock,unlock}
> functions for the contended cases only.
>
> From: Will Deacon <will.deacon@arm.com>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> ---
> kernel/locking/mcs_spinlock.c | 47 +++++++++++++++++++++++++------------------
> 1 file changed, 27 insertions(+), 20 deletions(-)
>
> diff --git a/kernel/locking/mcs_spinlock.c b/kernel/locking/mcs_spinlock.c
> index 6cdc730..66d8883 100644
> --- a/kernel/locking/mcs_spinlock.c
> +++ b/kernel/locking/mcs_spinlock.c
> @@ -7,19 +7,34 @@
> * It avoids expensive cache bouncings that common test-and-set spin-lock
> * implementations incur.
> */
> -/*
> - * asm/processor.h may define arch_mutex_cpu_relax().
> - * If it is not defined, cpu_relax() will be used.
> - */
> +
> #include <asm/barrier.h>
> #include <asm/cmpxchg.h>
> #include <asm/processor.h>
> #include <linux/compiler.h>
> #include <linux/mcs_spinlock.h>
> +#include <linux/mutex.h>
> #include <linux/export.h>
>
> -#ifndef arch_mutex_cpu_relax
> -# define arch_mutex_cpu_relax() cpu_relax()
> +#ifndef arch_mcs_spin_lock_contended
> +/*
> + * Using smp_load_acquire() provides a memory barrier that ensures
> + * subsequent operations happen after the lock is acquired.
> + */
> +#define arch_mcs_spin_lock_contended(l) \
> + while (!(smp_load_acquire(l))) { \
> + arch_mutex_cpu_relax(); \
> + }
> +#endif
> +
> +#ifndef arch_mcs_spin_unlock_contended
> +/*
> + * smp_store_release() provides a memory barrier to ensure all
> + * operations in the critical section has been completed before
> + * unlocking.
> + */
> +#define arch_mcs_spin_unlock_contended(l) \
> + smp_store_release((l), 1)
> #endif
>
> /*
> @@ -43,13 +58,9 @@ void mcs_spin_lock(struct mcs_spinlock **lock, struct mcs_spinlock *node)
> return;
> }
> ACCESS_ONCE(prev->next) = node;
> - /*
> - * Wait until the lock holder passes the lock down.
> - * Using smp_load_acquire() provides a memory barrier that
> - * ensures subsequent operations happen after the lock is acquired.
> - */
> - while (!(smp_load_acquire(&node->locked)))
> - arch_mutex_cpu_relax();
> +
> + /* Wait until the lock holder passes the lock down. */
> + arch_mcs_spin_lock_contended(&node->locked);
> }
> EXPORT_SYMBOL_GPL(mcs_spin_lock);
>
> @@ -71,12 +82,8 @@ void mcs_spin_unlock(struct mcs_spinlock **lock, struct mcs_spinlock *node)
> while (!(next = ACCESS_ONCE(node->next)))
> arch_mutex_cpu_relax();
> }
> - /*
> - * Pass lock to next waiter.
> - * smp_store_release() provides a memory barrier to ensure
> - * all operations in the critical section has been completed
> - * before unlocking.
> - */
> - smp_store_release(&next->locked, 1);
> +
> + /* Pass lock to next waiter. */
> + arch_mcs_spin_unlock_contended(&next->locked);
> }
> EXPORT_SYMBOL_GPL(mcs_spin_unlock);
> --
> 1.7.11.7
>
>
>
WARNING: multiple messages have this Message-ID (diff)
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Ingo Molnar <mingo@elte.hu>,
Andrew Morton <akpm@linux-foundation.org>,
Thomas Gleixner <tglx@linutronix.de>,
Will Deacon <will.deacon@arm.com>,
linux-kernel@vger.kernel.org, linux-mm <linux-mm@kvack.org>,
linux-arch@vger.kernel.org,
Linus Torvalds <torvalds@linux-foundation.org>,
Waiman Long <waiman.long@hp.com>,
Andrea Arcangeli <aarcange@redhat.com>,
Alex Shi <alex.shi@linaro.org>, Andi Kleen <andi@firstfloor.org>,
Michel Lespinasse <walken@google.com>,
Davidlohr Bueso <davidlohr.bueso@hp.com>,
Matthew R Wilcox <matthew.r.wilcox@intel.com>,
Dave Hansen <dave.hansen@intel.com>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Rik van Riel <riel@redhat.com>,
Peter Hurley <peter@hurleysoftware.com>,
Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
George Spelvin <linux@horizon.com>,
"H. Peter Anvin" <hpa@zytor.com>, Arnd Bergmann <arnd@arndb.de>,
Aswin Chandramouleeswaran <aswin@hp.com>,
Scott J Norton <scott.norton@hp.com>,
"Figo.zhang" <figo1802@gmail.com>
Subject: Re: [PATCH v7 5/6] MCS Lock: allow architectures to hook in to contended paths
Date: Sun, 19 Jan 2014 18:34:48 -0800 [thread overview]
Message-ID: <20140120023448.GM10038@linux.vnet.ibm.com> (raw)
In-Reply-To: <1389917311.3138.15.camel@schen9-DESK>
On Thu, Jan 16, 2014 at 04:08:31PM -0800, Tim Chen wrote:
> When contended, architectures may be able to reduce the polling overhead
> in ways which aren't expressible using a simple relax() primitive.
>
> This patch allows architectures to hook into the mcs_{lock,unlock}
> functions for the contended cases only.
>
> From: Will Deacon <will.deacon@arm.com>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> ---
> kernel/locking/mcs_spinlock.c | 47 +++++++++++++++++++++++++------------------
> 1 file changed, 27 insertions(+), 20 deletions(-)
>
> diff --git a/kernel/locking/mcs_spinlock.c b/kernel/locking/mcs_spinlock.c
> index 6cdc730..66d8883 100644
> --- a/kernel/locking/mcs_spinlock.c
> +++ b/kernel/locking/mcs_spinlock.c
> @@ -7,19 +7,34 @@
> * It avoids expensive cache bouncings that common test-and-set spin-lock
> * implementations incur.
> */
> -/*
> - * asm/processor.h may define arch_mutex_cpu_relax().
> - * If it is not defined, cpu_relax() will be used.
> - */
> +
> #include <asm/barrier.h>
> #include <asm/cmpxchg.h>
> #include <asm/processor.h>
> #include <linux/compiler.h>
> #include <linux/mcs_spinlock.h>
> +#include <linux/mutex.h>
> #include <linux/export.h>
>
> -#ifndef arch_mutex_cpu_relax
> -# define arch_mutex_cpu_relax() cpu_relax()
> +#ifndef arch_mcs_spin_lock_contended
> +/*
> + * Using smp_load_acquire() provides a memory barrier that ensures
> + * subsequent operations happen after the lock is acquired.
> + */
> +#define arch_mcs_spin_lock_contended(l) \
> + while (!(smp_load_acquire(l))) { \
> + arch_mutex_cpu_relax(); \
> + }
> +#endif
> +
> +#ifndef arch_mcs_spin_unlock_contended
> +/*
> + * smp_store_release() provides a memory barrier to ensure all
> + * operations in the critical section has been completed before
> + * unlocking.
> + */
> +#define arch_mcs_spin_unlock_contended(l) \
> + smp_store_release((l), 1)
> #endif
>
> /*
> @@ -43,13 +58,9 @@ void mcs_spin_lock(struct mcs_spinlock **lock, struct mcs_spinlock *node)
> return;
> }
> ACCESS_ONCE(prev->next) = node;
> - /*
> - * Wait until the lock holder passes the lock down.
> - * Using smp_load_acquire() provides a memory barrier that
> - * ensures subsequent operations happen after the lock is acquired.
> - */
> - while (!(smp_load_acquire(&node->locked)))
> - arch_mutex_cpu_relax();
> +
> + /* Wait until the lock holder passes the lock down. */
> + arch_mcs_spin_lock_contended(&node->locked);
> }
> EXPORT_SYMBOL_GPL(mcs_spin_lock);
>
> @@ -71,12 +82,8 @@ void mcs_spin_unlock(struct mcs_spinlock **lock, struct mcs_spinlock *node)
> while (!(next = ACCESS_ONCE(node->next)))
> arch_mutex_cpu_relax();
> }
> - /*
> - * Pass lock to next waiter.
> - * smp_store_release() provides a memory barrier to ensure
> - * all operations in the critical section has been completed
> - * before unlocking.
> - */
> - smp_store_release(&next->locked, 1);
> +
> + /* Pass lock to next waiter. */
> + arch_mcs_spin_unlock_contended(&next->locked);
> }
> EXPORT_SYMBOL_GPL(mcs_spin_unlock);
> --
> 1.7.11.7
>
>
>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2014-01-20 2:34 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <cover.1389890175.git.tim.c.chen@linux.intel.com>
2014-01-17 0:08 ` [PATCH v7 0/6] MCS Lock: MCS lock code cleanup and optimizations Tim Chen
2014-01-17 0:08 ` Tim Chen
2014-01-20 13:58 ` Peter Zijlstra
2014-01-20 13:58 ` Peter Zijlstra
2014-01-20 13:58 ` Peter Zijlstra
2014-01-20 14:22 ` Ingo Molnar
2014-01-20 14:22 ` Ingo Molnar
2014-01-17 0:08 ` [PATCH v7 1/6] MCS Lock: Restructure the MCS lock defines and locking code into its own file Tim Chen
2014-01-17 0:08 ` Tim Chen
2014-01-20 2:28 ` Paul E. McKenney
2014-01-20 2:28 ` Paul E. McKenney
2014-01-20 2:28 ` Paul E. McKenney
2014-01-20 2:28 ` Paul E. McKenney
2014-01-20 12:07 ` Peter Zijlstra
2014-01-20 12:07 ` Peter Zijlstra
2014-01-20 12:07 ` Peter Zijlstra
2014-01-20 19:31 ` Tim Chen
2014-01-20 19:31 ` Tim Chen
2014-01-20 19:31 ` Tim Chen
2014-01-17 0:08 ` [PATCH v7 2/6] MCS Lock: optimizations and extra comments Tim Chen
2014-01-17 0:08 ` Tim Chen
2014-01-20 2:29 ` Paul E. McKenney
2014-01-20 2:29 ` Paul E. McKenney
2014-01-20 2:29 ` Paul E. McKenney
2014-01-20 13:58 ` Peter Zijlstra
2014-01-20 13:58 ` Peter Zijlstra
2014-01-20 13:58 ` Peter Zijlstra
2014-01-20 19:11 ` Tim Chen
2014-01-20 19:11 ` Tim Chen
2014-01-20 19:11 ` Tim Chen
2014-01-17 0:08 ` [PATCH v7 3/6] MCS Lock: Move mcs_lock/unlock function into its own file Tim Chen
2014-01-17 0:08 ` Tim Chen
2014-01-20 2:32 ` Paul E. McKenney
2014-01-20 2:32 ` Paul E. McKenney
2014-01-20 2:32 ` Paul E. McKenney
2014-01-20 12:15 ` Peter Zijlstra
2014-01-20 12:15 ` Peter Zijlstra
2014-01-20 12:15 ` Peter Zijlstra
2014-01-17 0:08 ` [PATCH v7 4/6] MCS Lock: Barrier corrections Tim Chen
2014-01-17 0:08 ` Tim Chen
2014-01-20 2:33 ` Paul E. McKenney
2014-01-20 2:33 ` Paul E. McKenney
2014-01-20 2:33 ` Paul E. McKenney
2014-01-20 7:09 ` Ingo Molnar
2014-01-20 7:09 ` Ingo Molnar
2014-01-17 0:08 ` [PATCH v7 5/6] MCS Lock: allow architectures to hook in to contended paths Tim Chen
2014-01-17 0:08 ` Tim Chen
2014-01-20 2:34 ` Paul E. McKenney [this message]
2014-01-20 2:34 ` Paul E. McKenney
2014-01-20 2:34 ` Paul E. McKenney
2014-01-20 12:19 ` Peter Zijlstra
2014-01-20 12:19 ` Peter Zijlstra
2014-01-20 12:19 ` Peter Zijlstra
2014-01-20 14:11 ` Will Deacon
2014-01-20 14:11 ` Will Deacon
2014-01-20 16:43 ` Tim Chen
2014-01-20 16:43 ` Tim Chen
2014-01-17 0:08 ` [PATCH v7 6/6] MCS Lock: add Kconfig entries to allow arch-specific hooks Tim Chen
2014-01-17 0:08 ` Tim Chen
2014-01-20 2:35 ` Paul E. McKenney
2014-01-20 2:35 ` Paul E. McKenney
2014-01-20 2:35 ` Paul E. McKenney
2014-01-20 12:30 ` Peter Zijlstra
2014-01-20 12:30 ` Peter Zijlstra
2014-01-20 12:30 ` Peter Zijlstra
2014-01-20 12:35 ` Geert Uytterhoeven
2014-01-20 12:35 ` Geert Uytterhoeven
2014-01-20 12:36 ` Peter Zijlstra
2014-01-20 12:36 ` Peter Zijlstra
2014-01-20 12:38 ` Ingo Molnar
2014-01-20 12:38 ` Ingo Molnar
2014-01-20 13:17 ` Peter Zijlstra
2014-01-20 13:17 ` Peter Zijlstra
2014-01-20 13:17 ` Peter Zijlstra
2014-01-20 23:31 ` Tim Chen
2014-01-20 23:31 ` Tim Chen
2014-01-20 23:31 ` Tim Chen
2014-01-21 9:47 ` Peter Zijlstra
2014-01-21 9:47 ` Peter Zijlstra
2014-01-21 9:47 ` Peter Zijlstra
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=20140120023448.GM10038@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=a.p.zijlstra@chello.nl \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=alex.shi@linaro.org \
--cc=andi@firstfloor.org \
--cc=dave.hansen@intel.com \
--cc=davidlohr.bueso@hp.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=matthew.r.wilcox@intel.com \
--cc=mingo@elte.hu \
--cc=peter@hurleysoftware.com \
--cc=raghavendra.kt@linux.vnet.ibm.com \
--cc=riel@redhat.com \
--cc=tglx@linutronix.de \
--cc=tim.c.chen@linux.intel.com \
--cc=torvalds@linux-foundation.org \
--cc=waiman.long@hp.com \
--cc=walken@google.com \
--cc=will.deacon@arm.com \
/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.