Messages in this thread | | | Date | Thu, 14 Jul 2016 20:09:52 +0200 | From | Oleg Nesterov <> | Subject | Re: Severe performance regression w/ 4.4+ on Android due to cgroup locking changes |
| |
On 07/14, Peter Zijlstra wrote: > > The below is a compile tested only first draft so far. I'll go give it > some runtime next.
So I will wait for the new version, but at first glance this matches the code I already reviewed in the past (at least, tried hard to review ;) and it looks correct.
Just a couple of almost cosmetic nits, feel free to ignore.
> --- a/include/linux/percpu-rwsem.h > +++ b/include/linux/percpu-rwsem.h > @@ -10,29 +10,107 @@ > > struct percpu_rw_semaphore { > struct rcu_sync rss; > - unsigned int __percpu *fast_read_ctr; > + unsigned int __percpu *refcount; > struct rw_semaphore rw_sem; > - atomic_t slow_read_ctr; > - wait_queue_head_t write_waitq; > + wait_queue_head_t writer; > + int state; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I think that this "int state" and "enum { readers_slow, readers_block }" just add a bit of complication/confusion.
All we need is the simple "bool readers_block" in percpu_rw_semaphore, no?
> +void percpu_down_write(struct percpu_rw_semaphore *sem) > { > + down_write(&sem->rw_sem); > + > + /* Notify readers to take the slow path. */ > + rcu_sync_enter(&sem->rss);
I'd suggest to call rcu_sync_enter() before down_write(). This can help when we wait for another writer which holds this lock.
Oleg.
| |