From: Guenter Roeck <linux@roeck-us.net>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Oleg Nesterov <oleg@redhat.com>,
John Stultz <john.stultz@linaro.org>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Ingo Molnar <mingo@kernel.org>,
lkml <linux-kernel@vger.kernel.org>, Tejun Heo <tj@kernel.org>,
Dmitry Shmidt <dimitrysh@google.com>,
Rom Lemarchand <romlem@google.com>,
Colin Cross <ccross@google.com>, Todd Kjos <tkjos@google.com>
Subject: Re: [v2] locking/percpu-rwsem: Optimize readers and reduce global impact
Date: Tue, 30 Aug 2016 22:21:02 -0700 [thread overview]
Message-ID: <20160831052102.GA14571@roeck-us.net> (raw)
In-Reply-To: <20160809095112.GG30192@twins.programming.kicks-ass.net>
Peter,
On Tue, Aug 09, 2016 at 11:51:12AM +0200, Peter Zijlstra wrote:
> Currently the percpu-rwsem switches to (global) atomic ops while a
> writer is waiting; which could be quite a while and slows down
> releasing the readers.
>
> This patch cures this problem by ordering the reader-state vs
> reader-count (see the comments in __percpu_down_read() and
> percpu_down_write()). This changes a global atomic op into a full
> memory barrier, which doesn't have the global cacheline contention.
>
> This also enables using the percpu-rwsem with rcu_sync disabled in order
> to bias the implementation differently, reducing the writer latency by
> adding some cost to readers.
>
> Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
> Reviewed-by: Oleg Nesterov <oleg@redhat.com>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
> include/linux/percpu-rwsem.h | 84 +++++++++++++--
> kernel/locking/percpu-rwsem.c | 228 ++++++++++++++++++++++++------------------
> 2 files changed, 206 insertions(+), 106 deletions(-)
>
> --- a/include/linux/percpu-rwsem.h
> +++ b/include/linux/percpu-rwsem.h
> @@ -10,30 +10,96 @@
>
> struct percpu_rw_semaphore {
> struct rcu_sync rss;
> - unsigned int __percpu *fast_read_ctr;
> + unsigned int __percpu *read_count;
> struct rw_semaphore rw_sem;
> - atomic_t slow_read_ctr;
> - wait_queue_head_t write_waitq;
> + wait_queue_head_t writer;
> + int readers_block;
> };
>
> -extern void percpu_down_read(struct percpu_rw_semaphore *);
> -extern int percpu_down_read_trylock(struct percpu_rw_semaphore *);
> -extern void percpu_up_read(struct percpu_rw_semaphore *);
> +extern int __percpu_down_read(struct percpu_rw_semaphore *, int);
> +extern void __percpu_up_read(struct percpu_rw_semaphore *);
> +
> +static inline void percpu_down_read(struct percpu_rw_semaphore *sem)
> +{
> + might_sleep();
> +
> + rwsem_acquire_read(&sem->rw_sem.dep_map, 0, 0, _RET_IP_);
> +
> + preempt_disable();
> + /*
> + * We are in an RCU-sched read-side critical section, so the writer
> + * cannot both change sem->state from readers_fast and start checking
> + * counters while we are here. So if we see !sem->state, we know that
> + * the writer won't be checking until we're past the preempt_enable()
> + * and that one the synchronize_sched() is done, the writer will see
> + * anything we did within this RCU-sched read-size critical section.
> + */
> + __this_cpu_inc(*sem->read_count);
> + if (unlikely(!rcu_sync_is_idle(&sem->rss)))
The call to rcu_sync_is_idle() causes the following build error when building
x86_64:allmodconfig.
ERROR: "rcu_sync_lockdep_assert" [kernel/locking/locktorture.ko] undefined!
ERROR: "rcu_sync_lockdep_assert" [fs/ext4/ext4.ko] undefined!
I think this was also reported by the 0-day build bot.
The simple fix would of course be to export rcu_sync_lockdep_assert. Before I
apply that change to the Android code (where the patch has been aplied and
the problem is seen) - do you by any chance have a better solution in mind ?
Thanks,
Guenter
next prev parent reply other threads:[~2016-08-31 5:21 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-09 9:51 [PATCH v2] locking/percpu-rwsem: Optimize readers and reduce global impact Peter Zijlstra
2016-08-09 23:47 ` John Stultz
2016-08-10 7:56 ` Peter Zijlstra
2016-08-10 17:09 ` Oleg Nesterov
[not found] ` <CAH7ZN-zXrenrbbcmvZ+biNozYe21jw6fULopG=g9-xRwWHE6nw@mail.gmail.com>
[not found] ` <5a2cc178ee03466fa3b104f8f28b44ff@NASANEXM02C.na.qualcomm.com>
2016-08-13 1:44 ` Om Dhyade
2016-08-24 21:16 ` John Stultz
2016-08-24 21:30 ` Tejun Heo
2016-08-24 22:50 ` John Stultz
2016-08-26 2:14 ` John Stultz
2016-08-26 12:51 ` Tejun Heo
2016-08-26 16:47 ` Dmitry Shmidt
2016-08-26 20:10 ` Om Dhyade
2016-08-11 16:54 ` [PATCH] cgroup: avoid synchronize_sched() in __cgroup_procs_write() Oleg Nesterov
2016-08-18 10:59 ` [tip:locking/core] locking, rcu, cgroup: Avoid " tip-bot for Peter Zijlstra
2016-08-18 13:41 ` tip-bot for Peter Zijlstra
2016-08-31 5:21 ` Guenter Roeck [this message]
2016-08-31 8:09 ` [v2] locking/percpu-rwsem: Optimize readers and reduce global impact Peter Zijlstra
2016-08-31 13:41 ` Guenter Roeck
2016-08-31 13:47 ` Guenter Roeck
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=20160831052102.GA14571@roeck-us.net \
--to=linux@roeck-us.net \
--cc=ccross@google.com \
--cc=dimitrysh@google.com \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=romlem@google.com \
--cc=tj@kernel.org \
--cc=tkjos@google.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.