From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933635AbbFVMZg (ORCPT ); Mon, 22 Jun 2015 08:25:36 -0400 Received: from bombadil.infradead.org ([198.137.202.9]:37090 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933451AbbFVMYk (ORCPT ); Mon, 22 Jun 2015 08:24:40 -0400 Message-Id: <20150622122256.161153855@infradead.org> User-Agent: quilt/0.61-1 Date: Mon, 22 Jun 2015 14:16:29 +0200 From: Peter Zijlstra To: oleg@redhat.com, paulmck@linux.vnet.ibm.com Cc: tj@kernel.org, mingo@redhat.com, linux-kernel@vger.kernel.org, der.herr@hofr.at, peterz@infradead.org, dave@stgolabs.net, riel@redhat.com, viro@ZenIV.linux.org.uk, torvalds@linux-foundation.org Subject: [RFC][PATCH 06/13] percpu-rwsem: Provide percpu_down_read_trylock() References: <20150622121623.291363374@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline; filename=peterz-percpu-rwsem-trydown.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Signed-off-by: Peter Zijlstra (Intel) --- include/linux/percpu-rwsem.h | 17 +++++++++++++++++ kernel/locking/percpu-rwsem.c | 12 ++++++++++++ 2 files changed, 29 insertions(+) --- a/include/linux/percpu-rwsem.h +++ b/include/linux/percpu-rwsem.h @@ -17,6 +17,7 @@ struct percpu_rw_semaphore { }; extern void __percpu_down_read(struct percpu_rw_semaphore *); +extern bool __percpu_down_read_trylock(struct percpu_rw_semaphore *); extern void __percpu_up_read(struct percpu_rw_semaphore *); static inline void percpu_down_read(struct percpu_rw_semaphore *sem) @@ -45,6 +46,22 @@ static inline void percpu_down_read(stru */ } +static inline bool percpu_down_read_trylock(struct percpu_rw_semaphore *sem) +{ + bool ret = true; + + preempt_disable(); + __this_cpu_inc(*sem->refcount); + if (unlikely(!rcu_sync_is_idle(&sem->rss))) + ret = __percpu_down_read_trylock(sem); + preempt_enable(); + + if (ret) + rwsem_acquire_read(&sem->rw_sem.dep_map, 0, 1, _RET_IP_); + + return ret; +} + static inline void percpu_up_read(struct percpu_rw_semaphore *sem) { /* --- a/kernel/locking/percpu-rwsem.c +++ b/kernel/locking/percpu-rwsem.c @@ -80,6 +80,18 @@ void __percpu_down_read(struct percpu_rw preempt_disable(); } +bool __percpu_down_read_trylock(struct percpu_rw_semaphore *sem) +{ + smp_mb(); /* A matches D */ + + if (likely(smp_load_acquire(&sem->state) != readers_block)) + return true; + + __percpu_up_read(sem); + + return false; +} + void __percpu_up_read(struct percpu_rw_semaphore *sem) { smp_mb(); /* B matches C */ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/