virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
From: Waiman Long <waiman.long@hp.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-arch@vger.kernel.org, Rik van Riel <riel@redhat.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Gleb Natapov <gleb@redhat.com>,
	kvm@vger.kernel.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Scott J Norton <scott.norton@hp.com>,
	x86@kernel.org, Paolo Bonzini <paolo.bonzini@gmail.com>,
	linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	Ingo Molnar <mingo@redhat.com>, Chegu Vinod <chegu_vinod@hp.com>,
	David Vrabel <david.vrabel@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	xen-devel@lists.xenproject.org,
	Thomas Gleixner <tglx@linutronix.de>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Oleg Nesterov <oleg@redhat.com>
Subject: Re: [PATCH v9 05/19] qspinlock: Optimize for smaller NR_CPUS
Date: Wed, 23 Apr 2014 10:23:43 -0400	[thread overview]
Message-ID: <5357CCEF.2000606@hp.com> (raw)
In-Reply-To: <53519BBF.7060506@hp.com>

[-- Attachment #1: Type: text/plain, Size: 906 bytes --]

On 04/18/2014 05:40 PM, Waiman Long wrote:
> On 04/18/2014 03:05 PM, Peter Zijlstra wrote:
>> On Fri, Apr 18, 2014 at 01:52:50PM -0400, Waiman Long wrote:
>>> I am confused by your notation.
>> Nah, I think I was confused :-) Make the 1 _Q_LOCKED_VAL though, as
>> that's the proper constant to use.
>
> Everyone gets confused once in a while:-) I have plenty of that myself.
>
> I will change 1 to _Q_LOCKED_VAL as suggested.
>
> -Longman


The attached patch file contains the additional changes that I had made 
to qspinlock.c file so far. Please let me know if you or others have any 
additional feedbacks or changes that will need to go to the next version 
of the patch series.

I am going to take vacation starting from tomorrow and will be back on 
5/5 (Mon). So I will not be able to respond to emails within this period.

BTW, is there any chance that this patch can be merged to 3.16?

-Longman

[-- Attachment #2: qspinlock_extra_diff.patch --]
[-- Type: text/plain, Size: 4671 bytes --]

diff --git a/kernel/locking/qspinlock.c b/kernel/locking/qspinlock.c
index be2adca..2e184b8 100644
--- a/kernel/locking/qspinlock.c
+++ b/kernel/locking/qspinlock.c
@@ -25,10 +25,6 @@
 #include <asm/byteorder.h>
 #include <asm/qspinlock.h>
 
-#if !defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN)
-#error "Missing either LITTLE_ENDIAN or BIG_ENDIAN definition."
-#endif
-
 /*
  * The basic principle of a queue-based spinlock can best be understood
  * by studying a classic queue-based spinlock implementation called the
@@ -200,7 +196,7 @@ clear_pending_set_locked(struct qspinlock *lock, u32 val)
 {
 	struct __qspinlock *l = (void *)lock;
 
-	ACCESS_ONCE(l->locked_pending) = 1;
+	ACCESS_ONCE(l->locked_pending) = _Q_LOCKED_VAL;
 }
 
 /*
@@ -567,16 +563,16 @@ static __always_inline int get_qlock(struct qspinlock *lock)
 /**
  * trylock_pending - try to acquire queue spinlock using the pending bit
  * @lock : Pointer to queue spinlock structure
- * @pval : Pointer to value of the queue spinlock 32-bit word
+ * @val  : Current value of the queue spinlock 32-bit word
  * Return: 1 if lock acquired, 0 otherwise
  *
  * The pending bit won't be set as soon as one or more tasks queue up.
  * This function should only be called when lock stealing will not happen.
  * Otherwise, it has to be disabled.
  */
-static inline int trylock_pending(struct qspinlock *lock, u32 *pval)
+static inline int trylock_pending(struct qspinlock *lock, u32 val)
 {
-	u32 old, new, val = *pval;
+	u32 old, new;
 	int retry = 1;
 
 	/*
@@ -593,8 +589,7 @@ static inline int trylock_pending(struct qspinlock *lock, u32 *pval)
 		if (val & _Q_TAIL_MASK)
 			return 0;
 
-		if ((val & _Q_LOCKED_PENDING_MASK) ==
-		    (_Q_LOCKED_VAL|_Q_PENDING_VAL)) {
+		if (val == (_Q_LOCKED_VAL|_Q_PENDING_VAL)) {
 			/*
 			 * If both the lock and pending bits are set, we wait
 			 * a while to see if that either bit will be cleared.
@@ -605,9 +600,9 @@ static inline int trylock_pending(struct qspinlock *lock, u32 *pval)
 			retry--;
 			cpu_relax();
 			cpu_relax();
-			*pval = val = atomic_read(&lock->val);
+			val = atomic_read(&lock->val);
 			continue;
-		} else if ((val & _Q_LOCKED_PENDING_MASK) == _Q_PENDING_VAL) {
+		} else if (val == _Q_PENDING_VAL) {
 			/*
 			 * Pending bit is set, but not the lock bit.
 			 * Assuming that the pending bit holder is going to
@@ -615,7 +610,7 @@ static inline int trylock_pending(struct qspinlock *lock, u32 *pval)
 			 * it is better to wait than to exit at this point.
 			 */
 			cpu_relax();
-			*pval = val = atomic_read(&lock->val);
+			val = atomic_read(&lock->val);
 			continue;
 		}
 
@@ -627,7 +622,7 @@ static inline int trylock_pending(struct qspinlock *lock, u32 *pval)
 		if (old == val)
 			break;
 
-		*pval = val = old;
+		val = old;
 	}
 
 	/*
@@ -643,7 +638,7 @@ static inline int trylock_pending(struct qspinlock *lock, u32 *pval)
 	 *
 	 * this wait loop must be a load-acquire such that we match the
 	 * store-release that clears the locked bit and create lock
-	 * sequentiality; this because not all try_clear_pending_set_locked()
+	 * sequentiality; this because not all clear_pending_set_locked()
 	 * implementations imply full barriers.
 	 *
 	 * When PV qspinlock is enabled, exit the pending bit code path and
@@ -835,6 +830,10 @@ notify_next:
  * contended             :    (*,x,y) +--> (*,0,0) ---> (*,0,1) -'  :
  *   queue               :         ^--'                             :
  *
+ * The pending bit processing is in the trylock_pending() function whereas
+ * the uncontended and contended queue processing is in the
+ * queue_spin_lock_slowerpath() function.
+ *
  * This slowpath only contains the faster pending bit and trylock codes.
  * The slower queuing code is in the slowerpath function.
  */
