From: Waiman Long <waiman.long@hpe.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>,
linux-kernel@vger.kernel.org, x86@kernel.org,
linux-alpha@vger.kernel.org, linux-ia64@vger.kernel.org,
linux-s390@vger.kernel.org, linux-arch@vger.kernel.org,
Davidlohr Bueso <dave@stgolabs.net>,
Jason Low <jason.low2@hp.com>, Dave Chinner <david@fromorbit.com>,
Scott J Norton <scott.norton@hpe.com>,
Douglas Hatch <doug.hatch@hpe.com>
Subject: Re: [RFC PATCH-tip v2 3/6] locking/rwsem: Enable count-based spinning on reader
Date: Wed, 15 Jun 2016 15:28:03 -0400 [thread overview]
Message-ID: <5761AC43.5080707@hpe.com> (raw)
In-Reply-To: <20160615173830.GR30921@twins.programming.kicks-ass.net>
On 06/15/2016 01:38 PM, Peter Zijlstra wrote:
> On Tue, Jun 14, 2016 at 06:48:06PM -0400, Waiman Long wrote:
>> static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> {
>> - bool taken = false;
>> + bool taken = false, can_spin;
> I would place the variables without assignment first.
Sure, easy change.
>
>> + int loopcnt;
>>
>> preempt_disable();
>>
>> @@ -409,6 +412,8 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> if (!osq_lock(&sem->osq))
>> goto done;
>>
>> + loopcnt = sem->rspin_enabled ? RWSEM_RSPIN_THRESHOLD : 0;
>> +
>> /*
>> * Optimistically spin on the owner field and attempt to acquire the
>> * lock whenever the owner changes. Spinning will be stopped when:
>> @@ -416,7 +421,7 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> * 2) readers own the lock as we can't determine if they are
>> * actively running or not.
>> */
>> - while (rwsem_spin_on_owner(sem)) {
>> + while ((can_spin = rwsem_spin_on_owner(sem)) || loopcnt) {
>> /*
>> * Try to acquire the lock
>> */
>> @@ -425,13 +430,16 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> break;
>> }
>>
>> + if (!can_spin&& loopcnt)
>> + loopcnt--;
> This seems to suggest 'can_spin' is a bad name, because if we cannot
> spin, we do in fact spin anyway?
>
> Maybe call it write_spin or something, which makes it clear that if its
> not a write spin we'll do a read spin?
I am fine with the write_spin name.
>
> Also, isn't this the wrong level to do loopcnt at?
> rwsem_spin_on_owner() can have spend any amount of cycles spinning. So
> you're not counting loops of similar unit.
The loopcnt does not include time spinning on writer. It will be
decremented only if the lock is owned by reader (can_spin == false). I
will clarify that with additional comments.
>> + /*
>> + * Was owner a reader?
>> + */
>> + if (rwsem_owner_is_reader(sem->owner)) {
>> + /*
>> + * Update rspin_enabled for reader spinning
> full stop and newline?
Sure.
>
>> + * Increment by 1 if successfully& decrement by 8 if
>> + * unsuccessful.
> This is bloody obvious from the code, explain why, not what the code
> does.
Will clarify the comment.
>> The decrement amount is kind of arbitrary
>> + * and can be adjusted if necessary.
>> + */
>> + if (taken&& (sem->rspin_enabled< RWSEM_RSPIN_ENABLED_MAX))
>> + sem->rspin_enabled++;
>> + else if (!taken)
>> + sem->rspin_enabled = (sem->rspin_enabled>= 8)
>> + ? sem->rspin_enabled - 8 : 0;
> This is unreadable and against coding style.
I will fix the coding style problem.
Cheers,
Longman
WARNING: multiple messages have this Message-ID (diff)
From: Waiman Long <waiman.long@hpe.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>,
linux-kernel@vger.kernel.org, x86@kernel.org,
linux-alpha@vger.kernel.org, linux-ia64@vger.kernel.org,
linux-s390@vger.kernel.org, linux-arch@vger.kernel.org,
Davidlohr Bueso <dave@stgolabs.net>,
Jason Low <jason.low2@hp.com>, Dave Chinner <david@fromorbit.com>,
Scott J Norton <scott.norton@hpe.com>,
Douglas Hatch <doug.hatch@hpe.com>
Subject: Re: [RFC PATCH-tip v2 3/6] locking/rwsem: Enable count-based spinning on reader
Date: Wed, 15 Jun 2016 19:28:03 +0000 [thread overview]
Message-ID: <5761AC43.5080707@hpe.com> (raw)
In-Reply-To: <20160615173830.GR30921@twins.programming.kicks-ass.net>
On 06/15/2016 01:38 PM, Peter Zijlstra wrote:
> On Tue, Jun 14, 2016 at 06:48:06PM -0400, Waiman Long wrote:
>> static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> {
>> - bool taken = false;
>> + bool taken = false, can_spin;
> I would place the variables without assignment first.
Sure, easy change.
>
>> + int loopcnt;
>>
>> preempt_disable();
>>
>> @@ -409,6 +412,8 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> if (!osq_lock(&sem->osq))
>> goto done;
>>
>> + loopcnt = sem->rspin_enabled ? RWSEM_RSPIN_THRESHOLD : 0;
>> +
>> /*
>> * Optimistically spin on the owner field and attempt to acquire the
>> * lock whenever the owner changes. Spinning will be stopped when:
>> @@ -416,7 +421,7 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> * 2) readers own the lock as we can't determine if they are
>> * actively running or not.
>> */
>> - while (rwsem_spin_on_owner(sem)) {
>> + while ((can_spin = rwsem_spin_on_owner(sem)) || loopcnt) {
>> /*
>> * Try to acquire the lock
>> */
>> @@ -425,13 +430,16 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> break;
>> }
>>
>> + if (!can_spin&& loopcnt)
>> + loopcnt--;
> This seems to suggest 'can_spin' is a bad name, because if we cannot
> spin, we do in fact spin anyway?
>
> Maybe call it write_spin or something, which makes it clear that if its
> not a write spin we'll do a read spin?
I am fine with the write_spin name.
>
> Also, isn't this the wrong level to do loopcnt at?
> rwsem_spin_on_owner() can have spend any amount of cycles spinning. So
> you're not counting loops of similar unit.
The loopcnt does not include time spinning on writer. It will be
decremented only if the lock is owned by reader (can_spin = false). I
will clarify that with additional comments.
>> + /*
>> + * Was owner a reader?
>> + */
>> + if (rwsem_owner_is_reader(sem->owner)) {
>> + /*
>> + * Update rspin_enabled for reader spinning
> full stop and newline?
Sure.
>
>> + * Increment by 1 if successfully& decrement by 8 if
>> + * unsuccessful.
> This is bloody obvious from the code, explain why, not what the code
> does.
Will clarify the comment.
>> The decrement amount is kind of arbitrary
>> + * and can be adjusted if necessary.
>> + */
>> + if (taken&& (sem->rspin_enabled< RWSEM_RSPIN_ENABLED_MAX))
>> + sem->rspin_enabled++;
>> + else if (!taken)
>> + sem->rspin_enabled = (sem->rspin_enabled>= 8)
>> + ? sem->rspin_enabled - 8 : 0;
> This is unreadable and against coding style.
I will fix the coding style problem.
Cheers,
Longman
WARNING: multiple messages have this Message-ID (diff)
From: Waiman Long <waiman.long@hpe.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>, <linux-kernel@vger.kernel.org>,
<x86@kernel.org>, <linux-alpha@vger.kernel.org>,
<linux-ia64@vger.kernel.org>, <linux-s390@vger.kernel.org>,
<linux-arch@vger.kernel.org>, Davidlohr Bueso <dave@stgolabs.net>,
Jason Low <jason.low2@hp.com>, Dave Chinner <david@fromorbit.com>,
Scott J Norton <scott.norton@hpe.com>,
Douglas Hatch <doug.hatch@hpe.com>
Subject: Re: [RFC PATCH-tip v2 3/6] locking/rwsem: Enable count-based spinning on reader
Date: Wed, 15 Jun 2016 15:28:03 -0400 [thread overview]
Message-ID: <5761AC43.5080707@hpe.com> (raw)
In-Reply-To: <20160615173830.GR30921@twins.programming.kicks-ass.net>
On 06/15/2016 01:38 PM, Peter Zijlstra wrote:
> On Tue, Jun 14, 2016 at 06:48:06PM -0400, Waiman Long wrote:
>> static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> {
>> - bool taken = false;
>> + bool taken = false, can_spin;
> I would place the variables without assignment first.
Sure, easy change.
>
>> + int loopcnt;
>>
>> preempt_disable();
>>
>> @@ -409,6 +412,8 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> if (!osq_lock(&sem->osq))
>> goto done;
>>
>> + loopcnt = sem->rspin_enabled ? RWSEM_RSPIN_THRESHOLD : 0;
>> +
>> /*
>> * Optimistically spin on the owner field and attempt to acquire the
>> * lock whenever the owner changes. Spinning will be stopped when:
>> @@ -416,7 +421,7 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> * 2) readers own the lock as we can't determine if they are
>> * actively running or not.
>> */
>> - while (rwsem_spin_on_owner(sem)) {
>> + while ((can_spin = rwsem_spin_on_owner(sem)) || loopcnt) {
>> /*
>> * Try to acquire the lock
>> */
>> @@ -425,13 +430,16 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
>> break;
>> }
>>
>> + if (!can_spin&& loopcnt)
>> + loopcnt--;
> This seems to suggest 'can_spin' is a bad name, because if we cannot
> spin, we do in fact spin anyway?
>
> Maybe call it write_spin or something, which makes it clear that if its
> not a write spin we'll do a read spin?
I am fine with the write_spin name.
>
> Also, isn't this the wrong level to do loopcnt at?
> rwsem_spin_on_owner() can have spend any amount of cycles spinning. So
> you're not counting loops of similar unit.
The loopcnt does not include time spinning on writer. It will be
decremented only if the lock is owned by reader (can_spin == false). I
will clarify that with additional comments.
>> + /*
>> + * Was owner a reader?
>> + */
>> + if (rwsem_owner_is_reader(sem->owner)) {
>> + /*
>> + * Update rspin_enabled for reader spinning
> full stop and newline?
Sure.
>
>> + * Increment by 1 if successfully& decrement by 8 if
>> + * unsuccessful.
> This is bloody obvious from the code, explain why, not what the code
> does.
Will clarify the comment.
>> The decrement amount is kind of arbitrary
>> + * and can be adjusted if necessary.
>> + */
>> + if (taken&& (sem->rspin_enabled< RWSEM_RSPIN_ENABLED_MAX))
>> + sem->rspin_enabled++;
>> + else if (!taken)
>> + sem->rspin_enabled = (sem->rspin_enabled>= 8)
>> + ? sem->rspin_enabled - 8 : 0;
> This is unreadable and against coding style.
I will fix the coding style problem.
Cheers,
Longman
next prev parent reply other threads:[~2016-06-15 19:28 UTC|newest]
Thread overview: 101+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-14 22:48 [RFC PATCH-tip v2 0/6] locking/rwsem: Enable reader optimistic spinning Waiman Long
2016-06-14 22:48 ` Waiman Long
2016-06-14 22:48 ` [RFC PATCH-tip v2 1/6] locking/osq: Make lock/unlock proper acquire/release barrier Waiman Long
2016-06-14 22:48 ` Waiman Long
2016-06-15 8:04 ` Boqun Feng
2016-06-15 8:04 ` Boqun Feng
2016-06-15 17:18 ` Peter Zijlstra
2016-06-15 17:18 ` Peter Zijlstra
2016-06-15 19:01 ` Waiman Long
2016-06-15 19:01 ` Waiman Long
2016-06-15 19:01 ` Waiman Long
2016-06-16 2:19 ` Boqun Feng
2016-06-16 2:19 ` Boqun Feng
2016-06-16 10:16 ` Will Deacon
2016-06-16 10:16 ` Will Deacon
2016-06-16 21:35 ` Waiman Long
2016-06-16 21:35 ` Waiman Long
2016-06-16 21:35 ` Waiman Long
2016-06-17 0:48 ` Boqun Feng
2016-06-17 0:48 ` Boqun Feng
2016-06-17 15:26 ` Waiman Long
2016-06-17 15:26 ` Waiman Long
2016-06-17 15:26 ` Waiman Long
2016-06-17 15:45 ` Will Deacon
2016-06-17 15:45 ` Will Deacon
2016-06-17 18:17 ` Waiman Long
2016-06-17 18:17 ` Waiman Long
2016-06-17 18:17 ` Waiman Long
2016-06-18 8:46 ` Boqun Feng
2016-06-18 8:46 ` Boqun Feng
2016-06-20 7:59 ` Will Deacon
2016-06-20 7:59 ` Will Deacon
2016-06-15 16:56 ` Davidlohr Bueso
2016-06-15 16:56 ` Davidlohr Bueso
2016-06-15 17:12 ` Peter Zijlstra
2016-06-15 17:12 ` Peter Zijlstra
2016-06-15 18:27 ` Davidlohr Bueso
2016-06-15 18:27 ` Davidlohr Bueso
2016-06-15 18:40 ` Peter Zijlstra
2016-06-15 18:40 ` Peter Zijlstra
2016-06-15 18:56 ` Davidlohr Bueso
2016-06-15 18:56 ` Davidlohr Bueso
2016-06-17 1:11 ` Davidlohr Bueso
2016-06-17 1:11 ` Davidlohr Bueso
2016-06-17 14:28 ` Waiman Long
2016-06-17 14:28 ` Waiman Long
2016-06-17 14:28 ` Waiman Long
2016-06-17 16:29 ` Davidlohr Bueso
2016-06-17 16:29 ` Davidlohr Bueso
2016-06-17 16:46 ` Davidlohr Bueso
2016-06-17 16:46 ` Davidlohr Bueso
2016-06-15 19:08 ` Waiman Long
2016-06-15 19:08 ` Waiman Long
2016-06-15 19:08 ` Waiman Long
2016-06-15 20:04 ` Waiman Long
2016-06-15 20:04 ` Waiman Long
2016-06-15 20:04 ` Waiman Long
2016-06-15 21:59 ` Peter Zijlstra
2016-06-15 21:59 ` Peter Zijlstra
2016-06-14 22:48 ` [RFC PATCH-tip v2 2/6] locking/rwsem: Stop active read lock ASAP Waiman Long
2016-06-14 22:48 ` Waiman Long
2016-06-15 17:22 ` Peter Zijlstra
2016-06-15 17:22 ` Peter Zijlstra
2016-06-15 19:17 ` Waiman Long
2016-06-15 19:17 ` Waiman Long
2016-06-15 19:17 ` Waiman Long
2016-06-16 2:14 ` Davidlohr Bueso
2016-06-16 2:14 ` Davidlohr Bueso
2016-06-16 21:25 ` Waiman Long
2016-06-16 21:25 ` Waiman Long
2016-06-16 21:25 ` Waiman Long
2016-06-14 22:48 ` [RFC PATCH-tip v2 3/6] locking/rwsem: Enable count-based spinning on reader Waiman Long
2016-06-14 22:48 ` Waiman Long
2016-06-15 17:38 ` Peter Zijlstra
2016-06-15 17:38 ` Peter Zijlstra
2016-06-15 19:28 ` Waiman Long [this message]
2016-06-15 19:28 ` Waiman Long
2016-06-15 19:28 ` Waiman Long
2016-06-14 22:48 ` [RFC PATCH-tip v2 4/6] locking/rwsem: move down rwsem_down_read_failed function Waiman Long
2016-06-14 22:48 ` Waiman Long
2016-06-15 17:40 ` Peter Zijlstra
2016-06-15 17:40 ` Peter Zijlstra
2016-06-15 19:21 ` Waiman Long
2016-06-15 19:21 ` Waiman Long
2016-06-15 19:21 ` Waiman Long
2016-06-14 22:48 ` [RFC PATCH-tip v2 5/6] locking/rwsem: Change RWSEM_WAITING_BIAS for better disambiguation Waiman Long
2016-06-14 22:48 ` Waiman Long
2016-06-15 17:43 ` Peter Zijlstra
2016-06-15 17:43 ` Peter Zijlstra
2016-06-15 19:31 ` Waiman Long
2016-06-15 19:31 ` Waiman Long
2016-06-15 19:31 ` Waiman Long
2016-06-15 21:57 ` Peter Zijlstra
2016-06-15 21:57 ` Peter Zijlstra
2016-06-15 17:45 ` Peter Zijlstra
2016-06-15 17:45 ` Peter Zijlstra
2016-06-15 19:35 ` Waiman Long
2016-06-15 19:35 ` Waiman Long
2016-06-15 19:35 ` Waiman Long
2016-06-14 22:48 ` [RFC PATCH-tip v2 6/6] locking/rwsem: Enable spinning readers Waiman Long
2016-06-14 22:48 ` 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=5761AC43.5080707@hpe.com \
--to=waiman.long@hpe.com \
--cc=dave@stgolabs.net \
--cc=david@fromorbit.com \
--cc=doug.hatch@hpe.com \
--cc=jason.low2@hp.com \
--cc=linux-alpha@vger.kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-ia64@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=scott.norton@hpe.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.