All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Hurley <peter@hurleysoftware.com>
To: Michel Lespinasse <walken@google.com>
Cc: Alex Shi <alex.shi@intel.com>, Ingo Molnar <mingo@kernel.org>,
	David Howells <dhowells@redhat.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Thomas Gleixner <tglx@linutronix.de>,
	Yuanhan Liu <yuanhan.liu@linux.intel.com>,
	Rik van Riel <riel@redhat.com>,
	Dave Chinner <david@fromorbit.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 07/13] rwsem: use cmpxchg for trying to steal write lock
Date: Thu, 28 Mar 2013 12:44:06 -0400	[thread overview]
Message-ID: <1364489046.3559.14.camel@thor.lan> (raw)
In-Reply-To: <1363344869-15732-8-git-send-email-walken@google.com>

On Fri, 2013-03-15 at 03:54 -0700, Michel Lespinasse wrote:
> Using rwsem_atomic_update to try stealing the write lock forced us to
> undo the adjustment in the failure path. We can have simpler and faster
> code by using cmpxchg instead.
> 
> Signed-off-by: Michel Lespinasse <walken@google.com>
> 
> ---
>  lib/rwsem.c | 26 ++++++--------------------
>  1 file changed, 6 insertions(+), 20 deletions(-)
> 
> diff --git a/lib/rwsem.c b/lib/rwsem.c
> index 2360bf204098..64c2dc007be2 100644
> --- a/lib/rwsem.c
> +++ b/lib/rwsem.c
> @@ -142,25 +142,6 @@ __rwsem_do_wake(struct rw_semaphore *sem, int wake_type)
>  	return sem;
>  }
>  
> -/* Try to get write sem, caller holds sem->wait_lock: */
> -static int try_get_writer_sem(struct rw_semaphore *sem)
> -{
> -	long oldcount, adjustment;
> -
> -	adjustment = RWSEM_ACTIVE_WRITE_BIAS;
> -	if (list_is_singular(&sem->wait_list))
> -		adjustment -= RWSEM_WAITING_BIAS;
> -
> -try_again_write:
> -	oldcount = rwsem_atomic_update(adjustment, sem) - adjustment;
> -	if (!(oldcount & RWSEM_ACTIVE_MASK))
> -		return 1;
> -	/* some one grabbed the sem already */
> -	if (rwsem_atomic_update(-adjustment, sem) & RWSEM_ACTIVE_MASK)
> -		return 0;
> -	goto try_again_write;
> -}
> -
>  /*
>   * wait for the read lock to be granted
>   */
> @@ -236,7 +217,12 @@ struct rw_semaphore __sched *rwsem_down_write_failed(struct rw_semaphore *sem)
>  	while (true) {
>  		set_task_state(tsk, TASK_UNINTERRUPTIBLE);
>  
> -		if (try_get_writer_sem(sem))
> +		/* Try acquiring the write lock. */
> +		count = RWSEM_ACTIVE_WRITE_BIAS;
> +		if (!list_is_singular(&sem->wait_list))
> +			count += RWSEM_WAITING_BIAS;
> +		if (cmpxchg(&sem->count, RWSEM_WAITING_BIAS, count) ==
> +							RWSEM_WAITING_BIAS)

This is just my opinion but I think this is way more readable if this
stays in try_get_writer_sem() and you change that to static inline
rather than inlining here. Especially because 9/13 adds a scope.

>  			break;
>  
>  		raw_spin_unlock_irq(&sem->wait_lock);



  reply	other threads:[~2013-03-28 16:44 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-15 10:54 [PATCH v2 00/13] rwsem fast-path write lock stealing Michel Lespinasse
2013-03-15 10:54 ` [PATCH v2 01/13] rwsem: make the waiter type an enumeration rather than a bitmask Michel Lespinasse
2013-03-28 18:59   ` Rik van Riel
2013-03-15 10:54 ` [PATCH v2 02/13] rwsem: shorter spinlocked section in rwsem_down_failed_common() Michel Lespinasse
2013-03-28 16:21   ` Peter Hurley
2013-03-28 19:03   ` Rik van Riel
2013-03-15 10:54 ` [PATCH v2 03/13] rwsem: move rwsem_down_failed_common code into rwsem_down_{read,write}_failed Michel Lespinasse
2013-03-28 17:05   ` Peter Hurley
2013-04-27 21:21     ` Davidlohr Bueso
2013-03-28 19:08   ` Rik van Riel
2013-03-15 10:54 ` [PATCH v2 04/13] rwsem: simplify rwsem_down_read_failed Michel Lespinasse
2013-03-28 19:22   ` Rik van Riel
2013-03-15 10:54 ` [PATCH v2 05/13] rwsem: simplify rwsem_down_write_failed Michel Lespinasse
2013-03-28 20:33   ` Rik van Riel
2013-03-15 10:54 ` [PATCH v2 06/13] rwsem: more agressive lock stealing in rwsem_down_write_failed Michel Lespinasse
2013-03-28 20:54   ` Rik van Riel
2013-03-15 10:54 ` [PATCH v2 07/13] rwsem: use cmpxchg for trying to steal write lock Michel Lespinasse
2013-03-28 16:44   ` Peter Hurley [this message]
2013-03-28 20:59   ` Rik van Riel
2013-03-15 10:54 ` [PATCH v2 08/13] rwsem: avoid taking wait_lock in rwsem_down_write_failed Michel Lespinasse
2013-03-28 21:01   ` Rik van Riel
2013-03-15 10:54 ` [PATCH v2 09/13] rwsem: skip initial trylock " Michel Lespinasse
2013-03-28 21:16   ` Rik van Riel
2013-03-15 10:54 ` [PATCH v2 10/13] rwsem: simplify __rwsem_do_wake Michel Lespinasse
2013-03-28 16:51   ` Peter Hurley
2013-03-15 10:54 ` [PATCH v2 11/13] rwsem: implement support for write lock stealing on the fastpath Michel Lespinasse
2013-03-28 16:17   ` Peter Hurley
2013-03-15 10:54 ` [PATCH v2 12/13] rwsem: do not block readers at head of queue if other readers are active Michel Lespinasse
2013-03-28 17:25   ` Peter Hurley
2013-03-15 10:54 ` [PATCH v2 13/13] x86 rwsem: avoid taking slow path when stealing write lock Michel Lespinasse
2013-03-28 19:19 ` [PATCH v2 00/13] rwsem fast-path write lock stealing Peter Hurley
     [not found] ` <1367097352.1782.14.camel@buesod1.americas.hpqcorp.net>
2013-04-27 23:47   ` Michel Lespinasse
2013-05-07  9:18   ` Michel Lespinasse

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=1364489046.3559.14.camel@thor.lan \
    --to=peter@hurleysoftware.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akpm@linux-foundation.org \
    --cc=alex.shi@intel.com \
    --cc=david@fromorbit.com \
    --cc=dhowells@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=riel@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=walken@google.com \
    --cc=yuanhan.liu@linux.intel.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.