lkml.org 
[lkml]   [2016]   [Apr]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:locking/rwsem] locking/rwsem: Drop explicit memory barriers
    Commit-ID:  2e927c6422fea5ce36b24b00c2c84f2e9ead31b6
    Gitweb: http://git.kernel.org/tip/2e927c6422fea5ce36b24b00c2c84f2e9ead31b6
    Author: Michal Hocko <mhocko@suse.com>
    AuthorDate: Thu, 7 Apr 2016 17:12:22 +0200
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitDate: Wed, 13 Apr 2016 10:42:18 +0200

    locking/rwsem: Drop explicit memory barriers

    sh and xtensa seem to be the only architectures which use explicit
    memory barriers for rw_semaphore operations even though they are not
    really needed because there is the full memory barrier is always implied
    by atomic_{inc,dec,add,sub}_return() resp. cmpxchg(). Remove them.

    Signed-off-by: Michal Hocko <mhocko@suse.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Chris Zankel <chris@zankel.net>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Max Filippov <jcmvbkbc@gmail.com>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
    Cc: Signed-off-by: Jason Low <jason.low2@hp.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: linux-alpha@vger.kernel.org
    Cc: linux-arch@vger.kernel.org
    Cc: linux-ia64@vger.kernel.org
    Cc: linux-s390@vger.kernel.org
    Cc: linux-sh@vger.kernel.org
    Cc: linux-xtensa@linux-xtensa.org
    Cc: sparclinux@vger.kernel.org
    Link: http://lkml.kernel.org/r/1460041951-22347-3-git-send-email-mhocko@kernel.org
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    arch/sh/include/asm/rwsem.h | 14 ++------------
    arch/xtensa/include/asm/rwsem.h | 14 ++------------
    2 files changed, 4 insertions(+), 24 deletions(-)

    diff --git a/arch/sh/include/asm/rwsem.h b/arch/sh/include/asm/rwsem.h
    index a5104be..f6c951c 100644
    --- a/arch/sh/include/asm/rwsem.h
    +++ b/arch/sh/include/asm/rwsem.h
    @@ -24,9 +24,7 @@
    */
    static inline void __down_read(struct rw_semaphore *sem)
    {
    - if (atomic_inc_return((atomic_t *)(&sem->count)) > 0)
    - smp_wmb();
    - else
    + if (atomic_inc_return((atomic_t *)(&sem->count)) <= 0)
    rwsem_down_read_failed(sem);
    }

    @@ -37,7 +35,6 @@ static inline int __down_read_trylock(struct rw_semaphore *sem)
    while ((tmp = sem->count) >= 0) {
    if (tmp == cmpxchg(&sem->count, tmp,
    tmp + RWSEM_ACTIVE_READ_BIAS)) {
    - smp_wmb();
    return 1;
    }
    }
    @@ -53,9 +50,7 @@ static inline void __down_write(struct rw_semaphore *sem)

    tmp = atomic_add_return(RWSEM_ACTIVE_WRITE_BIAS,
    (atomic_t *)(&sem->count));
    - if (tmp == RWSEM_ACTIVE_WRITE_BIAS)
    - smp_wmb();
    - else
    + if (tmp != RWSEM_ACTIVE_WRITE_BIAS)
    rwsem_down_write_failed(sem);
    }

    @@ -65,7 +60,6 @@ static inline int __down_write_trylock(struct rw_semaphore *sem)

    tmp = cmpxchg(&sem->count, RWSEM_UNLOCKED_VALUE,
    RWSEM_ACTIVE_WRITE_BIAS);
    - smp_wmb();
    return tmp == RWSEM_UNLOCKED_VALUE;
    }

    @@ -76,7 +70,6 @@ static inline void __up_read(struct rw_semaphore *sem)
    {
    int tmp;

    - smp_wmb();
    tmp = atomic_dec_return((atomic_t *)(&sem->count));
    if (tmp < -1 && (tmp & RWSEM_ACTIVE_MASK) == 0)
    rwsem_wake(sem);
    @@ -87,7 +80,6 @@ static inline void __up_read(struct rw_semaphore *sem)
    */
    static inline void __up_write(struct rw_semaphore *sem)
    {
    - smp_wmb();
    if (atomic_sub_return(RWSEM_ACTIVE_WRITE_BIAS,
    (atomic_t *)(&sem->count)) < 0)
    rwsem_wake(sem);
    @@ -108,7 +100,6 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
    {
    int tmp;

    - smp_wmb();
    tmp = atomic_add_return(-RWSEM_WAITING_BIAS, (atomic_t *)(&sem->count));
    if (tmp < 0)
    rwsem_downgrade_wake(sem);
    @@ -119,7 +110,6 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
    */
    static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem)
    {
    - smp_mb();
    return atomic_add_return(delta, (atomic_t *)(&sem->count));
    }

    diff --git a/arch/xtensa/include/asm/rwsem.h b/arch/xtensa/include/asm/rwsem.h
    index 249619e..593483f 100644
    --- a/arch/xtensa/include/asm/rwsem.h
    +++ b/arch/xtensa/include/asm/rwsem.h
    @@ -29,9 +29,7 @@
    */
    static inline void __down_read(struct rw_semaphore *sem)
    {
    - if (atomic_add_return(1,(atomic_t *)(&sem->count)) > 0)
    - smp_wmb();
    - else
    + if (atomic_add_return(1,(atomic_t *)(&sem->count)) <= 0)
    rwsem_down_read_failed(sem);
    }

    @@ -42,7 +40,6 @@ static inline int __down_read_trylock(struct rw_semaphore *sem)
    while ((tmp = sem->count) >= 0) {
    if (tmp == cmpxchg(&sem->count, tmp,
    tmp + RWSEM_ACTIVE_READ_BIAS)) {
    - smp_wmb();
    return 1;
    }
    }
    @@ -58,9 +55,7 @@ static inline void __down_write(struct rw_semaphore *sem)

    tmp = atomic_add_return(RWSEM_ACTIVE_WRITE_BIAS,
    (atomic_t *)(&sem->count));
    - if (tmp == RWSEM_ACTIVE_WRITE_BIAS)
    - smp_wmb();
    - else
    + if (tmp != RWSEM_ACTIVE_WRITE_BIAS)
    rwsem_down_write_failed(sem);
    }

    @@ -70,7 +65,6 @@ static inline int __down_write_trylock(struct rw_semaphore *sem)

    tmp = cmpxchg(&sem->count, RWSEM_UNLOCKED_VALUE,
    RWSEM_ACTIVE_WRITE_BIAS);
    - smp_wmb();
    return tmp == RWSEM_UNLOCKED_VALUE;
    }

    @@ -81,7 +75,6 @@ static inline void __up_read(struct rw_semaphore *sem)
    {
    int tmp;

    - smp_wmb();
    tmp = atomic_sub_return(1,(atomic_t *)(&sem->count));
    if (tmp < -1 && (tmp & RWSEM_ACTIVE_MASK) == 0)
    rwsem_wake(sem);
    @@ -92,7 +85,6 @@ static inline void __up_read(struct rw_semaphore *sem)
    */
    static inline void __up_write(struct rw_semaphore *sem)
    {
    - smp_wmb();
    if (atomic_sub_return(RWSEM_ACTIVE_WRITE_BIAS,
    (atomic_t *)(&sem->count)) < 0)
    rwsem_wake(sem);
    @@ -113,7 +105,6 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
    {
    int tmp;

    - smp_wmb();
    tmp = atomic_add_return(-RWSEM_WAITING_BIAS, (atomic_t *)(&sem->count));
    if (tmp < 0)
    rwsem_downgrade_wake(sem);
    @@ -124,7 +115,6 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
    */
    static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem)
    {
    - smp_mb();
    return atomic_add_return(delta, (atomic_t *)(&sem->count));
    }

    \
     
     \ /
      Last update: 2016-04-13 14:01    [W:2.894 / U:0.272 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site