@@ -845,7 +844,7 @@ void queue_spin_lock_slowpath(struct qspinlock *lock, u32 val)
 
 	BUILD_BUG_ON(CONFIG_NR_CPUS >= (1U << _Q_TAIL_CPU_BITS));
 
-	if (trylock_pending(lock, &val))
+	if (trylock_pending(lock, val))
 		return;	/* Lock acquired */
 
 	node = this_cpu_ptr(&qnodes[0]);
@@ -859,11 +858,11 @@ void queue_spin_lock_slowpath(struct qspinlock *lock, u32 val)
 	pv_init_vars(&node->pv, cpu_nr);
 
 	/*
-	 * We touched a (possibly) cold cacheline; attempt the trylock once
-	 * more in the hope someone let go while we weren't watching as long
-	 * as no one was queuing.
+	 * We touched a (possibly) cold cacheline in the per-cpu queue node;
+	 * attempt the trylock once more in the hope someone let go while we
+	 * weren't watching.
 	 */
-	if ((val & _Q_TAIL_MASK) || !queue_spin_trylock(lock))
+	if (!queue_spin_trylock(lock))
 		queue_spin_lock_slowerpath(lock, node, tail);
 
 	/*

[-- Attachment #3: Type: text/plain, Size: 183 bytes --]

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

  reply	other threads:[~2014-04-23 14:23 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-17 15:03 [PATCH v9 00/19] qspinlock: a 4-byte queue spinlock with PV support Waiman Long
2014-04-17 15:03 ` [PATCH v9 01/19] qspinlock: A simple generic 4-byte queue spinlock Waiman Long
2014-04-17 15:03 ` [PATCH v9 02/19] qspinlock, x86: Enable x86-64 to use " Waiman Long
2014-04-17 15:03 ` [PATCH v9 03/19] qspinlock: Add pending bit Waiman Long
2014-04-17 15:42   ` Peter Zijlstra
2014-04-17 21:20     ` Waiman Long
     [not found]     ` <5350459F.5010903@hp.com>
2014-04-18  8:13       ` Peter Zijlstra
2014-04-18 17:07         ` Waiman Long
2014-04-18  7:42   ` Ingo Molnar
2014-04-18 16:23     ` Waiman Long
2014-04-18 16:35       ` Konrad Rzeszutek Wilk
2014-04-18 18:12         ` Waiman Long
2014-04-17 15:03 ` [PATCH v9 04/19] qspinlock: Extract out the exchange of tail code word Waiman Long
2014-04-17 15:03 ` [PATCH v9 05/19] qspinlock: Optimize for smaller NR_CPUS Waiman Long
2014-04-17 15:50   ` Peter Zijlstra
2014-04-17 21:29     ` Waiman Long
2014-04-17 15:51   ` Peter Zijlstra
2014-04-17 21:33     ` Waiman Long
2014-04-17 15:56   ` Peter Zijlstra
2014-04-17 21:46     ` Waiman Long
2014-04-18  8:27       ` Peter Zijlstra
2014-04-18 17:52         ` Waiman Long
2014-04-18 19:05           ` Peter Zijlstra
2014-04-18 21:40             ` Waiman Long
2014-04-23 14:23               ` Waiman Long [this message]
2014-04-23 14:56                 ` Konrad Rzeszutek Wilk
2014-04-23 17:43                   ` Waiman Long
2014-04-23 17:55                     ` Konrad Rzeszutek Wilk
2014-04-23 22:24                       ` Waiman Long
2014-04-23 23:48                         ` Waiman Long
2014-04-17 15:58   ` Peter Zijlstra
2014-04-17 21:49     ` Waiman Long
2014-04-18  7:46       ` Ingo Molnar
2014-04-18 16:26         ` Waiman Long
2014-04-19  9:24           ` Ingo Molnar
2014-04-17 15:03 ` [PATCH v9 06/19] qspinlock: prolong the stay in the pending bit path Waiman Long
2014-04-17 15:03 ` [PATCH v9 07/19] qspinlock: Use a simple write to grab the lock, if applicable Waiman Long
2014-04-17 16:54   ` Peter Zijlstra
2014-04-17 15:04 ` [PATCH v9 08/19] qspinlock: Make a new qnode structure to support virtualization Waiman Long
2014-04-17 15:04 ` [PATCH v9 09/19] qspinlock: Prepare for unfair lock support Waiman Long
2014-04-17 15:04 ` [PATCH v9 10/19] qspinlock, x86: Allow unfair spinlock in a virtual guest Waiman Long
2014-04-17 15:04 ` [PATCH v9 11/19] qspinlock: Split the MCS queuing code into a separate slowerpath Waiman Long
2014-04-17 15:04 ` [PATCH v9 12/19] unfair qspinlock: Variable frequency lock stealing mechanism Waiman Long
2014-04-17 15:04 ` [PATCH v9 13/19] unfair qspinlock: Enable lock stealing in lock waiters Waiman Long
2014-04-17 15:04 ` [PATCH v9 14/19] pvqspinlock, x86: Rename paravirt_ticketlocks_enabled Waiman Long
2014-04-17 15:04 ` [PATCH v9 15/19] pvqspinlock, x86: Add PV data structure & methods Waiman Long
2014-04-17 15:04 ` [PATCH v9 16/19] pvqspinlock: Enable coexistence with the unfair lock Waiman Long
2014-04-17 15:04 ` [PATCH v9 17/19] pvqspinlock: Add qspinlock para-virtualization support Waiman Long
2014-04-17 15:04 ` [PATCH v9 18/19] pvqspinlock, x86: Enable PV qspinlock PV for KVM Waiman Long
2014-04-17 15:04 ` [PATCH v9 19/19] pvqspinlock, x86: Enable PV qspinlock for XEN Waiman Long
     [not found] ` <1397747051-15401-5-git-send-email-Waiman.Long@hp.com>
2014-04-17 15:49   ` [PATCH v9 04/19] qspinlock: Extract out the exchange of tail code word Peter Zijlstra
2014-04-17 21:28     ` Waiman Long
2014-04-18  8:15       ` Peter Zijlstra
2014-04-18 17:32         ` Waiman Long
2014-04-18 17:53           ` Peter Zijlstra
2014-04-18 18:13             ` Waiman Long
     [not found] ` <1397747051-15401-7-git-send-email-Waiman.Long@hp.com>
2014-04-17 16:36   ` [PATCH v9 06/19] qspinlock: prolong the stay in the pending bit path Peter Zijlstra
2014-04-18  1:46     ` Waiman Long
2014-04-18  8:33       ` Peter Zijlstra
2014-04-18 18:07         ` Waiman Long
2014-04-17 17:23 ` [PATCH v9 00/19] qspinlock: a 4-byte queue spinlock with PV support Konrad Rzeszutek Wilk
2014-04-17 17:40   ` Raghavendra K T
2014-04-18  1:48   ` Waiman Long
2014-04-18 13:18     ` Konrad Rzeszutek Wilk
2014-04-18 17:05       ` Waiman Long
     [not found]   ` <5350120C.40607@linux.vnet.ibm.com>
2014-04-18  1:50     ` Waiman Long
2014-04-27 18:09 ` Raghavendra K T
     [not found] ` <535D47D3.20202@linux.vnet.ibm.com>
2014-05-07 15:00   ` Waiman Long

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=5357CCEF.2000606@hp.com \
    --to=waiman.long@hp.com \
    --cc=chegu_vinod@hp.com \
    --cc=david.vrabel@citrix.com \
    --cc=gleb@redhat.com \
    --cc=hpa@zytor.com \
    --cc=konrad.wilk@oracle.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=oleg@redhat.com \
    --cc=paolo.bonzini@gmail.com \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=raghavendra.kt@linux.vnet.ibm.com \
    --cc=riel@redhat.com \
    --cc=scott.norton@hp.com \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=x86@kernel.org \
    --cc=xen-devel@lists.xenproject.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;
as well as URLs for NNTP newsgroup(s).